十分钟搞懂K8S的亲和与反亲和调度( 二 )

3.表达式中的操作符亲和性表达方式需要用到如下几个可选的操作符operator:

  • In:标签的值在某个列表中
  • NotIn:标签的值不在某个列表中
  • Exists:存在某个标签
  • DoesNotExist:不存在某个标签
  • Gt:标签的值大于某个值(字符串比较)
  • Lt:标签的值小于某个值(字符串比较)
这些操作符里 , 虽然没有排斥某个节点的功能,但是用这几个标签也可以变相的实现排斥的功能 。
4.作用域topologyKeytopologyKey很多地方解释为拓扑建,很是费解 。实际上就是个作用域的概念 。
topologyKey配置了一个label的key,那么存在这个key对应的label的所有Node就在同一个作用域里 。
五、实战理论知识讲解完毕,接下来通过实战加深理解 。你可以按照步骤操作实践 。
1.nodeName调度比如要将Pod调度到nodeName是k8s-worker-2的节点上
apiVersion: v1kind: Podmetadata:name: webAppnamespace: demolabels:app: webappspec:nodeName: 'k8s-worker-2'containers:- name: webappimage: Nginxports:- containerPort: 802.nodeSelector调度比如要将Pod调度到具有"special-app"="specialwebapp"的label节点上 。
查看节点信息:
kubectl describe node k8s-worker-2Pod的yaml编排文件:
apiVersion: v1kind: Podmetadata:name: webappnamespace: demolabels:app: webappspec:nodeSelector:# 选择调度到具有这个label的节点"special-app": "specialwebapp"containers:- name: webappimage: nginxports:- containerPort: 80查看Pod被调度到哪台机器上:
kubectl get pod -n demo -o wide3.Node亲和调度Node的亲和调度是指,Node和Pod的关系 。
(1) 硬亲和
定义Pod-Node的硬亲和yaml文件:pod_node_required_affinity.yaml 。文件内容如下:
apiVersion: v1kind: Podmetadata:name: webappnamespace: demolabels:app: webappspec:containers:- name: webappimage: nginxports:- containerPort: 80affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: appoperator: Invalues:- backend给k8s-worker-3节点添加label:
kubectl label node k8s-worker-3 app=backend查看k8s-worker-3节点的label情况:
kubectl get node k8s-worker-3 --show-labels
十分钟搞懂K8S的亲和与反亲和调度

文章插图
执行上面的yaml部署Pod,可以看到Pod已经被调度到k8s-worker-3节点上 。
十分钟搞懂K8S的亲和与反亲和调度

文章插图
(2) 软亲和
软亲和调度 , 主要就是加入了多个规则,每个设置了权重,yaml文件如下:
apiVersion: v1kind: Podmetadata:name: webappnamespace: demolabels:app: webappspec:containers:- name: webappimage: nginxports:- containerPort: 80affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 80preference:matchExpressions:- key: app2operator: Exists- weight: 20preference:matchExpressions:- key: appoperator: Invalues:- backend2删除之前的Pod,删除之前的k8s-worker-3节点的label,再给k8s-worker-2节点的增加app2=backend的label 。
kubectl delete pod webapp -n demokubectl label node k8s-worker-3 app-kubectl label node k8s-worker-2 app2=backend部署上面的软亲和yaml文件,可以看到Pod被调度到了k8s-worker-2节点 。
十分钟搞懂K8S的亲和与反亲和调度

文章插图
4.Pod亲和调度Pod亲和调度,是指Pod和Pod之间的关系 。
(1) 硬亲和
比如Pod1跟随Pod2,Pod2被调度到B节点,那么Pod1也被调度到B节点 。
所以这里准备2个Pod 。Pod1使用上面的例子 , 让Pod1采用Node硬亲和调度到k8s-worker-3节点 。然后再部署Pod2,让它跟随Pod1,也会被调度到k8s-worker-3节点 。
准备Pod2的yaml编排文件pod_pod_required_affinity.yaml,如下:
apiVersion: v1kind: Podmetadata:name: webapp-1namespace: demolabels:app: webapp-1spec:containers:- name: webappimage: nginxports:- containerPort: 80affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- topologyKey: kubernetes.io/hostnamelabelSelector:matchExpressions:- key: appoperator: Invalues:- webapp可以看到Pod2跟随Pod1,也被调度到了k8s-worker-3节点 。
十分钟搞懂K8S的亲和与反亲和调度

文章插图
(2) 软亲和
软亲和和硬亲和类似,只是多了权重,你可以自行尝试 。


推荐阅读