关键词:

① requiredDuringSchedulingIgnoredDuringExecution:表示强匹配,必须要满足

② preferredDuringSchedulingIgnoredDuringExecution:表示弱匹配,尽可能满足,但不保证

官方示例:

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:  ##必须满足下面匹配规则
        nodeSelectorTerms:
        - matchExpressions:
          - key: env
            operator: In  ##逻辑运算符支持:In,NotIn,Exists,DoesNotExist,Gt,Lt
            values:
            - test
            - dev
      preferredDuringSchedulingIgnoredDuringExecution: ##尽可能满足,但不保证
      - weight: 1
        preference:
          matchExpressions:
          - key: project
            operator: In
            values:
            - aminglinux
  containers:
  - name: with-node-affinity
    image: redis:6.0.6

说明:

匹配逻辑:

① 同时指定Node Selector和Node Affinity,两者必须同时满足;

② Node Affinity中指定多组nodeSelectorTerms,只需要一组满足就可以;

③ 当在nodeSelectorTerms中包含多组matchExpressions,必须全部满足才可以;

演示示例:

1、定义pod的yaml

$ cat > nodeAffinity.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: node-affinity
spec:
  containers:
    - name: my-container
      image: nginx:1.21.6
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: special-node
                operator: Exists
EOF

2、给k8s-master02节点定义标签

$ k label nodes k8s-master02 special-node=true

3、应用YAML

$ k apply -f nodeAffinity.yaml

4、检查Pod所在node,符合节点亲和性

$ k get po -o wide | grep node-affinity

node-affinity                   1/1     Running   0              4s     172.25.92.79     k8s-master02   <none>           <none>

5、恢复

$ k delete  -f nodeAffinity.yaml