开篇
在《上篇:POD亲和性、反亲和性以及场景举例》中,相信你已经搞清楚了什么是POD亲和性、反亲和性、以及基本的使用场景。接着,本篇将通过一个实战案例来演示如何在K8S集群中配置亲和性和反亲和性规则,以实现更灵活的POD调度。
测试环境
在本次实战中,我们将使用以下K8S集群环境:
节点 | 主机名 | IP |
---|---|---|
主节点 | k8s-b-master | 192.168.11.100 |
工作节点1 | k8s-b-node01 | 192.168.11.101 |
工作节点2 | k8s-b-node02 | 192.168.11.102 |
工作节点3 | k8s-b-node03 | 192.168.11.103 |
工作节点4 | k8s-b-node04 | 192.168.11.104 |
工作节点5 | k8s-b-node05 | 192.168.11.105 |
工作节点6 | k8s-b-node06 | 192.168.11.106 |
提示:我的测试环境使用的是单Master多Worker节点的基本集群架构,大家可根据自己的实际情况进行调整。
开始实战
在本篇实战案例中,假设有两类POD:web和db,并模拟了两个实战场景:
-
实战场景1:web POD 调度到和 db POD 在同一个节点上,以提高它们之间的网络通信性能,这时候,就可以使用亲和性调度来约束POD的调度行为。 -
实战场景2:将同一类POD分散到不同的节点上,将web POD调度到不同的节点上,以提高容错性和可用性。这时候,就可以为web POD配置反亲和性规则。
节点设置标签
给节点设置label:
kubectl label nodes k8s-b-node02 app=db
kubectl label nodes k8s-b-node05 app=web
场景1:使用亲和性调度POD
首先为db PODs 配置一个亲和性规则,以将它们调度到具有相同标签的节点上。在这里,假设db POD的标签为app=db。创建一个名为db-affinity.yaml的亲和性规则文件,并将以下内容添加到文件中:
apiVersion: apps/v1
kind: Deployment
metadata:
name: db
labels:
app: db
namespace: goweb
spec:
replicas: 3
selector:
matchLabels:
app: db
template:
metadata:
labels:
app: db
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- db
topologyKey: "kubernetes.io/hostname"
containers:
- name: db-container
image: 192.168.11.253/library/db:latest
保存并应用:
kubectl apply -f db-affinity.yaml
查看db POD的调度结果:
[root@k8s-b-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
db-7d686fdd7d-g6z4t 1/1 Running 0 6s 10.244.232.191 k8s-b-node02 <none> <none>
db-7d686fdd7d-ktpk2 1/1 Running 0 6s 10.244.232.180 k8s-b-node02 <none> <none>
db-7d686fdd7d-rbbkd 1/1 Running 0 6s 10.244.232.132 k8s-b-node02 <none> <none>
接着,准备web的yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- db
topologyKey: "kubernetes.io/hostname"
containers:
- name: web-container
image: 192.168.11.253/library/goweb:latest
保存并应用:
kubectl apply -f web-affinity.yaml
查看调度结果:
[root@k8s-b-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
db-7d686fdd7d-b45l2 1/1 Running 0 6m17s 10.244.232.139 k8s-b-node02 <none> <none>
db-7d686fdd7d-nmtx9 1/1 Running 0 6m17s 10.244.232.140 k8s-b-node02 <none> <none>
db-7d686fdd7d-zfhdj 1/1 Running 0 6m17s 10.244.232.142 k8s-b-node02 <none> <none>
web-596c4f9bdb-595rv 1/1 Running 0 19s 10.244.232.147 k8s-b-node02 <none> <none>
web-596c4f9bdb-l6k9r 1/1 Running 0 19s 10.244.232.145 k8s-b-node02 <none> <none>
web-596c4f9bdb-sl4rl 1/1 Running 0 19s 10.244.232.143 k8s-b-node02 <none> <none>
[root@k8s-b-master ~]#
场景2:使用反亲和性调度POD
创建一个名为web-anti-affinity.yaml的反亲和性规则文件,并将以下内容添加到文件中:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
labels:
app: web
spec:
replicas: 6
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web
topologyKey: "kubernetes.io/hostname"
containers:
- name: web-container
image: 192.168.11.253/library/goweb:latest
保存并应用反亲和性规则:
kubectl apply -f web-anti-affinity.yaml
查看调度结果:
[root@k8s-b-master ~]# kubectl get pod -o wide
web-8474989c7d-42pcz 1/1 Running 0 7m16s 10.244.25.84 k8s-b-node05 <none> <none>
web-8474989c7d-965nb 1/1 Running 0 7m16s 10.244.151.20 k8s-b-node06 <none> <none>
web-8474989c7d-gvgj2 1/1 Running 0 7m16s 10.244.199.145 k8s-b-node03 <none> <none>
web-8474989c7d-j79dk 1/1 Running 0 7m16s 10.244.51.208 k8s-b-node01 <none> <none>
web-8474989c7d-kz5ss 1/1 Running 0 7m16s 10.244.232.131 k8s-b-node02 <none> <none>
web-8474989c7d-sskdw 1/1 Running 0 7m16s 10.244.7.127 k8s-b-node04 <none> <none>
最后
最后说明一下,Pod的亲和性和反亲和性规则也是有两种类型:
-
requiredDuringSchedulingIgnoredDuringExecution(也可以说是硬策略,适用于必须满足亲和性规则的情况) -
preferredDuringSchedulingIgnoredDuringExecution(软策略,适用于对亲和性有偏好但不是必需的情况。)
本篇的实战场景中并未使用到软策略,有兴趣可自行测试效果。在实际工作中,可以根据应用的需求和调度策略选择适当的亲和性类型。
原文始发于微信公众号(不背锅运维):下篇:实战K8S POD亲和性、反亲和性。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/149402.html