CCM Hetzner
Wrapper chart for the upstream hcloud-cloud-controller-manager
chart (dependency aliased to ccm-hetzner, pinned to 1.34.0). Per the chart description, this replaces the
legacy syself/hetzner-cloud-controller-manager fork — upstream gained Hetzner Robot (bare-metal) support
and forwards kubelet's --node-ip to InternalIP as of v1.24.0, which the syself fork never did.
Why it's in KubeAid
This one chart directory backs two distinct Argo CD Applications on Hetzner clusters, differentiated only by
values file and nameOverride:
ccm-hetzner— rendered for bare-metal and hybrid modes (HetznerCCMNonSecretTemplateNames). Owns Hetzner Robot (bare-metal) node lifecycle; in hybrid mode its controllers are scoped tocloud-node,cloud-node-lifecycleso it doesn't fightccm-hcloudover Services.ccm-hcloud— rendered for hcloud and hybrid modes (HCloudCCMNonSecretTemplateNames). Owns HCloud node routing/InternalIP and all HCloudLoadBalancerreconciliation.
In a hybrid cluster both run simultaneously in kube-system, each scoped to its own node population.
Prerequisites
HCLOUD_TOKEN/ROBOT_USER/ROBOT_PASSWORDfrom thekube-system/cloud-credentialsSecret thatkubeaid-cliprovisions (pkg/core/hcloud_credentials.go) — this chart'svalues.yamlpoints everysecretKeyRefat that Secret'shcloud/robot-user/robot-passwordkeys (overriding the upstream chart's ownhcloud/tokendefault naming so the existing Secret works unmodified).
Key values / KubeAid-specific configuration
Upstream values live under the ccm-hetzner: key.
nameOverride: ccm-hetzner— matches the syself-era resource name so an in-place chart switch replaces the existing Deployment/ServiceAccount instead of leaving two CCMs racing for ownership ofnode.status.robot.enabled— gates Robot (bare-metal) support;kubeaid-cli's overlay sets ittruefor bare-metal/hybrid andfalseotherwise (upstream defaults it totrue).networking.enabled(defaultfalse) — HCloud private-network pod routing;kubeaid-cliflips this on via--setin hybrid mode (HCloud CPs reaching bare-metal workers over the private network).env.HCLOUD_TOKEN/ROBOT_USER/ROBOT_PASSWORD/networking.network— wired tocloud-credentialsas above (robot-user/robot-passwordmarkedoptional: true).nodeSelector: node-role.kubernetes.io/control-plane: ""— runs on control-plane nodes only.- For the
ccm-hcloudinstance specifically:nameOverride: ccm-hcloud,robot.enabled: false,env.HCLOUD_LOAD_BALANCERS_NETWORK_ZONE, and conditionallyHCLOUD_LOAD_BALANCERS_DISABLE_PUBLIC_NETWORK/HCLOUD_LOAD_BALANCERS_USE_PRIVATE_IPdepending on cluster topology (workload-behind-VPN, private nodes).
Operational notes
- Both instances mirror the
node.kubernetes.io/not-ready:Exists:NoScheduletoleration the bootstrappostKubeadmstep sets, so Argo CD's desired state matches and doesn't strip it on the next sync — CCM itself must be able to schedule before it clearsnode.cloudprovider.kubernetes.io/uninitialized. - Switching from the syself fork: the old
ccm-hetzner→cluster-adminClusterRoleBinding is orphaned until Argo CD prunes it (bootstrap-timekubectl applywon't remove it). Acceptable short-term — the orphan grants the same ServiceAccount, so there's no auth regression in the gap.
Docs links
- Upstream project: https://github.com/hetznercloud/hcloud-cloud-controller-manager
- Upstream Helm repo: https://charts.hetzner.cloud
- KubeAid: Helm umbrella pattern