您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“k8s nodeSelector和affinity調(diào)度親和性的實(shí)現(xiàn)方法”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“k8s nodeSelector和affinity調(diào)度親和性的實(shí)現(xiàn)方法”吧!
1.分配pod到node的方法
通過(guò)node label selector實(shí)現(xiàn)約束pod運(yùn)行到指定節(jié)點(diǎn),有兩種方法 nodeSelector 以及affinity
2.nodeSelector 是k8s早起提供的節(jié)點(diǎn)選擇器實(shí)現(xiàn)
1)首先為nodes打?qū)?yīng)的label
kubectl label nodes master disktype=ssd
2)創(chuàng)建yaml文件,nginx-pod.yaml
apiVersion: v1 kind: Pod metadata: name: nginx labels: env: test spec: containers: - name: nginx image: nginx
創(chuàng)建pod
kubectl create -f nginx-pod.yaml
節(jié)點(diǎn)默認(rèn)的label
kubectl get nodes -o yaml 可以看到默認(rèn)節(jié)點(diǎn)的label,也可以使用這些label進(jìn)行約束
alpha.kubernetes.io/fluentd-ds-ready: "true" beta.kubernetes.io/arch: amd64 beta.kubernetes.io/os: linux disktype: ssd kubeadm.alpha.kubernetes.io/role: master kubernetes.io/hostname: master
根據(jù)類型有
nodeAffinity(主機(jī)親和性),
podAffinity(POD親和性)
podAntiAffinity(POD反親和性)。
三種親和性和反親和性策略的比較如下表所示:
策略名稱 | 匹配目標(biāo) | 支持的操作符 | 支持拓?fù)溆?/th> | 設(shè)計(jì)目標(biāo) |
---|---|---|---|---|
nodeAffinity | 主機(jī)標(biāo)簽 | In,NotIn,Exists,DoesNotExist,Gt,Lt | 不支持 | 決定Pod可以部署在哪些主機(jī)上 |
podAffinity | Pod標(biāo)簽 | In,NotIn,Exists,DoesNotExist | 支持 | 決定Pod可以和哪些Pod部署在同一拓?fù)溆?/td> |
PodAntiAffinity | Pod標(biāo)簽 | In,NotIn,Exists,DoesNotExist | 支持 | 決定Pod不可以和哪些Pod部署在同一拓?fù)溆?/td> |
對(duì)于親和性和反親和性,每種都有三種規(guī)則可以設(shè)置:
RequiredDuringSchedulingRequiredDuringExecution :在調(diào)度期間要求滿足親和性或者反親和性規(guī)則,如果不能滿足規(guī)則,則POD不能被調(diào)度到對(duì)應(yīng)的主機(jī)上。在之后的運(yùn)行過(guò)程中,如果因?yàn)槟承┰颍ū热缧薷膌abel)導(dǎo)致規(guī)則不能滿足,系統(tǒng)會(huì)嘗試把POD從主機(jī)上刪除(現(xiàn)在版本還不支持)。
RequiredDuringSchedulingIgnoredDuringExecution :在調(diào)度期間要求滿足親和性或者反親和性規(guī)則,如果不能滿足規(guī)則,則POD不能被調(diào)度到對(duì)應(yīng)的主機(jī)上。在之后的運(yùn)行過(guò)程中,系統(tǒng)不會(huì)再檢查這些規(guī)則是否滿足。
PreferredDuringSchedulingIgnoredDuringExecution :在調(diào)度期間盡量滿足親和性或者反親和性規(guī)則,如果不能滿足規(guī)則,POD也有可能被調(diào)度到對(duì)應(yīng)的主機(jī)上。在之后的運(yùn)行過(guò)程中,系統(tǒng)不會(huì)再檢查這些規(guī)則是否滿足。
nodeAffinity使用場(chǎng)景 :
將S1服務(wù)的所有Pod部署到指定的符合標(biāo)簽規(guī)則的主機(jī)上。
將S1服務(wù)的所有Pod部署到除部分主機(jī)外的其他主機(jī)上。
podAffinity使用場(chǎng)景 :
將某一特定服務(wù)的pod部署在同一拓?fù)溆蛑校挥弥付ň唧w的拓?fù)溆颉?/p>
如果S1服務(wù)使用S2服務(wù),為了減少它們之間的網(wǎng)絡(luò)延遲(或其它原因),把S1服務(wù)的POD和S2服務(wù)的pod部署在同一拓?fù)溆蛑小?/p>
podAntiAffinity使用場(chǎng) 景:
將一個(gè)服務(wù)的POD分散在不同的主機(jī)或者拓?fù)溆蛑校岣叻?wù)本身的穩(wěn)定性。
給POD對(duì)于一個(gè)節(jié)點(diǎn)的獨(dú)占訪問權(quán)限來(lái)保證資源隔離,保證不會(huì)有其它pod來(lái)分享節(jié)點(diǎn)資源。
把可能會(huì)相互影響的服務(wù)的POD分散在不同的主機(jī)上。
參考:https://k8smeetup.github.io/docs/concepts/configuration/assign-pod-node/#node-親和性beta-特性
下面這個(gè)例子使用nodeAffinity把POD部署到主機(jī)mesos-slave1和mesos-slave2上面
apiVersion: v1 kind: Pod metadata: name: with-node-affinity annotations: scheduler.alpha.kubernetes.io/affinity: > { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { "nodeSelectorTerms": [ { "matchExpressions": [ { "key": "kubernetes.io/hostname", "operator": "In", "values": [“mesos-slave1″,”mesos-slave2”] } ] } ] } } } another-annotation-key: another-annotation-value spec: containers: - name: with-node-affinity image: gcr.io/google_containers/pause:2.0
我們可以看到NodeSelectorTerms可以有多個(gè),之間是或的關(guān)系,滿足任意一個(gè)既滿足,,MatchExpressions也可以有多個(gè),他們之間是且的關(guān)系 必須都滿足。
apiVersion: v1 kind: Pod metadata: name: with-labels annotations: scheduler.alpha.kubernetes.io/affinity: > { "nodeAffinity": { "preferredDuringSchedulingIgnoredDuringExecution": [ { "weight" : 1, "preference": { "matchExpressions": [ { "key": "disktype", "operator": "In", "values": ["ssd"] } ] } } ] } } another-annotation-key: another-annotation-value spec: containers: - name: test-affinity env: - name: MYSQL_ROOT_PASSWORD value: pass image: mysql
preferredDuringSchedulingIgnoredDuringExecution值為列表,根據(jù)權(quán)重決定順序
MatchExpressions 值為列表 關(guān)系為且,必須都滿足
Inter-pod affinity 是根據(jù)通過(guò)已運(yùn)行在節(jié)點(diǎn)上的pod的標(biāo)簽而不是node的標(biāo)簽來(lái)決定被調(diào)度pod的運(yùn)行節(jié)點(diǎn),因?yàn)閜od運(yùn)行在指定的namespace所以需要自己指定運(yùn)行pod的namesapce
anti-affinity 和Inter-pod affinity相反
在下面這個(gè)例子中,定義了一個(gè)Pod親和性和一個(gè)Pod反親和性規(guī)則。其中Pod親和性規(guī)則是一定要滿足的,Pod反親和性規(guī)則是參考滿足的。
Pod親和性規(guī)則的含義是:Pod必須部署在一個(gè)節(jié)點(diǎn)上,這個(gè)節(jié)點(diǎn)上至少有一個(gè)正在運(yùn)行的Pod,這個(gè)Pod的security屬性取值是“S1”,并且要求部署的節(jié)點(diǎn)同正在運(yùn)行的Pod所在節(jié)點(diǎn)都在相同的云服務(wù)區(qū)域中,也就是“topologyKey:failure-domain.beta.kubernetes.io/zone”。換言之,一旦某個(gè)區(qū)域出了問題,我們希望這些 Pod 能夠再次遷移到同一個(gè)區(qū)域。
Pod反親和性規(guī)則的含義是,Pod不能部署在一個(gè)節(jié)點(diǎn)上,這個(gè)節(jié)點(diǎn)上正在運(yùn)行的Pod中security屬性取值是“S2”,并且新部署的Pod不能同security屬性取值是“S2”的Pod在相同的主機(jī)上,也就是“topologyKey: kubernetes.io/hostname”。
matchExpressions中operator的取值包括In、NotIn、Exists、DoesNotExist、Gt和Lt。topologyKey的取值包括:
kubernetes.io/hostname 同一個(gè)主機(jī)
1
failure-domain.beta.kubernetes.io/zone 同一個(gè)云服務(wù)區(qū)
1
failure-domain.beta.kubernetes.io/region 同一個(gè)區(qū)域
1
apiVersion: v1 kind: Pod metadata: name: with-pod-affinity annotations: scheduler.alpha.kubernetes.io/affinity: > { "podAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": [ { "labelSelector": { "matchExpressions": [ { "key": "security", "operator": "In", "values": ["S1"] } ] }, "topologyKey": "failure-domain.beta.kubernetes.io/zone" } ] }, "podAntiAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": [ { "labelSelector": { "matchExpressions": [ { "key": "security", "operator": "In", "values": ["S2"] } ] }, "topologyKey": "kubernetes.io/hostname" } ] } } spec: containers: - name: with-pod-affinity image: gcr.io/google_containers/pause:2.0
到此,相信大家對(duì)“k8s nodeSelector和affinity調(diào)度親和性的實(shí)現(xiàn)方法”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。