Skip to content

Commit 0b59270

Browse files
Merge pull request #854 from vrutkovs/optimistic-ca-update
OCPBUGS-60473: Optimistically update Kube Server and Client CA bundles
2 parents 604d31c + c4fcbf4 commit 0b59270

File tree

17 files changed

+972
-84
lines changed

17 files changed

+972
-84
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ require (
99
github.com/openshift/api v0.0.0-20250710004639-926605d3338b
1010
github.com/openshift/build-machinery-go v0.0.0-20250530140348-dc5b2804eeee
1111
github.com/openshift/client-go v0.0.0-20250710075018-396b36f983ee
12-
github.com/openshift/library-go v0.0.0-20250710130336-73c7662bc565
12+
github.com/openshift/library-go v0.0.0-20250812160438-378de074fe7b
1313
github.com/prometheus/client_golang v1.22.0
1414
github.com/prometheus/common v0.62.0
1515
github.com/spf13/cobra v1.8.1

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ github.com/openshift/build-machinery-go v0.0.0-20250530140348-dc5b2804eeee h1:+S
163163
github.com/openshift/build-machinery-go v0.0.0-20250530140348-dc5b2804eeee/go.mod h1:8jcm8UPtg2mCAsxfqKil1xrmRMI3a+XU2TZ9fF8A7TE=
164164
github.com/openshift/client-go v0.0.0-20250710075018-396b36f983ee h1:tOtrrxfDEW8hK3eEsHqxsXurq/D6LcINGfprkQC3hqY=
165165
github.com/openshift/client-go v0.0.0-20250710075018-396b36f983ee/go.mod h1:zhRiYyNMk89llof2qEuGPWPD+joQPhCRUc2IK0SB510=
166-
github.com/openshift/library-go v0.0.0-20250710130336-73c7662bc565 h1:DtyzonCpVZxqYp4rp2cCRwBTEXZWw5fX9YE0tCM5hi8=
167-
github.com/openshift/library-go v0.0.0-20250710130336-73c7662bc565/go.mod h1:tptKNust9MdRI0p90DoBSPHIrBa9oh+Rok59tF0vT8c=
166+
github.com/openshift/library-go v0.0.0-20250812160438-378de074fe7b h1:AvoeP4LZgeHXTeNO7HiSdIxPbYrKvpJFa1JNTiYrx8M=
167+
github.com/openshift/library-go v0.0.0-20250812160438-378de074fe7b/go.mod h1:tptKNust9MdRI0p90DoBSPHIrBa9oh+Rok59tF0vT8c=
168168
github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0=
169169
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
170170
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=

pkg/operator/certrotationcontroller/certrotationcontroller.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,11 @@ func newCertRotationController(
107107
AdditionalAnnotations: certrotation.AdditionalAnnotations{
108108
JiraComponent: "kube-controller-manager",
109109
},
110-
Informer: kubeInformersForNamespaces.InformersFor(operatorclient.OperatorNamespace).Core().V1().ConfigMaps(),
111-
Lister: kubeInformersForNamespaces.InformersFor(operatorclient.OperatorNamespace).Core().V1().ConfigMaps().Lister(),
112-
Client: configMapsGetter,
113-
EventRecorder: eventRecorder,
110+
RefreshOnlyWhenExpired: refreshOnlyWhenExpired,
111+
Informer: kubeInformersForNamespaces.InformersFor(operatorclient.OperatorNamespace).Core().V1().ConfigMaps(),
112+
Lister: kubeInformersForNamespaces.InformersFor(operatorclient.OperatorNamespace).Core().V1().ConfigMaps().Lister(),
113+
Client: configMapsGetter,
114+
EventRecorder: eventRecorder,
114115
},
115116
certrotation.RotatedSelfSignedCertKeySecret{
116117
Namespace: operatorclient.OperatorNamespace,

pkg/operator/starter.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func RunOperator(ctx context.Context, cc *controllercmd.ControllerContext) error
5454
if err != nil {
5555
return err
5656
}
57-
57+
clusterInformers := v1helpers.NewKubeInformersForNamespaces(kubeClient, "")
5858
configInformers := configinformers.NewSharedInformerFactory(configClient, 10*time.Minute)
5959
kubeInformersForNamespaces := v1helpers.NewKubeInformersForNamespaces(kubeClient,
6060
"",
@@ -199,7 +199,7 @@ func RunOperator(ctx context.Context, cc *controllercmd.ControllerContext) error
199199
}
200200
versionRecorder.SetVersion("raw-internal", status.VersionForOperatorFromEnv())
201201

202-
staticPodControllers, err := staticpod.NewBuilder(operatorClient, kubeClient, kubeInformersForNamespaces, configInformers, cc.Clock).
202+
staticPodControllers, err := staticpod.NewBuilder(operatorClient, kubeClient, kubeInformersForNamespaces, clusterInformers.InformersFor(""), configInformers, cc.Clock).
203203
WithEvents(cc.EventRecorder).
204204
WithInstaller([]string{"cluster-kube-controller-manager-operator", "installer"}).
205205
WithPruning([]string{"cluster-kube-controller-manager-operator", "prune"}, "kube-controller-manager-pod").
@@ -287,6 +287,7 @@ func RunOperator(ctx context.Context, cc *controllercmd.ControllerContext) error
287287
})
288288

289289
configInformers.Start(ctx.Done())
290+
clusterInformers.Start(ctx.Done())
290291
kubeInformersForNamespaces.Start(ctx.Done())
291292
dynamicInformers.Start(ctx.Done())
292293

pkg/operator/targetconfigcontroller/targetconfigcontroller.go

Lines changed: 91 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"github.com/openshift/library-go/pkg/operator/events"
3838
"github.com/openshift/library-go/pkg/operator/management"
3939
"github.com/openshift/library-go/pkg/operator/resource/resourceapply"
40+
"github.com/openshift/library-go/pkg/operator/resource/resourcehelper"
4041
"github.com/openshift/library-go/pkg/operator/resource/resourcemerge"
4142
"github.com/openshift/library-go/pkg/operator/resource/resourceread"
4243
"github.com/openshift/library-go/pkg/operator/resourcesynccontroller"
@@ -686,12 +687,32 @@ func GetKubeControllerManagerArgs(config map[string]interface{}) []string {
686687
}
687688

688689
func manageServiceAccountCABundle(ctx context.Context, lister corev1listers.ConfigMapLister, client corev1client.ConfigMapsGetter, recorder events.Recorder) (*corev1.ConfigMap, bool, error) {
689-
requiredConfigMap, err := resourcesynccontroller.CombineCABundleConfigMaps(
690-
resourcesynccontroller.ResourceLocation{Namespace: operatorclient.TargetNamespace, Name: "serviceaccount-ca"},
690+
additionalAnnotations := certrotation.AdditionalAnnotations{
691+
JiraComponent: "kube-controller-manager",
692+
}
693+
caBundleConfigMapName := "serviceaccount-ca"
694+
695+
creationRequired := false
696+
updateRequired := false
697+
698+
caBundleConfigMap, err := lister.ConfigMaps(operatorclient.TargetNamespace).Get(caBundleConfigMapName)
699+
switch {
700+
case apierrors.IsNotFound(err):
701+
creationRequired = true
702+
caBundleConfigMap = &corev1.ConfigMap{
703+
ObjectMeta: metav1.ObjectMeta{
704+
Name: caBundleConfigMapName,
705+
Namespace: operatorclient.TargetNamespace,
706+
},
707+
}
708+
case err != nil:
709+
return nil, false, err
710+
}
711+
712+
requiredConfigMap, updateRequired, err := resourcesynccontroller.CombineCABundleConfigMapsOptimistically(
713+
caBundleConfigMap,
691714
lister,
692-
certrotation.AdditionalAnnotations{
693-
JiraComponent: "kube-controller-manager",
694-
},
715+
additionalAnnotations,
695716
// include the ca bundle needed to recognize the server
696717
resourcesynccontroller.ResourceLocation{Namespace: operatorclient.GlobalMachineSpecifiedConfigNamespace, Name: "kube-apiserver-server-ca"},
697718
// include the ca bundle needed to recognize default
@@ -701,17 +722,56 @@ func manageServiceAccountCABundle(ctx context.Context, lister corev1listers.Conf
701722
if err != nil {
702723
return nil, false, err
703724
}
704-
return resourceapply.ApplyConfigMap(ctx, client, recorder, requiredConfigMap)
725+
726+
if creationRequired {
727+
caBundleConfigMap, err = client.ConfigMaps(operatorclient.TargetNamespace).Create(ctx, requiredConfigMap, metav1.CreateOptions{})
728+
resourcehelper.ReportCreateEvent(recorder, caBundleConfigMap, err)
729+
if err != nil {
730+
return nil, false, err
731+
}
732+
klog.V(2).Infof("Created serviceaccount CA bundle configmap %s/%s", caBundleConfigMap.Namespace, caBundleConfigMap.Name)
733+
return caBundleConfigMap, true, nil
734+
} else if updateRequired {
735+
caBundleConfigMap, err = client.ConfigMaps(operatorclient.TargetNamespace).Update(ctx, requiredConfigMap, metav1.UpdateOptions{})
736+
resourcehelper.ReportUpdateEvent(recorder, caBundleConfigMap, err)
737+
if err != nil {
738+
return nil, false, err
739+
}
740+
klog.V(2).Infof("Updated serviceaccount CA bundle configmap %s/%s", caBundleConfigMap.Namespace, caBundleConfigMap.Name)
741+
return caBundleConfigMap, true, nil
742+
}
743+
744+
return caBundleConfigMap, false, nil
705745
}
706746

707747
func ManageCSRCABundle(ctx context.Context, lister corev1listers.ConfigMapLister, client corev1client.ConfigMapsGetter, recorder events.Recorder) (*corev1.ConfigMap, bool, error) {
708-
requiredConfigMap, err := resourcesynccontroller.CombineCABundleConfigMaps(
709-
resourcesynccontroller.ResourceLocation{Namespace: operatorclient.OperatorNamespace, Name: "csr-controller-ca"},
748+
additionalAnnotations := certrotation.AdditionalAnnotations{
749+
JiraComponent: "kube-controller-manager",
750+
Description: "CA to recognize the CSRs (both serving and client) signed by the kube-controller-manager.",
751+
}
752+
caBundleConfigMapName := "csr-controller-ca"
753+
754+
creationRequired := false
755+
updateRequired := false
756+
757+
caBundleConfigMap, err := lister.ConfigMaps(operatorclient.OperatorNamespace).Get(caBundleConfigMapName)
758+
switch {
759+
case apierrors.IsNotFound(err):
760+
creationRequired = true
761+
caBundleConfigMap = &corev1.ConfigMap{
762+
ObjectMeta: metav1.ObjectMeta{
763+
Name: caBundleConfigMapName,
764+
Namespace: operatorclient.OperatorNamespace,
765+
},
766+
}
767+
case err != nil:
768+
return nil, false, err
769+
}
770+
771+
requiredConfigMap, updateRequired, err := resourcesynccontroller.CombineCABundleConfigMapsOptimistically(
772+
caBundleConfigMap,
710773
lister,
711-
certrotation.AdditionalAnnotations{
712-
JiraComponent: "kube-controller-manager",
713-
Description: "CA to recognize the CSRs (both serving and client) signed by the kube-controller-manager.",
714-
},
774+
additionalAnnotations,
715775
// include the CA we use to sign CSRs
716776
resourcesynccontroller.ResourceLocation{Namespace: operatorclient.OperatorNamespace, Name: "csr-signer-ca"},
717777
// include the CA we use to sign the cert key pairs from from csr-signer
@@ -720,7 +780,25 @@ func ManageCSRCABundle(ctx context.Context, lister corev1listers.ConfigMapLister
720780
if err != nil {
721781
return nil, false, err
722782
}
723-
return resourceapply.ApplyConfigMap(ctx, client, recorder, requiredConfigMap)
783+
if creationRequired {
784+
caBundleConfigMap, err = client.ConfigMaps(operatorclient.OperatorNamespace).Create(ctx, requiredConfigMap, metav1.CreateOptions{})
785+
resourcehelper.ReportCreateEvent(recorder, caBundleConfigMap, err)
786+
if err != nil {
787+
return nil, false, err
788+
}
789+
klog.V(2).Infof("Created CSR CA bundle configmap %s/%s", caBundleConfigMap.Namespace, caBundleConfigMap.Name)
790+
return caBundleConfigMap, true, nil
791+
} else if updateRequired {
792+
caBundleConfigMap, err = client.ConfigMaps(operatorclient.OperatorNamespace).Update(ctx, requiredConfigMap, metav1.UpdateOptions{})
793+
resourcehelper.ReportUpdateEvent(recorder, caBundleConfigMap, err)
794+
if err != nil {
795+
return nil, false, err
796+
}
797+
klog.V(2).Infof("Updated CSR CA bundle configmap %s/%s", caBundleConfigMap.Namespace, caBundleConfigMap.Name)
798+
return caBundleConfigMap, true, nil
799+
}
800+
801+
return caBundleConfigMap, false, nil
724802
}
725803

726804
func ManageCSRSigner(ctx context.Context, lister corev1listers.SecretLister, client corev1client.SecretsGetter, recorder events.Recorder) (*corev1.Secret, time.Duration, bool, error) {

0 commit comments

Comments
 (0)