From d7cd55318ceb430729fdfe409da680359508ebd1 Mon Sep 17 00:00:00 2001 From: Daman Arora Date: Mon, 26 Jan 2026 14:56:55 -0500 Subject: [PATCH 1/3] add affinity group support for CKS cluster nodes --- .../plugins/cloudstack-kubernetes-service.rst | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/source/plugins/cloudstack-kubernetes-service.rst b/source/plugins/cloudstack-kubernetes-service.rst index 0682162359..e5fe8864c8 100644 --- a/source/plugins/cloudstack-kubernetes-service.rst +++ b/source/plugins/cloudstack-kubernetes-service.rst @@ -653,6 +653,44 @@ Administrators are able to dedicate hosts to a domain or account. CloudStack wil .. note:: By design the hosts dedication does not consider the deployment of system VMs on the dedicated hosts (SSVM, CPVM and Virtual Routers). In case the Kubernetes cluster is created on an unimplemented network then the Virtual Router of the network will not be deployed on the dedicated hosts. +Affinity groups for CKS cluster nodes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +From 4.23.0 onwards, users can specify host affinity or anti-affinity groups for different types of Kubernetes cluster nodes (control, worker, etcd) during cluster creation. This provides control over VM placement on hosts for high availability requirements. + +To use affinity groups with CKS clusters: + +1. Create the desired affinity groups (host affinity or host anti-affinity) beforehand using the CloudStack UI or API. + +2. When creating a Kubernetes cluster, specify the affinity group mapping using the **nodeaffinitygroups** parameter. This parameter accepts a mapping of node types to affinity group UUIDs with two fields per entry: + + - ``node``: The node type (permitted values: ``worker``, ``control``, ``etcd``) + - ``affinitygroup``: The UUID of the desired affinity group + +Example using the API: + +.. code-block:: bash + + cmk create kubernetescluster name=MyCluster zoneid= kubernetesversionid= serviceofferingid= size=3 nodeaffinitygroups[0].node=worker nodeaffinitygroups[0].affinitygroup= + +Multiple affinity groups can be assigned to a single node type by providing comma-separated UUIDs: + +.. code-block:: bash + + nodeaffinitygroups[0].affinitygroup=, + +Different node types can have different affinity group configurations: + +.. code-block:: bash + + nodeaffinitygroups[0].node=control nodeaffinitygroups[0].affinitygroup= nodeaffinitygroups[1].node=worker nodeaffinitygroups[1].affinitygroup= + +The affinity group configuration is persisted and automatically applied when scaling the cluster - new worker nodes inherit the affinity group settings without requiring additional parameters. + +.. note:: + - When used together with host dedication, affinity group rules are applied within the set of dedicated hosts. + - When adding external worker nodes to an existing cluster using ``addNodesToKubernetesCluster``, the nodes are validated against any worker affinity groups configured for the cluster. + Use diverse CNI plugins (Calico, Cilium, etc) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From d58f4aa92f49ee5fea461bd634c79182b97ff947 Mon Sep 17 00:00:00 2001 From: Daman Arora Date: Mon, 26 Jan 2026 15:00:18 -0500 Subject: [PATCH 2/3] simplify notes --- source/plugins/cloudstack-kubernetes-service.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/source/plugins/cloudstack-kubernetes-service.rst b/source/plugins/cloudstack-kubernetes-service.rst index e5fe8864c8..ea3a064b6c 100644 --- a/source/plugins/cloudstack-kubernetes-service.rst +++ b/source/plugins/cloudstack-kubernetes-service.rst @@ -688,7 +688,6 @@ Different node types can have different affinity group configurations: The affinity group configuration is persisted and automatically applied when scaling the cluster - new worker nodes inherit the affinity group settings without requiring additional parameters. .. note:: - - When used together with host dedication, affinity group rules are applied within the set of dedicated hosts. - When adding external worker nodes to an existing cluster using ``addNodesToKubernetesCluster``, the nodes are validated against any worker affinity groups configured for the cluster. Use diverse CNI plugins (Calico, Cilium, etc) From ac12f4328cee5d02eb3a936bdd1bf23b3c3096dc Mon Sep 17 00:00:00 2001 From: Damans227 <61474540+Damans227@users.noreply.github.com> Date: Tue, 10 Mar 2026 09:18:26 -0400 Subject: [PATCH 3/3] Add screenshot for affinity groups in CKS cluster creation --- .../cks-create-cluster-affinity-groups.png | Bin 0 -> 26989 bytes .../plugins/cloudstack-kubernetes-service.rst | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 source/_static/images/cks-create-cluster-affinity-groups.png diff --git a/source/_static/images/cks-create-cluster-affinity-groups.png b/source/_static/images/cks-create-cluster-affinity-groups.png new file mode 100644 index 0000000000000000000000000000000000000000..469e7a250a384ca33b3e51f90e7e55e55ca475b1 GIT binary patch literal 26989 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 literal 0 HcmV?d00001 diff --git a/source/plugins/cloudstack-kubernetes-service.rst b/source/plugins/cloudstack-kubernetes-service.rst index ea3a064b6c..12921f30f2 100644 --- a/source/plugins/cloudstack-kubernetes-service.rst +++ b/source/plugins/cloudstack-kubernetes-service.rst @@ -658,6 +658,8 @@ Affinity groups for CKS cluster nodes From 4.23.0 onwards, users can specify host affinity or anti-affinity groups for different types of Kubernetes cluster nodes (control, worker, etcd) during cluster creation. This provides control over VM placement on hosts for high availability requirements. +|cks-create-cluster-affinity-groups.png| + To use affinity groups with CKS clusters: 1. Create the desired affinity groups (host affinity or host anti-affinity) beforehand using the CloudStack UI or API. @@ -846,6 +848,8 @@ kubectl delete pod --all -A :alt: Create Kubernetes Cluster form. .. |cks-create-cluster-additional-settings.png| image:: /_static/images/cks-create-cluster-additional-settings.png :alt: Create Kubernetes Cluster form with Advanced Settings. +.. |cks-create-cluster-affinity-groups.png| image:: /_static/images/cks-create-cluster-affinity-groups.png + :alt: Affinity groups selection in Create Kubernetes Cluster Advanced Settings. .. |cks-delete-action.png| image:: /_static/images/cks-delete-action.png :alt: Delete action icon. .. |cks-kube-config-action.png| image:: /_static/images/cks-kube-config-action.png