节点亲和性

pod.spec.nodeAffinity

  • preferredDuringSchedulingIgnoredDuringExecution:软策略
  • requiredDuringSchedulingIgnoredDuringExecution:硬策略
requiredDuringSchedulingIgnoredDuringExecution(硬亲和)

例子:节点强制不在node2上调度

[root@master scheduler]# cat node-affinity.yml
apiVersion: v1
kind: Pod
metadata:
  name: affinity
  labels:
    app: node-affinity-pod
spec:
  containers:
  - name: with-node-affinity
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: NotIn
            values:
            - node2

结果调度到node1上(多次删除pod,重新调度仍会调度到node1):

[root@master scheduler]# kubectl get pod -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
affinity   1/1     Running   0          16s   10.244.1.42   node1   <none>           <none>

硬亲和情况下,让pod调度到node3(节点不存在),会一直处于pendding状态。

preferredDuringSchedulingIgnoredDuringExecution(软亲和)

例子:让pod尽量调度到node2节点(多次删除多次重建,仍然调度到node2)

[root@master scheduler]# cat node-prefer-affinity.yml
apiVersion: v1
kind: Pod
metadata:
  name: affinity
  labels:
    app: node-affinity-pod
spec:
  containers:
  - name: with-node-affinity
    image: nginx
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
       - weight: 1
         preference:
          matchExpressions: 
          - key: kubernetes.io/hostname
            operator: In
            values:
            - node2

软亲和情况下当让它调度到node3(此节点不存在),仍然会选一个一节点调度并部署。

合体:

[root@master scheduler]# cat affinin.yml 
apiVersion: v1
kind: Pod
metadata:
  name: affinity
  labels:
    app: node-affinity-pod
spec:
  containers:
 - name: with-node-affinity
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: NotIn
            values:
            - node02
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: source
            operator: In
            values:
            - qikqiak

键值运算关系:

  • In:label 的值在某个列表中
  • NotIn:label 的值不在某个列表中
  • Gt:label 的值大于某个值
  • Lt:label的值小于某个值
  • Exists:某个 label 存在
  • DoesNotExist:某个 label 不存在

Pod 亲和性

pod.spec.affinity.podAffinity/podAntiAffinity

  • preferredDuringSchedulingIgnoredDuringExecution:软策略
  • requiredDuringSchedulingIgnoredDuringExecution:硬策略
    例子:
    先启动两个简单的pod-1,pod-2
vim pod-1.yml
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
    app: pod-1
spec:
  containers:
  - name: pod-1
    image: nginx
vim pod-2.yml
apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  labels:
    app: pod-2
spec:
  containers:
  - name: pod-2
    image: nginx
kubectl apply -f pod-1.yml
kubectl apply -f pod-2.yml

查看调度结果pod-1在node1,pod-2在node2:

[root@master pod-affinity]# kubectl get pod -o wide
NAME    READY   STATUS              RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
pod-1   1/1     Running             0          42s   10.244.1.47   node1   <none>           <none>
pod-2   1/1     Running             0          38s   10.244.2.46   node2   <none>           <none>

启动具有亲和性的pod-3(亲pod-1,远离pod-2)

[root@master pod-affinity]# cat pod-affinity.yml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-3
  labels:
    app: pod-3
spec:
  containers:
  - name: pod-3
    image: nginx
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - pod-1
        topologyKey: kubernetes.io/hostname
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - pod-2
          topologyKey: kubernetes.io/hostname
 kubectl apply -f pod-affinity.yml

结果:pod-3调度到和pod-1相同的节点node1上,不在pod-2调度的节点node2

[root@master pod-affinity]# kubectl get pod -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
pod-1   1/1     Running   0          47s   10.244.1.47   node1   <none>           <none>
pod-2   1/1     Running   0          43s   10.244.2.46   node2   <none>           <none>
pod-3   1/1     Running   0          16s   10.244.1.48   node1   <none>           <none>

亲和性/反亲和性调度策略比较如下:

调度策略匹配标签操作符拓扑域支持调度目标
nodeAffinity主机In, NotIn, Exists,DoesNotExist, Gt, Lt指定主机
podAffinityPODIn, NotIn, Exists,DoesNotExistPOD与指定POD同一拓扑域
podAnitAffinityPODIn, NotIn, Exists,DoesNotExistPOD与指定POD不在同一拓扑域
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐