@@ -27,6 +27,7 @@ import (
2727
2828 "github.com/spf13/pflag"
2929 corev1 "k8s.io/api/core/v1"
30+ apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
3031 "k8s.io/apimachinery/pkg/labels"
3132 "k8s.io/apimachinery/pkg/runtime"
3233 "k8s.io/apimachinery/pkg/selection"
@@ -50,6 +51,7 @@ import (
5051 kubeadmbootstrapcontrollers "sigs.k8s.io/cluster-api/bootstrap/kubeadm/controllers"
5152 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/internal/webhooks"
5253 "sigs.k8s.io/cluster-api/controllers/clustercache"
54+ "sigs.k8s.io/cluster-api/controllers/crdmigrator"
5355 "sigs.k8s.io/cluster-api/controllers/remote"
5456 expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
5557 "sigs.k8s.io/cluster-api/feature"
@@ -90,11 +92,13 @@ var (
9092 clusterConcurrency int
9193 clusterCacheConcurrency int
9294 kubeadmConfigConcurrency int
95+ skipCRDMigrationPhases []string
9396 tokenTTL time.Duration
9497)
9598
9699func init () {
97100 _ = clientgoscheme .AddToScheme (scheme )
101+ _ = apiextensionsv1 .AddToScheme (scheme )
98102 _ = clusterv1 .AddToScheme (scheme )
99103 _ = expv1 .AddToScheme (scheme )
100104 _ = bootstrapv1alpha3 .AddToScheme (scheme )
@@ -140,6 +144,9 @@ func InitFlags(fs *pflag.FlagSet) {
140144 fs .IntVar (& kubeadmConfigConcurrency , "kubeadmconfig-concurrency" , 10 ,
141145 "Number of kubeadm configs to process simultaneously" )
142146
147+ fs .StringArrayVar (& skipCRDMigrationPhases , "skip-crd-migration-phases" , []string {},
148+ "List of CRD migration phases to skip. Valid values are: StorageVersionMigration, CleanupManagedFields." )
149+
143150 fs .DurationVar (& syncPeriod , "sync-period" , 10 * time .Minute ,
144151 "The minimum interval at which watched resources are reconciled (e.g. 15m)" )
145152
@@ -181,6 +188,11 @@ func InitFlags(fs *pflag.FlagSet) {
181188// Add RBAC for the authorized diagnostics endpoint.
182189// +kubebuilder:rbac:groups=authentication.k8s.io,resources=tokenreviews,verbs=create
183190// +kubebuilder:rbac:groups=authorization.k8s.io,resources=subjectaccessreviews,verbs=create
191+ // ADD CRD RBAC for CRD Migrator.
192+ // +kubebuilder:rbac:groups=apiextensions.k8s.io,resources=customresourcedefinitions,verbs=get;list;watch
193+ // +kubebuilder:rbac:groups=apiextensions.k8s.io,resources=customresourcedefinitions;customresourcedefinitions/status,verbs=update;patch,resourceNames=kubeadmconfigs.bootstrap.cluster.x-k8s.io;kubeadmconfigtemplates.bootstrap.cluster.x-k8s.io
194+ // ADD CR RBAC for CRD Migrator.
195+ // +kubebuilder:rbac:groups=bootstrap.cluster.x-k8s.io,resources=kubeadmconfigtemplates,verbs=get;list;watch;patch;update
184196
185197func main () {
186198 InitFlags (pflag .CommandLine )
@@ -340,6 +352,27 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) {
340352 os .Exit (1 )
341353 }
342354
355+ crdMigratorSkipPhases := []crdmigrator.Phase {}
356+ for _ , p := range skipCRDMigrationPhases {
357+ crdMigratorSkipPhases = append (crdMigratorSkipPhases , crdmigrator .Phase (p ))
358+ }
359+ if err := (& crdmigrator.CRDMigrator {
360+ Client : mgr .GetClient (),
361+ APIReader : mgr .GetAPIReader (),
362+ SkipCRDMigrationPhases : crdMigratorSkipPhases ,
363+ // Note: The kubebuilder RBAC markers above has to be kept in sync
364+ // with the CRDs that should be migrated by this provider.
365+ Config : map [client.Object ]crdmigrator.ByObjectConfig {
366+ & bootstrapv1.KubeadmConfig {}: {UseCache : true },
367+ & bootstrapv1.KubeadmConfigTemplate {}: {UseCache : false },
368+ },
369+ // The CRDMigrator is run with only concurrency 1 to ensure we don't overwhelm the apiserver by patching a
370+ // lot of CRs concurrently.
371+ }).SetupWithManager (ctx , mgr , concurrency (1 )); err != nil {
372+ setupLog .Error (err , "Unable to create controller" , "controller" , "CRDMigrator" )
373+ os .Exit (1 )
374+ }
375+
343376 if err := (& kubeadmbootstrapcontrollers.KubeadmConfigReconciler {
344377 Client : mgr .GetClient (),
345378 SecretCachingClient : secretCachingClient ,
0 commit comments