Skip to content

Commit

Permalink
avoid using the node informer
Browse files Browse the repository at this point in the history
  • Loading branch information
tjungblu committed Feb 9, 2024
1 parent 43ff300 commit c1d69ed
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 28 deletions.
55 changes: 27 additions & 28 deletions pkg/operator/etcdcertsigner/etcdcertsignercontroller.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,15 @@ type nodeCertConfigs struct {
}

type EtcdCertSignerController struct {
eventRecorder events.Recorder
kubeClient kubernetes.Interface
operatorClient v1helpers.StaticPodOperatorClient
nodeLister corev1listers.NodeLister
secretInformer corev1informers.SecretInformer
secretLister corev1listers.SecretLister
secretClient corev1client.SecretsGetter
quorumChecker ceohelpers.QuorumChecker
eventRecorder events.Recorder
kubeClient kubernetes.Interface
operatorClient v1helpers.StaticPodOperatorClient
masterNodeLister corev1listers.NodeLister
masterNodeSelector labels.Selector
secretInformer corev1informers.SecretInformer
secretLister corev1listers.SecretLister
secretClient corev1client.SecretsGetter
quorumChecker ceohelpers.QuorumChecker

certConfig *certConfig
}
Expand All @@ -77,14 +78,11 @@ func NewEtcdCertSignerController(
kubeClient kubernetes.Interface,
operatorClient v1helpers.StaticPodOperatorClient,
kubeInformers v1helpers.KubeInformersForNamespaces,
masterNodeLister corev1listers.NodeLister,
masterNodeSelector labels.Selector,
eventRecorder events.Recorder,
quorumChecker ceohelpers.QuorumChecker,
) factory.Controller {

// we're only interested in changes to control plane nodes
/*controlPlaneNodeInformer := corev1informers.NewFilteredNodeInformer(kubeClient, 1*time.Hour, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, func(listOptions *metav1.ListOptions) {
listOptions.LabelSelector = "node-role.kubernetes.io/master"
})*/
eventRecorder = eventRecorder.WithComponentSuffix("etcd-cert-signer-controller")
cmInformer := kubeInformers.InformersFor(operatorclient.TargetNamespace).Core().V1().ConfigMaps()
cmLister := cmInformer.Lister()
Expand Down Expand Up @@ -124,27 +122,28 @@ func NewEtcdCertSignerController(
}

c := &EtcdCertSignerController{
eventRecorder: eventRecorder,
kubeClient: kubeClient,
operatorClient: operatorClient,
nodeLister: kubeInformers.InformersFor("").Core().V1().Nodes().Lister(),
secretInformer: secretInformer,
secretLister: secretLister,
secretClient: secretClient,
quorumChecker: quorumChecker,
certConfig: certCfg,
eventRecorder: eventRecorder,
kubeClient: kubeClient,
operatorClient: operatorClient,
masterNodeLister: masterNodeLister,
masterNodeSelector: masterNodeSelector,
secretInformer: secretInformer,
secretLister: secretLister,
secretClient: secretClient,
quorumChecker: quorumChecker,
certConfig: certCfg,
}

syncer := health.NewDefaultCheckingSyncWrapper(c.sync)
livenessChecker.Add("EtcdCertSignerController", syncer)

return factory.New().ResyncEvery(time.Minute).WithInformers(
// controlPlaneNodeInformer,
kubeInformers.InformersFor("").Core().V1().Nodes().Informer(),
return factory.New().ResyncEvery(2*time.Minute).WithInformers(
// we are deliberately leaving out the master node informer here:
// node updates are on the order of the kubelet heartbeat intervals (2-5s), which makes calling this controller
// prohibitively expensive CPU-wise. We thus rely mostly on the re-sync interval of two minutes.
kubeInformers.InformersFor(operatorclient.GlobalUserSpecifiedConfigNamespace).Core().V1().Secrets().Informer(),
cmInformer.Informer(),
secretInformer.Informer(),
operatorClient.Informer(),
cmInformer.Informer(),
).WithSync(syncer.Sync).ToController("EtcdCertSignerController", c.eventRecorder)
}

Expand Down Expand Up @@ -294,7 +293,7 @@ func (c *EtcdCertSignerController) syncAllMasterCertificates(ctx context.Context
// This works, because initialization is cheap and all state is kept in secrets, configmaps and their annotations.
func (c *EtcdCertSignerController) createNodeCertConfigs() ([]*nodeCertConfigs, error) {
var cfgs []*nodeCertConfigs
nodes, err := c.nodeLister.List(labels.Set{"node-role.kubernetes.io/master": ""}.AsSelector())
nodes, err := c.masterNodeLister.List(c.masterNodeSelector)
if err != nil {
return cfgs, err
}
Expand Down
6 changes: 6 additions & 0 deletions pkg/operator/etcdcertsigner/etcdcertsignercontroller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"go.etcd.io/etcd/api/v3/etcdserverpb"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes/fake"
corev1listers "k8s.io/client-go/listers/core/v1"
Expand Down Expand Up @@ -290,6 +291,9 @@ func setupControllerWithEtcd(t *testing.T, objects []runtime.Object, etcdMembers
nil,
)

nodeSelector, err := labels.Parse("node-role.kubernetes.io/master")
require.NoError(t, err)

fakeEtcdClient, err := etcdcli.NewFakeEtcdClient(etcdMembers)
require.NoError(t, err)

Expand All @@ -310,6 +314,8 @@ func setupControllerWithEtcd(t *testing.T, objects []runtime.Object, etcdMembers
fakeKubeClient,
fakeOperatorClient,
kubeInformerForNamespace,
kubeInformerForNamespace.InformersFor("").Core().V1().Nodes().Lister(),
nodeSelector,
recorder,
quorumChecker)

Expand Down
2 changes: 2 additions & 0 deletions pkg/operator/starter.go
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,8 @@ func RunOperator(ctx context.Context, controllerContext *controllercmd.Controlle
coreClient,
operatorClient,
kubeInformersForNamespaces,
masterNodeLister,
masterMachineLabelSelector,
controllerContext.EventRecorder,
quorumChecker,
)
Expand Down

0 comments on commit c1d69ed

Please sign in to comment.