1、選擇節(jié)點(diǎn)(nodeSelector)
nodeSelector是目前最為簡單的一種pod運(yùn)行時(shí)調(diào)度限制,目前在Kubernetes1.7.x及以下版本可用。Pod.spec.nodeSelector通過kubernetes的label-selector機(jī)制選擇節(jié)點(diǎn),由調(diào)度器調(diào)度策略匹配label,而后調(diào)度pod到目標(biāo)節(jié)點(diǎn),該匹配規(guī)則屬于強(qiáng)制約束。
kubectl label node node1 disktype=ssd
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd
給node節(jié)點(diǎn)設(shè)置label,然后在pod 啟動(dòng)yaml文件中通過nodeSelector選擇標(biāo)簽選擇對應(yīng)label即可。
2、親和性(Affinity)與非親和性(anti-affinity)
前面提及的nodeSelector,其僅以一種非常簡單的方式、即label強(qiáng)制限制pod調(diào)度到指定節(jié)點(diǎn)。而親和性(Affinity)與非親和性(anti-affinity)則更加靈活的指定pod調(diào)度到預(yù)期節(jié)點(diǎn)上,相比nodeSelector,Affinity與anti-affinity優(yōu)勢體現(xiàn)在:
(1)、表述語法更加多樣化,不再僅受限于強(qiáng)制約束與匹配。
(2)、調(diào)度規(guī)則不再是強(qiáng)制約束(hard),取而代之的是軟限(soft)或偏好(preference)。
(3)、指定pod可以和哪些pod部署在同一個(gè)/不同拓?fù)浣Y(jié)構(gòu)下。
親和性主要分為3種類型:node affinity與inter-pod affinity/anti-affinity,下文會進(jìn)行詳細(xì)說明。
節(jié)點(diǎn)親和性(Node affinity)
Node affinity在Kubernetes 1.2做為alpha引入,其涵蓋了nodeSelector功能,主要分為requiredDuringSchedulingIgnoredDuringExecution 與 preferredDuringSchedulingIgnoredDuringExecution2種類型。前者可認(rèn)為一種強(qiáng)制限制,如果 Node 的標(biāo)簽發(fā)生了變化導(dǎo)致其沒有符合 Pod 的調(diào)度要求節(jié)點(diǎn),那么pod調(diào)度就會失敗。而后者可認(rèn)為理解為軟限或偏好,同樣如果 Node 的標(biāo)簽發(fā)生了變化導(dǎo)致其不再符合 pod 的調(diào)度要求,pod 依然會調(diào)度運(yùn)行。
$ kubectl label nodes node1 cpu=high
node "node1" labeled
$??kubectl label nodes?node1 cpu=mid
node "node1" labeled
$??kubectl label nodes?node1 cpu=low
node "node1" labeled
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
affinity:
nodeAffinity:
??requiredDuringSchedulingIgnoredDuringExecution:
????nodeSelectorTerms:
????- matchExpressions:
??????- key: role
????????operator: NotIn
????????values:
????????- master
??preferredDuringSchedulingIgnoredDuringExecution:
??- weight: 1
????preference:
??????matchExpressions:
??????- key: cpu
????????operator: In
????????values:
????????- high
containers:- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
pod親和性(Inter-pod affinity)與反親和性(anti-affinity)
inter-pod affinity與anti-affinity由Kubernetes 1.4引入,當(dāng)前處于beta階段,其中podAffinity用于調(diào)度pod可以和哪些pod部署在同一拓?fù)浣Y(jié)構(gòu)之下。而podAntiAffinity相反,其用于規(guī)定pod不可以和哪些pod部署在同一拓?fù)浣Y(jié)構(gòu)下。通過pod affinity與anti-affinity來解決pod和pod之間的關(guān)系。
與Node affinity類似,pod affinity與anti-affinity同樣分為requiredDuringSchedulingIgnoredDuringExecution and preferredDuringSchedulingIgnoredDuringExecution等2種類型,前者被認(rèn)為是強(qiáng)制約束,而后者后者可認(rèn)為理解軟限(soft)或偏好(preference)。
spec:
replicas: 1template:
metadata:
??labels:
????app: is
spec:
??affinity:
????podAffinity:
??????requiredDuringSchedulingIgnoredDuringExecution:
??????- labelSelector:
??????????matchExpressions:
??????????- key: app
????????????operator: NotIn
????????????values:
????????????- solr?? ??? ??? ??? ??? ??? ??? ?? ? --不親和pod? solr,不處于同一臺機(jī)器
????????topologyKey: kubernetes.io/hostname
????podAntiAffinity:
??????preferredDuringSchedulingIgnoredDuringExecution:
??????- weight: 1
????????podAffinityTerm:
??????????labelSelector:
????????????matchExpressions:
????????????- key: app
??????????????operator: In
??????????????values:
??????????????- oltp?? ??? ??? ??? ??? ??? ?? ? --親和pod oltp,會處于同一臺機(jī)器
? ? ? ? ?topologyKey: beta.kubernetes.io/os
3、污點(diǎn)(Taints)與容忍(tolerations)
對于Node affinity,無論是強(qiáng)制約束(hard)或偏好(preference)方式,都是調(diào)度pod到預(yù)期節(jié)點(diǎn)上,而Taints恰好與之相反,如果一個(gè)節(jié)點(diǎn)標(biāo)記為 Taints ,除非 Pod也被標(biāo)識為可以耐受污點(diǎn)節(jié)點(diǎn),否則該Taints節(jié)點(diǎn)不會被調(diào)度pod。Taints與tolerations當(dāng)前處于beta階段。
Taints節(jié)點(diǎn)應(yīng)用場景比如用戶希望把Kubernetes Master節(jié)點(diǎn)保留給 Kubernetes 系統(tǒng)組件使用,或者把一組具有特殊資源預(yù)留給某些 pod。pod不會再被調(diào)度到taint標(biāo)記過的節(jié)點(diǎn)。
#應(yīng)用場景:
(1)、針對擁有特定資源的節(jié)點(diǎn),允許對資源有特殊要求的pod在上面運(yùn)行
(2)、針對不同環(huán)境進(jìn)行區(qū)分,比如,將node1、node2分配給部分1或者項(xiàng)目1。將node3、node4分配給其他部門或者其他項(xiàng)目
#給node1節(jié)點(diǎn)設(shè)置污點(diǎn)
kubectl taint node node1 node-type=production:NoSchedule
node/node1 tainted
#去除污點(diǎn)
kubectl taint nodes node_name key:[effect]-????#(這里的key不用指定value)
kubectl taint node node1?node-type:NoSchedule-
#describe node1節(jié)點(diǎn)可以發(fā)現(xiàn)如下配置
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
#創(chuàng)建污點(diǎn)之后,對于已經(jīng)處于運(yùn)行中的pod是沒有任何影響的,但是對與新創(chuàng)建的pod如果沒有設(shè)置容忍則無法在對應(yīng)節(jié)點(diǎn)上創(chuàng)建pod
#修改部署yaml,添加容忍相關(guān)配置(在containers同級部分添加如下標(biāo)紅配置),只有配置容忍的pod才能被成功調(diào)度到設(shè)置污點(diǎn)的節(jié)點(diǎn)
????spec:
??????tolerations:
??????- key: node-type
????????operator: Equal
????????value: production
????????effect: NoSchedule
??????containers:
????????- name: nginx
??????????image: nginx:latest
??????????imagePullPolicy: Never
??????????ports:
????????????- containerPort: 80
#有污點(diǎn)無容忍不可以創(chuàng)建pod,有容忍無污點(diǎn)可以創(chuàng)建pod,兩種情況對已經(jīng)創(chuàng)建的pod都無影響。
effect 共有三個(gè)可選項(xiàng),可按實(shí)際需求進(jìn)行設(shè)置:
(1)、NoSchedule:pod不會被調(diào)度到標(biāo)記為taints節(jié)點(diǎn)。
(2)、PreferNoSchedule:NoSchedule的“preference”或“soft”版本。
(3)、NoExecute:該選項(xiàng)意味著一旦Taint 生效,如該節(jié)點(diǎn)內(nèi)正在運(yùn)行的 Pod 沒有對應(yīng) Tolerate 設(shè)置,會直接被逐出。
更多內(nèi)容請關(guān)注我的知乎賬號:https://www.zhihu.com/people/dengjiabo/activities