亲和性/反亲和性调度策略

调度策略 匹配标签 操作符 拓扑域支持 调度目标
nodeAffinity 主机 In、NotIn、Exists、DoesNotExist、Gt、Lt 指定主机
podAffinity Pod In、NotIn、Exists、DoesNotExist Pod 与指定 Pod 在同一个拓扑域
podAnitAffinity Pod In、NotIn、Exists、DoesNotExist Pod 与 指定 Pod 不在同一个拓扑域

键值运算关系 affinity.nodeAffinity.nodeSelectorTerms.operator

operator

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


一、 节点亲和性 pod.spec.nodeAffinity

pod.spec.nodeAffinity

  • preferredDuringSchedulingIgnoredDuringExecution:软策略
  • requiredDuringSchedulingIgnoredDuringExecution:硬策略

硬策略案例:

node节点亲和性,node选择方案,通过键名匹配键值进行选择。

选择 kubernetes.io/hostname != k8s-node2 的节点进行匹配。

这个节点运行后只会在 Node1 上运行,排除Node2

apiVersion: v1	
kind: Pod
metadata: 
  name: affinity
  labels: 
    app: node-affinity-pod
spec:	
 containers:
   - name: nginx
     image: nginx:1.9.1
 affinity: 	#亲和性
   nodeAffinity: #node节点亲和性
     requiredDuringSchedulingIgnoredDuringExecution:  	#硬策略限制
       nodeSelectorTerms: 	#node选择方案
         - matchExpressions: 	
           - key: kubernetes.io/hostname	#键名是 kubernetes.io/hostname=
             operator: NotIn	# 运算关系: 不在,不是
             values: 			
               - k8s-node2		# key的值,不是k8s-node2即可。

kubectl get pod -o wide 查看节点,不论删除几次再创建都只会是 node1 节点。

在这里插入图片描述

软策略案例:

如果有则进行匹配,没有也不强行匹配。k8s会找一个合适的节点自行匹配。

案例当中的 K8S 集群没有node3 节点,则自行匹配至 node1 节点。

apiVersion: v1	
kind: Pod
metadata: 
  name: affinity
  labels: 
    app: node-affinity-pod
spec:	
 containers:
   - name: nginx
     image: nginx:1.9.1
 affinity: 				#亲和性
   nodeAffinity:		#node节点亲和性
     preferredDuringSchedulingIgnoredDuringExecution:  	#软策略限制
       - weight: 1		#权重为1,如果有多个不同的软策略,则根据权重高的来进行匹配
         preference: 	
           - matchExpressions: 	#匹配规则
             - key: kubernetes.io/hostname	#键名是 kubernetes.io/hostname=
               operator: In		# 运算关系: 是,在
               values: 			
                - k8s-node3		# key的值,最好是k8s-node3,如果没有node3则在其他节点运行。

kubectl get pod -o wide
在这里插入图片描述

硬策略+软策略合并匹配

先满足硬策略,再满足软策略

apiVersion: v1	
kind: Pod
metadata: 
  name: affinity
  labels: 
    app: node-affinity-pod
spec:	
 containers:
   - name: nginx
     image: nginx:1.9.1
 affinity: 					#亲和性
   nodeAffinity: 			#node节点亲和性
     requiredDuringSchedulingIgnoredDuringExecution:  	#硬策略限制
       nodeSelectorTerms: 	#node选择方案
         - matchExpressions: 	
           - key: kubernetes.io/hostname	#键名是 kubernetes.io/hostname=
             operator: NotIn	# 运算关系: 不在,不是
             values: 			
               - k8s-node2		# key的值,不是k8s-node2即可。
     preferredDuringSchedulingIgnoredDuringExecution: 	#软策略限制
       - weight: 1			#权重1
         preference: 		
           matchExpressions: 	#匹配规则
             - key: kubernetes.io/os	# 键名kubernetes.io/os
               operator: In				# 是,在
               values: 					
                - linux					# 匹配 os 是 linux

二、Pod 亲和性 podAffinity

pod.spec.affinity.podAffinity/podAntiAffinity

  • preferredDuringSchedulingIgnoredDuringExecution:软策略
  • requiredDuringSchedulingIgnoredDuringExecution:硬策略

硬、软策略示例:

根据不同的节点标签 app ,来进行匹配

apiVersion: v1
kind: Pod
metadata: 
  name: pod-3
  labels: 
    app: pod-3
spec: 
  containers: 
    - name: pod-3
      image: nginx:1.9.1
  affinity:			#亲和性
    podAffinity: 	#Pod亲和性,运行在同一个 Pod
      requiredDuringSchedulingIgnoredDuringExecution: 	#硬限制策略
        - labelSelector: 		#标签匹配
             matchExpressions:  #匹配规则,如果有 app=pod-1,则运行在该Pod
               - key: app		#当app的值
                 operator: In 	#是
                 values: 
                   - node1		#是node1,则进行匹配
          topologyKey: kubernetes.io/hostname	#通过hostname标签进行判断
apiVersion: v1
kind: Pod
metadata: 
  name: pod-3
  labels: 
    app: pod-3
spec: 
  containers: 
    - name: pod-3
      image: nginx:1.9.1
  affinity:	
    PodAntiAffinity: #Pod亲和性,必须不在同一个节点
      preferredDuringSchedulingIgnoreDuringExectuion: 	#软策略
        - weight: 1				#权重
          podAffinityTerm: 		
            labelSelector: 
              matchExpressions: #如果有 app=node2 则不运行在该 node2 节点运行。
                - key: app
                  operator: In
                  values: 
                    - node2
            topologykey: kubernetes.io/hostname 

查看节点标签:kubectl get pod --show-labels

修改标签:(将 Pod-node1的 app 标签修改成 node2)

kubectl label pod node1 app=node2 --overwrite

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐