@@ -7,29 +7,40 @@ import (
7
7
"log"
8
8
"net/http"
9
9
"os"
10
+ "os/signal"
11
+ "sync"
12
+ "syscall"
10
13
"time"
11
14
12
15
"github.com/go-logr/zapr"
16
+ "github.com/kyverno/kyverno/pkg/leaderelection"
13
17
"github.com/kyverno/pkg/certmanager"
14
18
tlsMgr "github.com/kyverno/pkg/tls"
15
19
"github.com/nirmata/kyverno-notation-verifier/kubenotation"
16
20
knvSetup "github.com/nirmata/kyverno-notation-verifier/setup"
17
21
knvVerifier "github.com/nirmata/kyverno-notation-verifier/verifier"
18
22
_ "github.com/notaryproject/notation-core-go/signature/cose"
19
23
_ "github.com/notaryproject/notation-core-go/signature/jws"
24
+ "github.com/pkg/errors"
20
25
"go.uber.org/zap"
21
26
"go.uber.org/zap/zapcore"
27
+ corev1 "k8s.io/api/core/v1"
22
28
"k8s.io/client-go/kubernetes"
23
29
"k8s.io/client-go/rest"
24
30
ctrl "sigs.k8s.io/controller-runtime"
25
31
)
26
32
27
33
var (
28
- namespace = "kyverno-notation-aws"
34
+ Namespace = os .Getenv ("POD_NAMESPACE" )
35
+ PodName = os .Getenv ("POD_NAME" )
36
+ ServiceName = getEnvWithFallback ("SERVICE_NAME" , "svc" )
37
+ DeploymentName = getEnvWithFallback ("DEPLOYMENT_NAME" , "kyverno-notation-aws" )
38
+
29
39
CertRenewalInterval = 12 * time .Hour
30
40
CAValidityDuration = 365 * 24 * time .Hour
31
41
TLSValidityDuration = 150 * 24 * time .Hour
32
- resyncPeriod = 15 * time .Minute
42
+
43
+ resyncPeriod = 15 * time .Minute
33
44
)
34
45
35
46
func main () {
@@ -96,39 +107,74 @@ func main() {
96
107
log .Fatalf ("failed to initialize kube client: %v" , err )
97
108
}
98
109
110
+ signalCtx , sdown := signal .NotifyContext (context .Background (), os .Interrupt , syscall .SIGTERM )
111
+ defer sdown ()
112
+
99
113
tlsMgrConfig := & tlsMgr.Config {
100
- ServiceName : "kyverno-notation-aws" ,
101
- Namespace : namespace ,
114
+ ServiceName : ServiceName ,
115
+ Namespace : Namespace ,
102
116
}
103
117
104
- certRenewer := tlsMgr .NewCertRenewer (
105
- zapr .NewLogger (logger ),
106
- kubeClient .CoreV1 ().Secrets (namespace ),
107
- CertRenewalInterval ,
108
- CAValidityDuration ,
109
- TLSValidityDuration ,
110
- "" ,
111
- tlsMgrConfig ,
112
- )
113
-
114
118
caStopCh := make (chan struct {}, 1 )
115
- caInformer := NewSecretInformer (kubeClient , namespace , tlsMgr .GenerateRootCASecretName (tlsMgrConfig ), resyncPeriod )
119
+ caInformer := NewSecretInformer (kubeClient , Namespace , tlsMgr .GenerateRootCASecretName (tlsMgrConfig ), resyncPeriod )
116
120
go caInformer .Informer ().Run (caStopCh )
117
121
118
122
tlsStopCh := make (chan struct {}, 1 )
119
- tlsInformer := NewSecretInformer (kubeClient , namespace , tlsMgr .GenerateTLSPairSecretName (tlsMgrConfig ), resyncPeriod )
123
+ tlsInformer := NewSecretInformer (kubeClient , Namespace , tlsMgr .GenerateTLSPairSecretName (tlsMgrConfig ), resyncPeriod )
120
124
go tlsInformer .Informer ().Run (tlsStopCh )
121
125
122
- certManager := certmanager .NewController (
123
- zapr .NewLogger (logger ),
124
- caInformer ,
125
- tlsInformer ,
126
- certRenewer ,
127
- tlsMgrConfig ,
126
+ le , err := leaderelection .New (
127
+ zapr .NewLogger (logger ).WithName ("leader-election" ),
128
+ DeploymentName ,
129
+ Namespace ,
130
+ kubeClient ,
131
+ PodName ,
132
+ 2 * time .Second ,
133
+ func (ctx context.Context ) {
134
+
135
+ certRenewer := tlsMgr .NewCertRenewer (
136
+ zapr .NewLogger (logger ).WithName ("tls" ).WithValues ("pod" , PodName ),
137
+ kubeClient .CoreV1 ().Secrets (Namespace ),
138
+ CertRenewalInterval ,
139
+ CAValidityDuration ,
140
+ TLSValidityDuration ,
141
+ "" ,
142
+ tlsMgrConfig ,
143
+ )
144
+
145
+ certManager := certmanager .NewController (
146
+ zapr .NewLogger (logger ).WithName ("certmanager" ).WithValues ("pod" , PodName ),
147
+ caInformer ,
148
+ tlsInformer ,
149
+ certRenewer ,
150
+ tlsMgrConfig ,
151
+ )
152
+
153
+ leaderControllers := []Controller {NewController ("cert-manager" , certManager , 1 )}
154
+
155
+ // start leader controllers
156
+ var wg sync.WaitGroup
157
+ for _ , controller := range leaderControllers {
158
+ controller .Run (signalCtx , zapr .NewLogger (logger ).WithName ("controllers" ), & wg )
159
+ }
160
+ // wait all controllers shut down
161
+ wg .Wait ()
162
+ },
163
+ nil ,
128
164
)
165
+ if err != nil {
166
+ log .Fatalf ("failed to initialize leader election: %v" , err )
167
+ os .Exit (1 )
168
+ }
129
169
170
+ // start leader election
130
171
go func () {
131
- certManager .Run (context .TODO (), 1 )
172
+ select {
173
+ case <- signalCtx .Done ():
174
+ return
175
+ default :
176
+ le .Run (signalCtx )
177
+ }
132
178
}()
133
179
134
180
crdSetup , err := kubenotation .Setup (zapr .NewLogger (logger ), metricsAddr , probeAddr , enableLeaderElection )
@@ -172,7 +218,23 @@ func main() {
172
218
errsTLS := make (chan error , 1 )
173
219
if ! flagNoTLS {
174
220
tlsConf := & tls.Config {
175
- GetCertificate : certManager .GetCertificate ,
221
+ GetCertificate : func (* tls.ClientHelloInfo ) (* tls.Certificate , error ) {
222
+ secret , err := tlsInformer .Lister ().Secrets (tlsMgrConfig .Namespace ).Get (tlsMgr .GenerateTLSPairSecretName (tlsMgrConfig ))
223
+ if err != nil {
224
+ return nil , err
225
+ } else if secret == nil {
226
+ return nil , errors .New ("tls secret not found" )
227
+ } else if secret .Type != corev1 .SecretTypeTLS {
228
+ return nil , errors .New ("secret is not a TLS secret" )
229
+ }
230
+
231
+ cert , err := tls .X509KeyPair (secret .Data [corev1 .TLSCertKey ], secret .Data [corev1 .TLSPrivateKeyKey ])
232
+ if err != nil {
233
+ return nil , err
234
+ }
235
+
236
+ return & cert , nil
237
+ },
176
238
}
177
239
srv := & http.Server {
178
240
Addr : ":9443" ,
0 commit comments