k8s中pod親和性和反親和性的使用
1.親和性調(diào)度作用和分類- pod親和性和節(jié)點(diǎn)nodeAffinity親和性通用
親和度可以分成軟策略和硬策略兩種方式
軟策略:盡量滿足條件,滿足條件最好,不滿足也無所謂,若沒有滿足調(diào)度要求的節(jié)點(diǎn)的話,pod會忽略這條規(guī)則,繼續(xù)完成調(diào)度過程
硬策略: 必須滿足條件,比較強(qiáng)硬,如果沒有滿足條件的節(jié)點(diǎn)的話,就不斷重試直到滿足條件為止。
2.親和性和反親和性的兩種策略的配置寫法-pod親和性和節(jié)點(diǎn)nodeAffinity親和性通用
對于親和性和反親和性都有這兩種規(guī)則可以設(shè)置:
軟策略:preferredDuringSchedulingIgnoredDuringExecution
硬策略:requiredDuringSchedulingIgnoredDuringExecution
3.pod親和性和反親和性的概念
pod親和性和反親和性都是處理pod與pod之間的關(guān)系。
pod親和性: ?主要是想把pod和某個依賴的pod放在一起。
pod親和性主要解決pod可以和哪些pod部署在同一個拓?fù)溆蛑械膯栴}(其中拓?fù)溆蛴弥鳈C(jī)標(biāo)簽實(shí)現(xiàn),可以是單個主機(jī),也可以是多個主機(jī)組成的 cluster等等)
例如:一個pod在一個節(jié)點(diǎn)上了,那么我這個pod也得在這個節(jié)點(diǎn)上。
注意:是以pod的標(biāo)簽進(jìn)行標(biāo)記的,將pod標(biāo)簽一樣的幾個pod部署到同一個節(jié)點(diǎn)上,pod1的標(biāo)簽是app=love,部署在node1節(jié)點(diǎn),pod2的標(biāo)簽也是app=love,可以通過配置pod親和性,讓pod2也部署在node1,和pod1放到一起。
pod反親和性:主要想把?pod和某個pod分開。
pod反親和性主要是解決pod不能和哪些pod部署在同一個拓?fù)溆蛑械膯栴},它們都是處理的pod與pod 之間的關(guān)系。
例如:你這個pod在節(jié)點(diǎn)上了,那么我就不想和你待在同一個節(jié)點(diǎn)上
注意:是以pod的標(biāo)簽進(jìn)行標(biāo)記的,將pod標(biāo)簽一樣的幾個pod不要部署到同一個節(jié)點(diǎn)上,pod1的標(biāo)簽是app=love,部署在node1節(jié)點(diǎn),pod2的標(biāo)簽也是app=love,可以通過配置pod反親和性,不讓pod2部署在node1,不要和pod1放到一起。
4.pod親和性的案例實(shí)戰(zhàn)
1).準(zhǔn)備k8s集群
[root@k8s-m1 ~]# kubectl get node
NAME???? STATUS?? ROLES????????????????? AGE?? VERSION
k8s-m1?? Ready??? control-plane,master?? 23h?? v1.22.10
k8s-m2?? Ready??? control-plane,master?? 23h?? v1.22.10
k8s-m3?? Ready??? control-plane,master?? 23h?? v1.22.10
k8s-n1?? Ready??? worker???????????????? 23h?? v1.22.10
k8s-n2?? Ready??? worker???????????????? 23h?? v1.22.10
[root@k8s-m1 ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME???????????????? STATUS?? ?MESSAGE???????????? ERROR
scheduler??????????? Healthy?? ok?????????????????
controller-manager?? Healthy?? ok?????????????????
etcd-0?????????????? Healthy?? {"health":"true"}??
etcd-1?????????????? Healthy?? {"health":"true"}??
etcd-2?????????????? Healthy?? {"health":"true"}??
2).先部署一個標(biāo)簽為app=love的pod1的nginx(應(yīng)用nginx版本nginx:1.19.5)
[root@k8s-m1 ~]# vim nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
? name: dev-nginx-deployment
spec:
? replicas: 1
? selector:
??? matchLabels:
????? app: love
? template:
??? metadata:
????? labels:
??????? app: love
??? spec:
????? containers:
????? - name: nginx
??????? image: nginx:1.19.5
[root@k8s-m1 ~]# kubectl apply -f nginx.yaml
?[root@k8s-m1 ~]# kubectl get pod -o wide --show-labels?? #查看部署的pod1部署在k8s-n1上
NAME??????????????????????????????????? READY?? STATUS??? RESTARTS?? AGE?? IP???????????? NODE???? NOMINATED NODE?? READINESS GATES?? LABELS
dev-nginx-deployment-7cdc5f7758-wgnbb?? 1/1???? Running?? 0????????? 8s??? 10.233.71.25?? k8s-n1?? <none>?????????? <none>??????????? app=love,pod-template-hash=7cdc5f7758
3).再使用pod親和性部署另一個pod2(標(biāo)簽也是app=love,nginx版本為nginx:1.20),和pod1部署到一起
[root@k8s-m1 ~]# vim nginx2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
? name: nginx2-affinity-deployment
spec:
? replicas: 3
? selector:
??? matchLabels:
????? app: love2???????????? #pod2的標(biāo)簽,和pod1的標(biāo)簽沒關(guān)系
? template:
??? metadata:
????? labels:
??????? app: love2??????????? #pod2的標(biāo)簽,和pod1的標(biāo)簽沒關(guān)系
??? spec:
????? containers:
????? - name: nginx
??????? image: nginx:1.20
??????? ports:
??????? - containerPort: 80
????????? name: nginxweb
????? affinity:
??????? podAffinity:
????????? requiredDuringSchedulingIgnoredDuringExecution:? # 硬策略,以硬策略為例,軟策略類似
????????? - labelSelector:
????????????? matchExpressions:
????????????? - key: app??????????? #規(guī)則: 匹配和pod1的標(biāo)簽的規(guī)則時
??????????????? operator: In
??????????????? values:
??????????????? - love
??????????? topologyKey: kubernetes.io/hostname
[root@k8s-m1 ~]# kubectl apply -f nginx2.yaml?? #用pod親和性部署pod2,和pod1部署到一起
[root@k8s-m1 ~]# kubectl get pod -o wide --show-labels?? #查看部署后的結(jié)果,會和pod1部署到一起,部署到同一個節(jié)點(diǎn)上
NAME???????????????????????????????????? ?????READY?? STATUS??? RESTARTS?? AGE?? IP???????????? NODE???? NOMINATED NODE?? READINESS GATES?? LABELS
dev-nginx-deployment-7cdc5f7758-wgnbb???????? 1/1???? Running?? 0????????? 27m?? 10.233.71.25?? k8s-n1?? <none>?????????? <none>??????????? app=love,pod-template-hash=7cdc5f7758
nginx2-affinity-deployment-57b4b64d74-gbw8n?? 1/1???? Running?? 0????????? 18s?? 10.233.71.30?? k8s-n1?? <none>?????????? <none>??????????? app=love2,pod-template-hash=57b4b64d74
nginx2-affinity-deployment-57b4b64d74-rdjb7?? 1/1???? Running?? 0????????? 18s?? 10.233.71.31?? k8s-n1?? <none>?????????? <none>??????????? app=love2,pod-template-hash=57b4b64d74
nginx2-affinity-deployment-57b4b64d74-rmprr?? 1/1???? Running?? 0????????? 18s?? 10.233.71.32?? k8s-n1?? <none>?????????? <none>??????????? app=love2,pod-template-hash=57b4b64d74
加了pod親和性配置后,會發(fā)現(xiàn)后面部署的pod2的3個副本都會部署到和pod1標(biāo)簽一致的node節(jié)點(diǎn),即: k8s-n1上
如果不加pod親和性配置,就會按原來的調(diào)度策略,k8s-n1和k8s-n2節(jié)點(diǎn)上都會部署。
4). 再使用pod反親和性部署另一個pod2(標(biāo)簽也是app=love,nginx版本為nginx:1.20) ,不和pod1部署到一起
[root@k8s-m1 ~]# vim nginx2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
? name: nginx2-affinity-deployment
spec:
? replicas: 3
? selector:
??? matchLabels:
????? app: love2????? #pod2的標(biāo)簽,和pod1的標(biāo)簽沒關(guān)系
? template:
??? metadata:
????? labels:
??????? app: love2??? #pod2的標(biāo)簽,和pod1的標(biāo)簽沒關(guān)系
??? spec:
????? containers:
????? - name: nginx
??????? image: nginx:1.20
??????? ports:
??????? - containerPort: 80
????????? name: nginxweb
????? affinity:
??????? podAntiAffinity:
????????? requiredDuringSchedulingIgnoredDuringExecution:? # 硬策略,以硬策略為例,軟策略類似
????????? - labelSelector:
????????????? matchExpressions:
????????????? - key: app?????????? #規(guī)則: 匹配和pod1的標(biāo)簽的規(guī)則時
??????????????? operator: In
??????????????? values:
??????????????? - love
??????????? topologyKey: kubernetes.io/hostname
?[root@k8s-m1 ~]# kubectl apply -f nginx2.yaml?????????? #用pod反親和性部署pod2,不和pod1部署到一起
[root@k8s-m1 ~]# kubectl get pod -o wide --show-labels? #查看部署后的結(jié)果,不會和pod1部署到一起,不會在同一節(jié)點(diǎn)上
NAME???????????????????????????????????????? READY?? STATUS??? RESTARTS?? AGE?? IP???????????? NODE???? NOMINATED NODE?? READINESS GATES?? LABELS
dev-nginx-deployment-7cdc5f7758-wgnbb??????? 1/1???? Running?? 0????????? 23m?? 10.233.71.25?? k8s-n1?? <none>?????????? <none>??????????? app=love,pod-template-hash=7cdc5f7758
nginx2-affinity-deployment-684568686-hf4tm?? 1/1???? Running?? 0????????? 14s?? 10.233.81.22?? k8s-n2?? <none>?????????? <none>??????????? app=love2,pod-template-hash=684568686
nginx2-affinity-deployment-684568686-tqvp7?? 1/1???? Running?? 0????????? 14s?? 10.233.81.24?? k8s-n2?? <none>?????????? <none>??????????? app=love2,pod-template-hash=684568686
nginx2-affinity-deployment-684568686-zhhq2?? 1/1???? Running?? 0????????? 14s?? 10.233.81.23?? k8s-n2?? <none>?????????? <none>??????????? app=love2,pod-template-hash=684568686
加了pod反親和性配置后,會發(fā)現(xiàn)后面部署的pod2的3個副本都不會部署到和pod1標(biāo)簽一致的node節(jié)點(diǎn),即不會部署在 k8s-n1上,而是會部署在k8s-n2上
參考連接: https://www.cnblogs.com/lnlvinso/p/13599102.html
?