[k8s]I try to assign one pod to the normal pod,and the others on spot node by using podAntiAffinity [k8s]I try to assign one pod to the normal pod,and the others on spot node by using podAntiAffinity kubernetes kubernetes

[k8s]I try to assign one pod to the normal pod,and the others on spot node by using podAntiAffinity


If you want to deploy pods on all nodes then you have to change your preferredDuringSchedulingIgnoredDuringExecution.

Change

preferredDuringSchedulingIgnoredDuringExecution:          - weight: 70            preference:              matchExpressions:              - key: ikind                operator: In                values:                - spot

to

preferredDuringSchedulingIgnoredDuringExecution:              - weight: 70                preference:                  matchExpressions:                  - key: ikind                    operator: In                    values:                    - spot                    - normal

Now it will be deployed on both nodes, with ikind:spot and ikind:normal, before it was only spot.

I have tested it on 3 gke nodes and everything seems working just fine.

pod-test-54dc97fbcb-9hvvm   1/1     Running       gke-cluster-1-default-pool-1ffaf1b8-gmhb   <none>           <none>pod-test-54dc97fbcb-k2hv2   1/1     Running       gke-cluster-1-default-pool-1ffaf1b8-gmhb   <none>           <none>pod-test-54dc97fbcb-nqd97   1/1     Running       gke-cluster-1-default-pool-1ffaf1b8-7c25   <none>           <none>pod-test-54dc97fbcb-zq9df   1/1     Running       gke-cluster-1-default-pool-1ffaf1b8-jk6t   <none>           <none>pod-test-54dc97fbcb-zvwhk   1/1     Running        gke-cluster-1-default-pool-1ffaf1b8-7c25   <none>           <none>

It's well described here

apiVersion: v1kind: Podmetadata:  name: with-node-affinityspec:  affinity:    nodeAffinity:      requiredDuringSchedulingIgnoredDuringExecution:        nodeSelectorTerms:        - matchExpressions:          - key: kubernetes.io/e2e-az-name            operator: In            values:            - e2e-az1            - e2e-az2      preferredDuringSchedulingIgnoredDuringExecution:      - weight: 1        preference:          matchExpressions:          - key: another-node-label-key            operator: In            values:            - another-node-label-value  containers:  - name: with-node-affinity    image: k8s.gcr.io/pause:2.0

This node affinity rule says the pod can only be placed on a node with a label whose key is kubernetes.io/e2e-az-name and whose value is either e2e-az1 or e2e-az2. In addition, among nodes that meet that criteria, nodes with a label whose key is another-node-label-key and whose value is another-node-label-value should be preferred.


I add the node prefer matchExpressions to normal and give weight 30,and it works.In order to avoid the influence of the node nums,i change the weight of the normal and spot.

When replicas is 1,there is 1 pod in normal node

When replicas is 2,there is 1 pod in normal node and 1 pod in spot node

When replicas is 3,there is 2 pod in normal node and 1 pod in spot node

preferredDuringSchedulingIgnoredDuringExecution: - weight: 70 preference: matchExpressions: - key: ikind operator: In values: - normal - weight: 30 preference: matchExpressions: - key: ikind operator: In values: - spot