K8S调度之节点亲和性
親和性分為軟親和性以及硬親和性
preferredDuringSchedulingIgnoredDuringExecution:軟策略 可以不再最好在
requiredDuringSchedulingIgnoredDuringExecution:硬策略 必須在
鍵值運(yùn)算關(guān)系
In:label 的值在某個(gè)列表中
NotIn:label 的值不在某個(gè)列表中
Gt:label 的值大于某個(gè)值
Lt:label 的值小于某個(gè)值
Exists:某個(gè) label 存在
DoesNotExist:某個(gè) label 不存在
Affinity 翻譯成中文是“親和性”,它對(duì)應(yīng)的是 Anti-Affinity,我們翻譯成“互斥”。這兩個(gè)詞比較形象,可以把 pod 選擇 node 的過程類比成磁鐵的吸引和互斥,不同的是除了簡單的正負(fù)極之外,pod 和 node 的吸引和互斥是可以靈活配置的。
Affinity的優(yōu)點(diǎn):
匹配有更多的邏輯組合,不只是字符串的完全相等
調(diào)度分成軟策略(soft)和硬策略(hard),在軟策略下,如果沒有滿足調(diào)度條件的節(jié)點(diǎn),pod會(huì)忽略這條規(guī)則,繼續(xù)完成調(diào)度。
目前主要的node affinity:
requiredDuringSchedulingIgnoredDuringExecution
表示pod必須部署到滿足條件的節(jié)點(diǎn)上,如果沒有滿足條件的節(jié)點(diǎn),就不停重試。其中IgnoreDuringExecution表示pod部署之后運(yùn)行的時(shí)候,如果節(jié)點(diǎn)標(biāo)簽發(fā)生了變化,不再滿足pod指定的條件,pod也會(huì)繼續(xù)運(yùn)行。
requiredDuringSchedulingRequiredDuringExecution
表示pod必須部署到滿足條件的節(jié)點(diǎn)上,如果沒有滿足條件的節(jié)點(diǎn),就不停重試。其中RequiredDuringExecution表示pod部署之后運(yùn)行的時(shí)候,如果節(jié)點(diǎn)標(biāo)簽發(fā)生了變化,不再滿足pod指定的條件,則重新選擇符合要求的節(jié)點(diǎn)。
preferredDuringSchedulingIgnoredDuringExecution
表示優(yōu)先部署到滿足條件的節(jié)點(diǎn)上,如果沒有滿足條件的節(jié)點(diǎn),就忽略這些條件,按照正常邏輯部署。
preferredDuringSchedulingRequiredDuringExecution
表示優(yōu)先部署到滿足條件的節(jié)點(diǎn)上,如果沒有滿足條件的節(jié)點(diǎn),就忽略這些條件,按照正常邏輯部署。其中RequiredDuringExecution表示如果后面節(jié)點(diǎn)標(biāo)簽發(fā)生了變化,滿足了條件,則重新調(diào)度到滿足條件的節(jié)點(diǎn)。
軟策略和硬策略的區(qū)分是有用處的,硬策略適用于 pod
必須運(yùn)行在某種節(jié)點(diǎn),否則會(huì)出現(xiàn)問題的情況,比如集群中節(jié)點(diǎn)的架構(gòu)不同,而運(yùn)行的服務(wù)必須依賴某種架構(gòu)提供的功能;軟策略不同,它適用于滿不滿足條件都能工作,但是滿足條件更好的情況,比如服務(wù)最好運(yùn)行在某個(gè)區(qū)域,減少網(wǎng)絡(luò)傳輸?shù)取_@種區(qū)分是用戶的具體需求決定的,并沒有絕對(duì)的技術(shù)依賴。
下面是一個(gè)官方的示例:
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: gcr.io/google_containers/pause:2.0
這個(gè) pod 同時(shí)定義了 requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution 兩種 nodeAffinity。第一個(gè)要求 pod 運(yùn)行在特定 AZ 的節(jié)點(diǎn)上,第二個(gè)希望節(jié)點(diǎn)最好有對(duì)應(yīng)的 another-node-label-key:another-node-label-value 標(biāo)簽。
這里的匹配邏輯是label在某個(gè)列表中,可選的操作符有:
In: label的值在某個(gè)列表中
NotIn:label的值不在某個(gè)列表中
Exists:某個(gè)label存在
DoesNotExist:某個(gè)label不存在
Gt:label的值大于某個(gè)值(字符串比較)
Lt:label的值小于某個(gè)值(字符串比較)
如果nodeAffinity中nodeSelector有多個(gè)選項(xiàng),節(jié)點(diǎn)滿足任何一個(gè)條件即可;如果matchExpressions有多個(gè)選項(xiàng),則節(jié)點(diǎn)必須同時(shí)滿足這些選項(xiàng)才能運(yùn)行pod 。
需要說明的是,node并沒有anti-affinity這種東西,因?yàn)镹otIn和DoesNotExist能提供類似的功能。
node 親和性
node親和性策略表示pod部署到符合某些條件的node上.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: name
operator: In
values:
- nginx1
- nginx2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: app
operator: In
values:
- nginx
containers:
- name: nginx-server
image: nginx:latest
上面的這個(gè)例子表示pod必須部署到滿足nodeSelectorTerms中的條件,盡量滿足preference中的條件.
nodeAffinity表示pod和node的親和性策略
nodeSelectorTerms 表示打了這些標(biāo)簽的node上才能部署pod,這里的key values都可以指定多個(gè)值,可以實(shí)現(xiàn)類似nodeSelector的或的操作.
preference 表示最好部署到滿足這些條件的node上.
策略
requiredDuringSchedulingIgnoredDuringExecution 硬策略表示調(diào)度過程必須滿足執(zhí)行過程忽略
preferredDuringSchedulingIgnoredDuringExecution 軟策略表示調(diào)度過程盡量滿足執(zhí)行過程忽略
pod 親和性和非親和性
pod親和性和非親和性表示pod部署到或不部署到滿足某些label的pod所在的node上.
使用pod非親和性硬策略,實(shí)現(xiàn)相同lable pod一定不能調(diào)度到同一節(jié)點(diǎn)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx
topologyKey: "kubernetes.io/hostname"
containers:
- name: nginx-server
image: nginx:latest
podAntiAffinity 表示pod的非親和性策略
matchExpressions 表示符合label條件的pod
topologyKey 表示作用域key,這里使用 kubernetes.io/hostname表示所有的節(jié)點(diǎn),因?yàn)樗械墓?jié)點(diǎn)默認(rèn)都會(huì)打上這個(gè)標(biāo)簽
這個(gè)例子表示所有有app:nginx標(biāo)簽的pod非親和性,就是不能部署在同一節(jié)點(diǎn),并且在調(diào)度過程中是硬策略.
使用pod非親和性軟策略實(shí)現(xiàn)相同label pod盡量不要調(diào)度到同一節(jié)點(diǎn)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
nodeSelector:
app: nginx
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx
podAntiAffinity 親和性策略表示盡量把有l(wèi)abel app:nginx的pod部署在同一節(jié)點(diǎn)
總結(jié)
以上是生活随笔為你收集整理的K8S调度之节点亲和性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【心灵鸡汤】为撒要爱惜自己的羽毛
- 下一篇: Zabbix触发器和监控项设置时间范围