Skip to content

Commit 749cf43

Browse files
committed
nokubeconfig controller: use listers, filter informer events, avoid unecessary applies
1 parent 3b26613 commit 749cf43

File tree

1 file changed

+40
-13
lines changed

1 file changed

+40
-13
lines changed

pkg/operator/nodekubeconfigcontroller/nodekubeconfigcontroller.go

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"encoding/base64"
66
"fmt"
7+
"reflect"
78
"strings"
89
"time"
910

@@ -16,16 +17,20 @@ import (
1617
"github.com/openshift/library-go/pkg/controller/factory"
1718
"github.com/openshift/library-go/pkg/operator/certrotation"
1819
"github.com/openshift/library-go/pkg/operator/events"
19-
"github.com/openshift/library-go/pkg/operator/resource/resourceapply"
2020
"github.com/openshift/library-go/pkg/operator/resource/resourceread"
2121
"github.com/openshift/library-go/pkg/operator/v1helpers"
2222
corev1 "k8s.io/api/core/v1"
23+
apierrors "k8s.io/apimachinery/pkg/api/errors"
2324
"k8s.io/client-go/kubernetes"
2425
coreclientv1 "k8s.io/client-go/kubernetes/typed/core/v1"
2526
corev1listers "k8s.io/client-go/listers/core/v1"
2627
)
2728

28-
const workQueueKey = "key"
29+
const (
30+
workQueueKey = "key"
31+
kubeApiserverServerCA = "kube-apiserver-server-ca"
32+
nodeSystemAdminClient = "node-system-admin-client"
33+
)
2934

3035
type NodeKubeconfigController struct {
3136
operatorClient v1helpers.StaticPodOperatorClient
@@ -40,7 +45,7 @@ func NewNodeKubeconfigController(
4045
operatorClient v1helpers.StaticPodOperatorClient,
4146
kubeInformersForNamespaces v1helpers.KubeInformersForNamespaces,
4247
kubeClient kubernetes.Interface,
43-
infrastuctureInformer configv1informers.InfrastructureInformer,
48+
infrastructureInformer configv1informers.InfrastructureInformer,
4449
eventRecorder events.Recorder,
4550
) factory.Controller {
4651
c := &NodeKubeconfigController{
@@ -51,13 +56,26 @@ func NewNodeKubeconfigController(
5156
infrastructureLister: infrastuctureInformer.Lister(),
5257
}
5358

54-
return factory.New().WithInformers(
59+
return factory.New().WithFilteredEventsInformers(
60+
func(obj interface{}) bool {
61+
if cm, ok := obj.(*corev1.ConfigMap); ok {
62+
if cm.Namespace == operatorclient.OperatorNamespace && cm.Name == kubeApiserverServerCA {
63+
return true
64+
}
65+
return false
66+
}
67+
if secret, ok := obj.(*corev1.Secret); ok {
68+
if secret.Namespace == operatorclient.OperatorNamespace && secret.Name == nodeSystemAdminClient {
69+
return true
70+
}
71+
return false
72+
}
73+
return true
74+
},
5575
operatorClient.Informer(),
56-
kubeInformersForNamespaces.InformersFor(operatorclient.OperatorNamespace).Core().V1().ConfigMaps().Informer(),
5776
kubeInformersForNamespaces.InformersFor(operatorclient.TargetNamespace).Core().V1().ConfigMaps().Informer(),
5877
kubeInformersForNamespaces.InformersFor(operatorclient.OperatorNamespace).Core().V1().Secrets().Informer(),
59-
kubeInformersForNamespaces.InformersFor(operatorclient.TargetNamespace).Core().V1().Secrets().Informer(),
60-
infrastuctureInformer.Informer(),
78+
infrastructureInformer.Informer(),
6179
).WithSync(c.sync).WithSyncDegradedOnError(c.operatorClient).ResyncEvery(5*time.Minute).ToController("NodeKubeconfigController", eventRecorder.WithComponentSuffix("node-kubeconfig-controller"))
6280
}
6381

@@ -99,27 +117,27 @@ func (c NodeKubeconfigController) sync(ctx context.Context, syncContext factory.
99117
func ensureNodeKubeconfigs(ctx context.Context, client coreclientv1.CoreV1Interface, secretLister corev1listers.SecretLister, configmapLister corev1listers.ConfigMapLister, infrastructureLister configv1listers.InfrastructureLister, recorder events.Recorder) error {
100118
requiredSecret := resourceread.ReadSecretV1OrDie(bindata.MustAsset("assets/kube-apiserver/node-kubeconfigs.yaml"))
101119

102-
systemAdminCredsSecret, err := secretLister.Secrets(operatorclient.OperatorNamespace).Get("node-system-admin-client")
120+
systemAdminCredsSecret, err := secretLister.Secrets(operatorclient.OperatorNamespace).Get(nodeSystemAdminClient)
103121
if err != nil {
104122
return err
105123
}
106124

107125
systemAdminClientCert := systemAdminCredsSecret.Data[corev1.TLSCertKey]
108126
if len(systemAdminClientCert) == 0 {
109-
return fmt.Errorf("system:admin client certificate missing from secret %s/node-system-admin-client", operatorclient.OperatorNamespace)
127+
return fmt.Errorf("system:admin client certificate missing from secret %s/%s", operatorclient.OperatorNamespace, nodeSystemAdminClient)
110128
}
111129
systemAdminClientKey := systemAdminCredsSecret.Data[corev1.TLSPrivateKeyKey]
112130
if len(systemAdminClientKey) == 0 {
113-
return fmt.Errorf("system:admin client private key missing from secret %s/node-system-admin-client", operatorclient.OperatorNamespace)
131+
return fmt.Errorf("system:admin client private key missing from secret %s/%s", operatorclient.OperatorNamespace, nodeSystemAdminClient)
114132
}
115133

116-
servingCABundleCM, err := configmapLister.ConfigMaps(operatorclient.TargetNamespace).Get("kube-apiserver-server-ca")
134+
servingCABundleCM, err := configmapLister.ConfigMaps(operatorclient.TargetNamespace).Get(kubeApiserverServerCA)
117135
if err != nil {
118136
return err
119137
}
120138
servingCABundleData := servingCABundleCM.Data["ca-bundle.crt"]
121139
if len(servingCABundleData) == 0 {
122-
return fmt.Errorf("serving CA bundle missing from configmap %s/kube-apiserver-server-ca", operatorclient.TargetNamespace)
140+
return fmt.Errorf("serving CA bundle missing from configmap %s/%s", operatorclient.TargetNamespace, kubeApiserverServerCA)
123141
}
124142

125143
infrastructure, err := infrastructureLister.Get("cluster")
@@ -161,7 +179,16 @@ func ensureNodeKubeconfigs(ctx context.Context, client coreclientv1.CoreV1Interf
161179
requiredSecret.Annotations[certrotation.CertificateNotAfterAnnotation] = systemAdminCredsSecret.Annotations[certrotation.CertificateNotAfterAnnotation]
162180
}
163181

164-
_, _, err = resourceapply.ApplySecret(ctx, client, recorder, requiredSecret)
182+
actualSecret, err := secretLister.Secrets(requiredSecret.Namespace).Get(requiredSecret.Name)
183+
if !apierrors.IsNotFound(err) {
184+
if err != nil {
185+
return err
186+
}
187+
if reflect.DeepEqual(actualSecret.Data, requiredSecret.Data) {
188+
return nil
189+
}
190+
}
191+
165192
if err != nil {
166193
return err
167194
}

0 commit comments

Comments
 (0)