@@ -34,6 +34,7 @@ import (
34
34
"github.com/prometheus/client_golang/prometheus"
35
35
api_v1 "k8s.io/api/core/v1"
36
36
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
37
+ pkg_runtime "k8s.io/apimachinery/pkg/runtime"
37
38
util_version "k8s.io/apimachinery/pkg/util/version"
38
39
"k8s.io/client-go/dynamic"
39
40
"k8s.io/client-go/kubernetes"
@@ -75,6 +76,8 @@ const (
75
76
appProtectVersionPath = "/opt/app_protect/RELEASE"
76
77
appProtectv4BundleFolder = "/etc/nginx/waf/bundles/"
77
78
appProtectv5BundleFolder = "/etc/app_protect/bundles/"
79
+ fatalEventFlushTime = 200 * time .Millisecond
80
+ secretErrorReason = "SecretError"
78
81
)
79
82
80
83
func main () {
@@ -89,9 +92,14 @@ func main() {
89
92
90
93
buildOS := os .Getenv ("BUILD_OS" )
91
94
controllerNamespace := os .Getenv ("POD_NAMESPACE" )
95
+ podName := os .Getenv ("POD_NAME" )
92
96
93
97
config , kubeClient := mustCreateConfigAndKubeClient (ctx )
94
98
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
+ }
95
103
eventBroadcaster := record .NewBroadcaster ()
96
104
eventBroadcaster .StartLogging (func (format string , args ... interface {}) {
97
105
nl .Infof (l , format , args ... )
@@ -101,6 +109,7 @@ func main() {
101
109
})
102
110
eventRecorder := eventBroadcaster .NewRecorder (scheme .Scheme ,
103
111
api_v1.EventSource {Component : "nginx-ingress-controller" })
112
+ defer eventBroadcaster .Shutdown ()
104
113
mustValidateIngressClass (ctx , kubeClient )
105
114
106
115
checkNamespaces (ctx , kubeClient )
@@ -143,12 +152,17 @@ func main() {
143
152
144
153
templateExecutor , templateExecutorV2 := createTemplateExecutors (ctx )
145
154
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
+ }
149
159
150
160
staticSSLPath := nginxManager .GetSecretsDir ()
151
161
162
+ isWildcardEnabled , err := processWildcardSecret (kubeClient , nginxManager )
163
+ if err != nil {
164
+ logEventAndExit (ctx , eventRecorder , pod , secretErrorReason , err )
165
+ }
152
166
globalConfigurationValidator := createGlobalConfigurationValidator ()
153
167
154
168
mustProcessGlobalConfiguration (ctx )
@@ -562,14 +576,13 @@ func startChildProcesses(nginxManager nginx.Manager, appProtectV5 bool) childPro
562
576
}
563
577
}
564
578
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 ) {
567
580
var sslRejectHandshake bool
568
581
569
582
if * defaultServerSecret != "" {
570
583
secret , err := getAndValidateSecret (kubeClient , * defaultServerSecret , api_v1 .SecretTypeTLS )
571
584
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 )
573
586
}
574
587
575
588
bytes := configs .GenerateCertAndKeyFileContent (secret )
@@ -581,25 +594,25 @@ func processDefaultServerSecret(ctx context.Context, kubeClient *kubernetes.Clie
581
594
// file doesn't exist - it is OK! we will reject TLS connections in the default server
582
595
sslRejectHandshake = true
583
596
} 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 )
585
598
}
586
599
}
587
600
}
588
- return sslRejectHandshake
601
+ return sslRejectHandshake , nil
589
602
}
590
603
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 {
594
607
secret , err := getAndValidateSecret (kubeClient , * wildcardTLSSecret , api_v1 .SecretTypeTLS )
595
608
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 )
597
610
}
598
611
599
612
bytes := configs .GenerateCertAndKeyFileContent (secret )
600
613
nginxManager .CreateSecret (configs .WildcardSecretFileName , bytes , nginx .ReadWriteOnlyFileMode )
601
614
}
602
- return * wildcardTLSSecret != ""
615
+ return isWildcardEnabled , nil
603
616
}
604
617
605
618
func createGlobalConfigurationValidator () * cr_validation.GlobalConfigurationValidator {
@@ -946,6 +959,13 @@ func updateSelfWithVersionInfo(ctx context.Context, eventLog record.EventRecorde
946
959
}
947
960
}
948
961
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
+
949
969
func initLogger (logFormat string , level slog.Level , out io.Writer ) context.Context {
950
970
programLevel := new (slog.LevelVar ) // Info by default
951
971
var h slog.Handler
0 commit comments