Anti-affinity rule for K8s worker nodes is enabled in VMware Telco Cloud Automation by default. Anti-affinity is specific to workload clusters and ensures that the nodes deployed are spread across different hosts.
Consider the following example where a label
node.cluster.x-k8s.io/esxi-host is added to each worker node to indicate the host on which the anti-affinity rule is applied. Based on the node to which anti-affinity is applicable, you can control the anti-affinity rules on that node.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: node.cluster.x-k8s.io/esxi-host
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: nginx
nodeSelector:
"telco.vmware.com/nodepool": "npg-1"
containers:
- name: nginx-server
image: harbor-repo.vmware.com/ecp_snc/nginx:1.23.1
In the preceding example, topologySpreadConstraints is used to control the anti-affinity rules based on the host node.cluster.x-k8s.io/esxi-host and nodeSelector is used to apply the anti-affinity rule within the node pool npg-1.
By default, workload clusters on vSphere and standalone management clusters follow anti-affinity rules to deploy node pool workers and control plane nodes on different ESXi hosts.
The following diagram illustrates the node placements when the anti-affinity rules are enabled. 