From b498e9de1113272def971adc7967f92b23999a1a Mon Sep 17 00:00:00 2001 From: Daman Arora Date: Thu, 15 Oct 2026 08:00:52 -0400 Subject: [PATCH 1/2] fix cks cluster stuck starting when a private registry is set --- .../src/main/resources/conf/k8s-control-node.yml | 3 --- .../KubernetesClusterActionWorkerTest.java | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/plugins/integrations/kubernetes-service/src/main/resources/conf/k8s-control-node.yml b/plugins/integrations/kubernetes-service/src/main/resources/conf/k8s-control-node.yml index 4db349ac778a..c7c670e59e90 100644 --- a/plugins/integrations/kubernetes-service/src/main/resources/conf/k8s-control-node.yml +++ b/plugins/integrations/kubernetes-service/src/main/resources/conf/k8s-control-node.yml @@ -1,4 +1,3 @@ -## template: jinja #cloud-config # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -358,7 +357,6 @@ write_files: sudo touch /home/cloud/success echo "true" > /home/cloud/success - {% if registry is defined %} - path: /opt/bin/setup-containerd permissions: '0755' owner: root:root @@ -376,7 +374,6 @@ write_files: echo "Restarting containerd service" systemctl daemon-reload systemctl restart containerd - {% endif %} - path: /etc/systemd/system/deploy-kube-system.service permissions: '0755' diff --git a/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorkerTest.java b/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorkerTest.java index a25ec55cc04a..f085fc17506c 100644 --- a/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorkerTest.java +++ b/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorkerTest.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.kubernetes.cluster.actionworkers; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -229,4 +230,19 @@ public void testGetMergedAffinityGroupIdsExplicitDedicationAlreadyInList() { Assert.assertTrue(result.contains(99L)); Assert.assertTrue(result.contains(2L)); } + + @Test + public void testUpdateKubeConfigWithRegistryDetailsControlNodeWritesSetupScript() throws IOException { + List details = Arrays.asList( + new KubernetesClusterDetailsVO(DEFAULT_ID, ApiConstants.DOCKER_REGISTRY_USER_NAME, "user", true), + new KubernetesClusterDetailsVO(DEFAULT_ID, ApiConstants.DOCKER_REGISTRY_PASSWORD, "pass", false), + new KubernetesClusterDetailsVO(DEFAULT_ID, ApiConstants.DOCKER_REGISTRY_URL, "https://index.docker.io/v1/", true)); + Mockito.when(kubernetesClusterDetailsDao.listDetails(DEFAULT_ID)).thenReturn(details); + String config = actionWorker.updateKubeConfigWithRegistryDetails(actionWorker.readResourceFile("conf/k8s-control-node.yml")); + Assert.assertTrue(config.startsWith("#cloud-config")); + Assert.assertFalse(config.contains("{%")); + Assert.assertTrue(config.contains("- path: /opt/bin/setup-containerd")); + Assert.assertTrue(config.contains("- bash -x /opt/bin/setup-containerd")); + Assert.assertTrue(config.contains("registry.mirrors.\\\"index.docker.io/v1/\\\"")); + } } From 4d36ebe8a8569b767f818b49005776ea4074927d Mon Sep 17 00:00:00 2001 From: Daman Arora Date: Thu, 15 Oct 2026 14:20:23 -0400 Subject: [PATCH 2/2] keep the jinja header and let the server fill in the registry check --- .../KubernetesClusterActionWorker.java | 5 ++++- .../src/main/resources/conf/k8s-control-node.yml | 3 +++ .../KubernetesClusterActionWorkerTest.java | 13 +++++++++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java index 4fcf6fa7686d..e259a5ea5b6e 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java @@ -999,7 +999,10 @@ protected String updateKubeConfigWithRegistryDetails(String k8sConfig) { } } - if (StringUtils.isNoneEmpty(registryUsername, registryPassword, registryUrl)) { + final String registryEnabledKey = "{{ registry.enabled }}"; + boolean registryEnabled = StringUtils.isNoneEmpty(registryUsername, registryPassword, registryUrl); + k8sConfig = k8sConfig.replace(registryEnabledKey, String.valueOf(registryEnabled)); + if (registryEnabled) { // Update runcmd in the cloud-init configuration to run a script that updates the containerd config with provided registry details String runCmd = "- bash -x /opt/bin/setup-containerd"; diff --git a/plugins/integrations/kubernetes-service/src/main/resources/conf/k8s-control-node.yml b/plugins/integrations/kubernetes-service/src/main/resources/conf/k8s-control-node.yml index c7c670e59e90..829ccede81a3 100644 --- a/plugins/integrations/kubernetes-service/src/main/resources/conf/k8s-control-node.yml +++ b/plugins/integrations/kubernetes-service/src/main/resources/conf/k8s-control-node.yml @@ -1,3 +1,4 @@ +## template: jinja #cloud-config # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -357,6 +358,7 @@ write_files: sudo touch /home/cloud/success echo "true" > /home/cloud/success + {% if "{{ registry.enabled }}" == "true" %} - path: /opt/bin/setup-containerd permissions: '0755' owner: root:root @@ -374,6 +376,7 @@ write_files: echo "Restarting containerd service" systemctl daemon-reload systemctl restart containerd + {% endif %} - path: /etc/systemd/system/deploy-kube-system.service permissions: '0755' diff --git a/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorkerTest.java b/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorkerTest.java index f085fc17506c..787b5dbbf6df 100644 --- a/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorkerTest.java +++ b/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorkerTest.java @@ -239,10 +239,19 @@ public void testUpdateKubeConfigWithRegistryDetailsControlNodeWritesSetupScript( new KubernetesClusterDetailsVO(DEFAULT_ID, ApiConstants.DOCKER_REGISTRY_URL, "https://index.docker.io/v1/", true)); Mockito.when(kubernetesClusterDetailsDao.listDetails(DEFAULT_ID)).thenReturn(details); String config = actionWorker.updateKubeConfigWithRegistryDetails(actionWorker.readResourceFile("conf/k8s-control-node.yml")); - Assert.assertTrue(config.startsWith("#cloud-config")); - Assert.assertFalse(config.contains("{%")); + Assert.assertTrue(config.startsWith("## template: jinja")); + Assert.assertTrue(config.contains("{% if \"true\" == \"true\" %}")); Assert.assertTrue(config.contains("- path: /opt/bin/setup-containerd")); Assert.assertTrue(config.contains("- bash -x /opt/bin/setup-containerd")); Assert.assertTrue(config.contains("registry.mirrors.\\\"index.docker.io/v1/\\\"")); } + + @Test + public void testUpdateKubeConfigWithRegistryDetailsControlNodeNoRegistry() throws IOException { + Mockito.when(kubernetesClusterDetailsDao.listDetails(DEFAULT_ID)).thenReturn(new ArrayList<>()); + String config = actionWorker.updateKubeConfigWithRegistryDetails(actionWorker.readResourceFile("conf/k8s-control-node.yml")); + Assert.assertTrue(config.contains("{% if \"false\" == \"true\" %}")); + Assert.assertFalse(config.contains("{{ registry.enabled }}")); + Assert.assertFalse(config.contains("- bash -x /opt/bin/setup-containerd")); + } }