@@ -34,6 +34,7 @@ import (
3434 "github.com/prometheus/client_golang/prometheus"
3535 api_v1 "k8s.io/api/core/v1"
3636 meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
37+ pkg_runtime "k8s.io/apimachinery/pkg/runtime"
3738 util_version "k8s.io/apimachinery/pkg/util/version"
3839 "k8s.io/client-go/dynamic"
3940 "k8s.io/client-go/kubernetes"
@@ -75,6 +76,8 @@ const (
7576 appProtectVersionPath = "/opt/app_protect/RELEASE"
7677 appProtectv4BundleFolder = "/etc/nginx/waf/bundles/"
7778 appProtectv5BundleFolder = "/etc/app_protect/bundles/"
79+ fatalEventFlushTime = 200 * time .Millisecond
80+ secretErrorReason = "SecretError"
7881)
7982
8083func main () {
@@ -89,9 +92,14 @@ func main() {
8992
9093 buildOS := os .Getenv ("BUILD_OS" )
9194 controllerNamespace := os .Getenv ("POD_NAMESPACE" )
95+ podName := os .Getenv ("POD_NAME" )
9296
9397 config , kubeClient := mustCreateConfigAndKubeClient (ctx )
9498 mustValidateKubernetesVersionInfo (ctx , kubeClient )
99+ pod , err := kubeClient .CoreV1 ().Pods (controllerNamespace ).Get (context .TODO (), podName , meta_v1.GetOptions {})
100+ if err != nil {
101+ nl .Fatalf (l , "Failed to get pod: %v" , err )
102+ }
95103 eventBroadcaster := record .NewBroadcaster ()
96104 eventBroadcaster .StartLogging (func (format string , args ... interface {}) {
97105 nl .Infof (l , format , args ... )
@@ -101,6 +109,7 @@ func main() {
101109 })
102110 eventRecorder := eventBroadcaster .NewRecorder (scheme .Scheme ,
103111 api_v1.EventSource {Component : "nginx-ingress-controller" })
112+ defer eventBroadcaster .Shutdown ()
104113 mustValidateIngressClass (ctx , kubeClient )
105114
106115 checkNamespaces (ctx , kubeClient )
@@ -143,12 +152,17 @@ func main() {
143152
144153 templateExecutor , templateExecutorV2 := createTemplateExecutors (ctx )
145154
146- sslRejectHandshake := processDefaultServerSecret (ctx , kubeClient , nginxManager )
147-
148- isWildcardEnabled := processWildcardSecret (ctx , kubeClient , nginxManager )
155+ sslRejectHandshake , err := processDefaultServerSecret (kubeClient , nginxManager )
156+ if err != nil {
157+ logEventAndExit (ctx , eventRecorder , pod , secretErrorReason , err )
158+ }
149159
150160 staticSSLPath := nginxManager .GetSecretsDir ()
151161
162+ isWildcardEnabled , err := processWildcardSecret (kubeClient , nginxManager )
163+ if err != nil {
164+ logEventAndExit (ctx , eventRecorder , pod , secretErrorReason , err )
165+ }
152166 globalConfigurationValidator := createGlobalConfigurationValidator ()
153167
154168 mustProcessGlobalConfiguration (ctx )
@@ -562,14 +576,13 @@ func startChildProcesses(nginxManager nginx.Manager, appProtectV5 bool) childPro
562576 }
563577}
564578
565- func processDefaultServerSecret (ctx context.Context , kubeClient * kubernetes.Clientset , nginxManager nginx.Manager ) bool {
566- l := nl .LoggerFromContext (ctx )
579+ func processDefaultServerSecret (kubeClient * kubernetes.Clientset , nginxManager nginx.Manager ) (bool , error ) {
567580 var sslRejectHandshake bool
568581
569582 if * defaultServerSecret != "" {
570583 secret , err := getAndValidateSecret (kubeClient , * defaultServerSecret , api_v1 .SecretTypeTLS )
571584 if err != nil {
572- nl . Fatalf ( l , "Error trying to get the default server TLS secret %v: %v " , * defaultServerSecret , err )
585+ return sslRejectHandshake , fmt . Errorf ( "error trying to get the default server TLS secret %v: %w " , * defaultServerSecret , err )
573586 }
574587
575588 bytes := configs .GenerateCertAndKeyFileContent (secret )
@@ -581,25 +594,25 @@ func processDefaultServerSecret(ctx context.Context, kubeClient *kubernetes.Clie
581594 // file doesn't exist - it is OK! we will reject TLS connections in the default server
582595 sslRejectHandshake = true
583596 } else {
584- nl . Fatalf ( l , "Error checking the default server TLS cert and key in %s: %v " , configs .DefaultServerSecretPath , err )
597+ return sslRejectHandshake , fmt . Errorf ( "error checking the default server TLS cert and key in %s: %w " , configs .DefaultServerSecretPath , err )
585598 }
586599 }
587600 }
588- return sslRejectHandshake
601+ return sslRejectHandshake , nil
589602}
590603
591- func processWildcardSecret (ctx context. Context , kubeClient * kubernetes.Clientset , nginxManager nginx.Manager ) bool {
592- l := nl . LoggerFromContext ( ctx )
593- if * wildcardTLSSecret != "" {
604+ func processWildcardSecret (kubeClient * kubernetes.Clientset , nginxManager nginx.Manager ) ( bool , error ) {
605+ isWildcardEnabled := * wildcardTLSSecret != ""
606+ if isWildcardEnabled {
594607 secret , err := getAndValidateSecret (kubeClient , * wildcardTLSSecret , api_v1 .SecretTypeTLS )
595608 if err != nil {
596- nl . Fatalf ( l , "Error trying to get the wildcard TLS secret %v: %v " , * wildcardTLSSecret , err )
609+ return false , fmt . Errorf ( "error trying to get the wildcard TLS secret %v: %w " , * wildcardTLSSecret , err )
597610 }
598611
599612 bytes := configs .GenerateCertAndKeyFileContent (secret )
600613 nginxManager .CreateSecret (configs .WildcardSecretFileName , bytes , nginx .ReadWriteOnlyFileMode )
601614 }
602- return * wildcardTLSSecret != ""
615+ return isWildcardEnabled , nil
603616}
604617
605618func createGlobalConfigurationValidator () * cr_validation.GlobalConfigurationValidator {
@@ -946,6 +959,13 @@ func updateSelfWithVersionInfo(ctx context.Context, eventLog record.EventRecorde
946959 }
947960}
948961
962+ func logEventAndExit (ctx context.Context , eventLog record.EventRecorder , obj pkg_runtime.Object , reason string , err error ) {
963+ l := nl .LoggerFromContext (ctx )
964+ eventLog .Eventf (obj , api_v1 .EventTypeWarning , reason , err .Error ())
965+ time .Sleep (fatalEventFlushTime ) // wait for the event to be flushed
966+ nl .Fatal (l , err .Error ())
967+ }
968+
949969func initLogger (logFormat string , level slog.Level , out io.Writer ) context.Context {
950970 programLevel := new (slog.LevelVar ) // Info by default
951971 var h slog.Handler
0 commit comments