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
文章插图
执行上面的yaml部署Pod,可以看到Pod已经被调度到k8s-worker-3节点上 。

文章插图
(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节点 。
文章插图
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节点 。
文章插图
(2) 软亲和
软亲和和硬亲和类似,只是多了权重,你可以自行尝试 。
推荐阅读
- 一文搞懂基于 OpenTelemetry 进行 Kubernetes 全链路观测
- 放弃亚马逊、谷歌,彻底告别K8s!
- 大白话说明白K8S的PV / PVC / StorageClass
- 惹网友爆笑!TVB知名男星商演唱歌疯狂走音,登台十分钟薪酬17万
- K8s 多集群实践思考和探索
- K8S 入门到实战--部署应用到 K8S
- 鸡蛋羹蒸了十分钟还是稀的 鸡蛋羹蒸了十分钟还是稀的怎么办
- 一文搞懂Redis架构演化之路
- 一文搞懂二叉搜索树、B树、B+树、AVL树、红黑树
- Prometheus on k8s 部署与实战操作进阶篇
