CCM migration

This manual explains how to migrate to using external Cloud Controller Managers for supporting providers.

Cloud Controller Manager (CCM)

The CCM (Cloud Controller Manager) is a Kubernetes control plane component that embeds cloud-specific control logic. There are two different kinds of Cloud controller managers: in-tree and out-of-tree. According to the Kubernetes design proposal, the in-tree code is “code that lives in the core Kubernetes repository k8s.io/kubernetes”, while the out-of-tree code is “code that lives in an external repository outside of k8s.io/kubernetes”.

The first cloud-specific interaction logic was completely in-tree, bringing in a not-negligible amount of problems, among which the dependency of the CCM release cycle from the Kubernetes core release cycle and the difficulty to add new providers to the Kubernetes core code. Then, the Kubernetes community moved toward the out-of-tree implementation by introducing a plugin mechanism that allows different cloud providers to integrate their platforms with Kubernetes.

Out-of-tree CCM migration

Since the Kubernetes community has planned to deprecate and then remove all the code related to in-tree cloud controller managers and the Kubernetes documentation explain how to migrate from in-tree to out-of-tree CCM, KKP itself needed a mechanism to allow users to migrate their clusters to the out-of-tree implementation, as detailed below.

The CCM/CSI migration is supported only for the following providers so far:

  • Openstack
  • vSphere

Enabling the external cloud provider

The migration is specific per user cluster, meaning that it is activated by the externalCloudProvider feature in the cluster spec.

apiVersion: kubermatic.k8s.io/v1
kind: Cluster
metadata:
  name: crh4xbxz5f
spec:
...
  exposeStrategy: NodePort
  features:
    externalCloudProvider: true
  humanReadableName: determined-raman
...

When this feature gets enabled in a cluster belonging to a supported cloud provider, a mutating webhook patches the cluster by adding two different annotations, producing the following cluster:

apiVersion: kubermatic.k8s.io/v1
kind: Cluster
metadata:
  annotations:
    ccm-migration.k8c.io/migration-needed: ""
    csi-migration.k8c.io/migration-needed: ""
  name: crh4xbxz5f
spec:
...
  exposeStrategy: NodePort
  features:
    externalCloudProvider: true
  humanReadableName: determined-raman
...

The addition of the externalCloudProvider feature triggers the following operations:

  • Deployment in the user cluster of the components being part of both the Cloud Controller Manager and the CSI controller manager.
  • Patch of The Machine controller deployment to configure the external cloud provider for the new machines.
  • Addition of a condition related to the ccm migration to the cluster status.

Finalize the CCM migration

The last step to complete the CCM migration is the rolling restart of all the machineDeployments in the user cluster. To do so via cli, simply follow the guide in the machine-controller documentation.

Performing the rolling update of all the machineDeployments implies the deletion of all the machines (hence all the nodes) and their recreation. Since the MachineController has been patched to configure the external cloud provider for the new machines, all the recreated machines will be configured to use the out-of-tree CCM. You can check this condition by verifying that the new machines have the ExternalCloudProvider annotation:

apiVersion: cluster.k8s.io/v1alpha1
kind: Machine
metadata:
  annotations:
    forceRestart: "1627548987807804576"
    v1.kubelet-featuregates.machine-controller.kubermatic.io/RotateKubeletServerCertificate: "true"
    v1.kubelet-flags.machine-controller.kubermatic.io/ExternalCloudProvider: "true"
  creationTimestamp: "2021-07-29T08:56:47Z"
...

Once all the machineDeployments are rolled out, and the new machines have the aforementioned annotation, the cluster condition CSIKubeletMigrationCompleted will be set to true, and the migration is considered completed.

Disabling the external CCM

Since the Kubernetes community is on the way to deprecating in-tree CCM, once the externalCloudProvider feature gets enabled, it cannot be disabled.