需求:
Pod和Node之間的關(guān)系
某些Pod優(yōu)先選擇有ssd=true標(biāo)簽的節(jié)點(diǎn),如果沒有在考慮部署到其它節(jié)點(diǎn);
某些Pod需要部署在ssd=true和type=physical的節(jié)點(diǎn)上分唾,但是優(yōu)先部署在ssd=true的節(jié)點(diǎn)上隙赁;
Pod和Pod之間的關(guān)系
同一個(gè)應(yīng)用的Pod不同的副本或者同一個(gè)項(xiàng)目的應(yīng)用盡量或必須不部署在同一個(gè)節(jié)點(diǎn)或者符合某個(gè)標(biāo)簽的一類節(jié)點(diǎn)上或者不同的區(qū)域;
相互依賴的兩個(gè)Pod盡量或必須部署在同一個(gè)節(jié)點(diǎn)上或者同一個(gè)域內(nèi)。
Affinity分類
節(jié)點(diǎn)親和力配置詳解
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: # 硬親和力配置
nodeSelectorTerms: # 節(jié)點(diǎn)選擇器配置莫换,可以配置多個(gè)matchExpressions(滿足其一),每個(gè)matchExpressions下可以配置多個(gè)key、value類型的選擇器(都需要滿足)拉岁,其中values可以配置多個(gè)(滿足其一)
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In # 標(biāo)簽匹配的方式
# In:相當(dāng)于key = value的形式
# NotIn:相當(dāng)于key != value的形式
# Exists:節(jié)點(diǎn)存在label的key為指定的值即可坷剧,不能配置values字段
# DoesNotExist:節(jié)點(diǎn)不存在label的key為指定的值即可,不能配置values字段
values:
- e2e-az1
- az-2
preferredDuringSchedulingIgnoredDuringExecution: # 軟親和力配置
- weight: 1 # 軟親和力的權(quán)重喊暖,權(quán)重越高優(yōu)先級(jí)越大惫企,范圍1-100
preference: # 軟親和力配置項(xiàng),和weight同級(jí)陵叽,可以配置多個(gè)
matchExpressions: # 和硬親和力一致
- key: another-node-label-key
operator: In # 標(biāo)簽匹配的方式
# In:相當(dāng)于key = value的形式
# NotIn:相當(dāng)于key != value的形式
# Exists:節(jié)點(diǎn)存在label的key為指定的值即可狞尔,不能配置values字段
# DoesNotExist:節(jié)點(diǎn)不存在label的key為指定的值即可,不能配置values字段
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: nginx
Pod親和力和反親和力詳解
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity: # pod親和力配置
requiredDuringSchedulingIgnoredDuringExecution: # 硬親和力配置
- labelSelector: # Pod的lableSelector配置巩掺,可以配置多個(gè)
matchExpressions: # 配置和節(jié)點(diǎn)親和力配置一致
- key: security
operator: In # 配置和節(jié)點(diǎn)親和力一致
values:
- S1
topologyKey: failure-domain.beta.kubernetes.io/zone # 匹配的拓?fù)溆虻膋ey偏序,也就是節(jié)點(diǎn)上label的key,key和value相同的為同一個(gè)域胖替,可以用于標(biāo)注不同的機(jī)房和地區(qū)
podAntiAffinity: # pod反親和力配置
preferredDuringSchedulingIgnoredDuringExecution: # 軟親和力配置
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S2
namespaces: # 和哪個(gè)命名空間的Pod進(jìn)行匹配研儒,空為default命名空間,可以寫多個(gè)namespace
- default
topologyKey: failure-domain.beta.kubernetes.io/zone # 匹配的拓?fù)溆虻膋ey独令,也就是節(jié)點(diǎn)上label的key殉摔,key和value相同的為同一個(gè)域,可以用于標(biāo)注不同的機(jī)房和地區(qū)
containers:
- name: with-pod-affinity
image: nginx
示例1:同一個(gè)應(yīng)用部署在不同的宿主機(jī)
使用pod的親和力app=must-be-diff-nodes记焊, 通過節(jié)點(diǎn)默認(rèn)label topologyKey: kubernetes.io/hostname 實(shí)現(xiàn)每個(gè)pod都調(diào)度到不同的宿主機(jī)
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: must-be-diff-nodes
name: must-be-diff-nodes
namespace: kube-public
spec:
replicas: 3
selector: # Pod選擇器配置,可以配置多個(gè)
matchLabels: # 配置和節(jié)點(diǎn)親和力一致
app: must-be-diff-nodes
template:
metadata:
labels:
app: must-be-diff-nodes
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In # 配置和節(jié)點(diǎn)親和力一致
values:
- must-be-diff-nodes
topologyKey: kubernetes.io/hostname # 匹配的拓?fù)溆虻膋ey栓撞,也就是節(jié)點(diǎn)上label的key遍膜,key和value相同的為同一個(gè)域,可以用于標(biāo)注不同的機(jī)房和地區(qū)
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: must-be-diff-nodes
示例2:同一個(gè)應(yīng)用不同副本固定節(jié)點(diǎn)
使用pod反親和力app=store瓤湘,通過topologyKey: "kubernetes.io/hostname"實(shí)現(xiàn)多副本的pod瓢颅,不調(diào)度到同一臺(tái)節(jié)點(diǎn)上
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-cache
spec:
selector:
matchLabels:
app: store
replicas: 3
template:
metadata:
labels:
app: store
spec:
nodeSelector:
app: store
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- store
topologyKey: "kubernetes.io/hostname"
containers:
- name: redis-server
image: redis:3.2-alpine
示例3:應(yīng)用和緩存盡量部署在同一個(gè)域內(nèi)
使用pod的硬親和性和軟親和性,實(shí)現(xiàn)pod app=store的label盡量部署在同一個(gè)域中
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
selector:
matchLabels:
app: web-store
replicas: 3
template:
metadata:
labels:
app: web-store
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-store
topologyKey: "kubernetes.io/hostname"
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- store
topologyKey: "kubernetes.io/hostname"
containers:
- name: web-app
image: nginx:1.16-alpine
示例4:盡量調(diào)度到高配置服務(wù)器
通過節(jié)點(diǎn)的硬親和性弛说,一次匹配ssd=true挽懦,weight100,weight10
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: prefer-ssd
name: prefer-ssd
namespace: kube-public
spec:
replicas: 3
selector:
matchLabels:
app: prefer-ssd
template:
metadata:
creationTimestamp: null
labels:
app: prefer-ssd
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: ssd
operator: In
values:
- "true"
- key: master
operator: NotIn
values:
- "true"
weight: 100
- preference:
matchExpressions:
- key: type
operator: In
values:
- physical
weight: 10
containers:
- env:
- name: TZ
value: Asia/Shanghai
- name: LANG
value: C.UTF-8
image: nginx
imagePullPolicy: IfNotPresent
name: prefer-ssd
TopologyKey配置詳解
匹配的拓?fù)溆虻膋ey木人,也就是節(jié)點(diǎn)上label的key信柿,key和value相同的為同一個(gè)域,可以用于標(biāo)注不同的機(jī)房和地區(qū)
image.png
image.png
示例:同一個(gè)應(yīng)用多區(qū)域部署
通過pod的硬親和性醒第,和topologyKey node節(jié)點(diǎn)的同一個(gè)key渔嚷,不同的value實(shí)現(xiàn)多區(qū)域部署
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: must-be-diff-zone
name: must-be-diff-zone
namespace: kube-public
spec:
replicas: 3
selector:
matchLabels:
app: must-be-diff-zone
template:
metadata:
labels:
app: must-be-diff-zone
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- must-be-diff-zone
topologyKey: region # region為node的label,上述圖中稠曼,region分別=daxing形病、chaoyang
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: must-be-diff-zone