Skip to content

Commit a255a8b

Browse files
committed
use zap for logging, previous log never outputted to kubectl logs
1 parent a504b66 commit a255a8b

File tree

4 files changed

+76
-54
lines changed

4 files changed

+76
-54
lines changed

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ module github.com/open-policy-agent/cert-controller
33
go 1.14
44

55
require (
6+
github.com/go-logr/zapr v0.1.0
67
github.com/onsi/gomega v1.10.2
8+
github.com/open-policy-agent/cert-controller v0.1.0
79
github.com/pkg/errors v0.9.1
810
go.uber.org/atomic v1.6.0
911
go.uber.org/zap v1.10.0

main.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
"k8s.io/client-go/tools/clientcmd/api"
1313
"os"
1414
ctrl "sigs.k8s.io/controller-runtime"
15+
logf "sigs.k8s.io/controller-runtime/pkg/log"
16+
"github.com/go-logr/zapr"
1517
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
1618
"time"
1719
)
@@ -27,6 +29,21 @@ var (
2729
webhookName = flag.String("webhook-name", "", "Your webhook name")
2830
)
2931

32+
func buildLogger() (*zap.Logger, error) {
33+
// build a logger:
34+
// - without timestamps because docker already logs with timestamps
35+
// - use "message" instead of "msg" for consistency with other services / datadog parsing
36+
// - remove caller since it points to shared methods most of the time anyway
37+
loggerConfig := zap.NewProductionConfig()
38+
loggerConfig.EncoderConfig.TimeKey = ""
39+
loggerConfig.EncoderConfig.MessageKey = "message"
40+
loggerConfig.DisableCaller = true
41+
if os.Getenv("DEBUG") == "1" {
42+
loggerConfig.Level.SetLevel(zap.DebugLevel)
43+
}
44+
return loggerConfig.Build()
45+
}
46+
3047
func main() {
3148
flag.Parse()
3249

@@ -38,7 +55,9 @@ func main() {
3855
}
3956

4057
// configure logging.
41-
logger, _ := zap.NewDevelopment()
58+
logger, _ := buildLogger()
59+
defer logger.Sync() // flush buffer
60+
logf.SetLogger(zapr.NewLogger(logger)) // Set logger for cert-controller or it sends to /dev/null
4261

4362
logger.Info("sleeping to demonstrate restart behavior")
4463
time.Sleep(5 * time.Second)
@@ -63,6 +82,7 @@ func main() {
6382
}
6483

6584
// Make sure certs are generated and valid if cert rotation is enabled.
85+
setupFinished := make(chan struct{})
6686
if err := rotator.AddRotator(mgr, &rotator.CertRotator{
6787
SecretKey: types.NamespacedName{
6888
Namespace: *nameSpace,
@@ -72,10 +92,10 @@ func main() {
7292
CAName: *caName,
7393
CAOrganization: *caOrganization,
7494
DNSName: *dnsName,
95+
IsReady: setupFinished,
7596
Webhooks: webhooks,
7697
}); err != nil {
7798
logger.Error("unable to set up cert rotation", zap.Error(err))
78-
7999
os.Exit(1)
80100
}
81101

pkg/rotator/rotator.go

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const (
4141
caCertName = "ca.crt"
4242
caKeyName = "ca.key"
4343
rotationCheckFrequency = 12 * time.Hour
44+
certValidityDuration = 10 * 365 * 24 * time.Hour
4445
lookaheadInterval = 90 * 24 * time.Hour
4546
)
4647

@@ -62,9 +63,6 @@ var _ manager.Runnable = &CertRotator{}
6263

6364
var restartOnSecretRefresh = false
6465

65-
var certValidityDuration = flag.Duration("cert-validity-duration", 10 * 365 * 24 * time.Hour, "Sets how long the cert is valid for, defaults to 10 years")
66-
67-
6866
//WebhookInfo is used by the rotator to receive info about resources to be updated with certificates
6967
type WebhookInfo struct {
7068
//Name is the name of the webhook for a validating or mutating webhook, or the CRD name in case of a CRD conversion webhook
@@ -73,7 +71,7 @@ type WebhookInfo struct {
7371
}
7472

7573
func init() {
76-
flag.BoolVar(&restartOnSecretRefresh, "cert-restart-on-secret-refresh", true, "Kills the process when secrets are refreshed so that the pod can be restarted (secrets take up to 60s to be updated by running pods)")
74+
flag.BoolVar(&restartOnSecretRefresh, "cert-restart-on-secret-refresh", false, "Kills the process when secrets are refreshed so that the pod can be restarted (secrets take up to 60s to be updated by running pods)")
7775
}
7876

7977
func (w WebhookInfo) gvk() schema.GroupVersionKind {
@@ -264,7 +262,7 @@ func (cr *CertRotator) refreshCerts(refreshCA bool, secret *corev1.Secret) error
264262
var caArtifacts *KeyPairArtifacts
265263
now := time.Now()
266264
begin := now.Add(-1 * time.Hour)
267-
end := now.Add(*certValidityDuration)
265+
end := now.Add(certValidityDuration)
268266
if refreshCA {
269267
var err error
270268
caArtifacts, err = cr.CreateCACert(begin, end)
@@ -627,11 +625,9 @@ func (r *ReconcileWH) Reconcile(ctx context.Context, request reconcile.Request)
627625
}
628626

629627
// Ensure certs on webhooks
630-
fmt.Println("Starting cert injection")
631628
if err := r.ensureCerts(artifacts.CertPEM); err != nil {
632629
return reconcile.Result{}, err
633630
}
634-
fmt.Println("Finished cert injection")
635631

636632
// Set CAInjected if the reconciler has not exited early.
637633
r.wasCAInjected.Store(true)
@@ -660,32 +656,25 @@ func (r *ReconcileWH) ensureCerts(certPem []byte) error {
660656
updatedResource.SetGroupVersionKind(gvk)
661657
if err := r.cache.Get(r.ctx, types.NamespacedName{Name: webhook.Name}, updatedResource); err != nil {
662658
if k8sErrors.IsNotFound(err) {
663-
fmt.Println("Webhook not found. Unable to update certificate.", err)
664659
log.Error(err, "Webhook not found. Unable to update certificate.")
665660
continue
666661
}
667662
anyError = err
668663
log.Error(err, "Error getting webhook for certificate update.")
669-
fmt.Println("Error getting webhook for certificate update.", err)
670-
671664
continue
672665
}
673666
if !updatedResource.GetDeletionTimestamp().IsZero() {
674-
fmt.Println("Webhook is being deleted. Unable to update certificate")
675667
log.Info("Webhook is being deleted. Unable to update certificate")
676668
continue
677669
}
678670

679671
log.Info("Ensuring CA cert", "name", webhook.Name, "gvk", gvk)
680672
if err := injectCert(updatedResource, certPem, webhook.Type); err != nil {
681-
fmt.Println("Unable to inject cert to webhook.:", err)
682673
log.Error(err, "Unable to inject cert to webhook.")
683674
anyError = err
684675
continue
685676
}
686677
if err := r.writer.Update(r.ctx, updatedResource); err != nil {
687-
fmt.Println("Error updating webhook with certificate:", err)
688-
689678
log.Error(err, "Error updating webhook with certificate")
690679
anyError = err
691680
continue
@@ -736,4 +725,4 @@ func (cr *CertRotator) ensureReady() {
736725
}
737726
crLog.Info("CA certs are injected to webhooks")
738727
close(cr.IsReady)
739-
}
728+
}

test.yaml

Lines changed: 48 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,40 @@ spec:
1818
foo: bar4
1919
spec:
2020
containers:
21-
- name: busybox
22-
image: busybox
23-
command: ["sh", "-c", "watch ls /certs"]
24-
volumeMounts:
25-
- name: certs
26-
mountPath: "/certs"
27-
readOnly: true
28-
- name: cert-controller
29-
args:
30-
- -cert-dir=/certs
31-
- -ca-name=foocaname
32-
- -secret-name=vpa-admission-controller-secret
33-
- -service-name=fooservice
34-
- -ca-organization=fooorg
35-
- -namespace=default
36-
- -dns-name=foo.bar.svc
37-
- -webhook-name=vpa-webhook-config
38-
imagePullPolicy: Never
39-
image: cert-controller
21+
- name: busybox
22+
image: busybox
23+
command: ["sh", "-c", "watch ls /certs"]
24+
volumeMounts:
25+
- name: certs
26+
mountPath: "/certs"
27+
readOnly: true
28+
- name: cert-controller
29+
args:
30+
- -cert-dir=/certs
31+
- -ca-name=foocaname
32+
- -secret-name=vpa-admission-controller-secret
33+
- -service-name=fooservice
34+
- -ca-organization=fooorg
35+
- -namespace=default
36+
- -dns-name=foo.bar.svc
37+
- -webhook-name=vpa-webhook-config
38+
imagePullPolicy: Never
39+
image: cert-controller
40+
resources:
41+
limits:
42+
cpu: 200m
43+
memory: 500Mi
44+
requests:
45+
cpu: 50m
46+
memory: 200Mi
47+
volumeMounts:
48+
- name: certs
49+
mountPath: "/certs"
50+
readOnly: true
4051
volumes:
41-
- name: certs
42-
secret:
43-
secretName: vpa-admission-controller-secret
52+
- name: certs
53+
secret:
54+
secretName: vpa-admission-controller-secret
4455
---
4556
apiVersion: admissionregistration.k8s.io/v1
4657
kind: MutatingWebhookConfiguration
@@ -54,21 +65,21 @@ metadata:
5465
annotations:
5566
samson/server_side_apply: 'true'
5667
webhooks:
57-
- name: vpa.k8s.io
58-
failurePolicy: Ignore
59-
admissionReviewVersions: ["v1beta1"]
60-
rules:
61-
- apiGroups: [""]
62-
apiVersions: ["v1"]
63-
operations: ["CREATE"]
64-
resources: ["pods"]
65-
clientConfig:
66-
caBundle: Cg==
67-
service:
68-
namespace: default
69-
name: vpa-webhook
70-
sideEffects: None
71-
timeoutSeconds: 30
68+
- name: vpa.k8s.io
69+
failurePolicy: Ignore
70+
admissionReviewVersions: ["v1beta1"]
71+
rules:
72+
- apiGroups: [""]
73+
apiVersions: ["v1"]
74+
operations: ["CREATE"]
75+
resources: ["pods"]
76+
clientConfig:
77+
caBundle: Cg==
78+
service:
79+
namespace: default
80+
name: vpa-webhook
81+
sideEffects: None
82+
timeoutSeconds: 30
7283

7384
# We need to create a bogus secret for the updater to fill
7485
---

0 commit comments

Comments
 (0)