您好,登錄后才能下訂單哦!
本篇內容主要講解“k8s nodeSelector和affinity調度親和性的實現方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“k8s nodeSelector和affinity調度親和性的實現方法”吧!
1.分配pod到node的方法
通過node label selector實現約束pod運行到指定節點,有兩種方法 nodeSelector 以及affinity
2.nodeSelector 是k8s早起提供的節點選擇器實現
1)首先為nodes打對應的label
kubectl label nodes master disktype=ssd
2)創建yaml文件,nginx-pod.yaml
apiVersion: v1 kind: Pod metadata: name: nginx labels: env: test spec: containers: - name: nginx image: nginx
創建pod
kubectl create -f nginx-pod.yaml
節點默認的label
kubectl get nodes -o yaml 可以看到默認節點的label,也可以使用這些label進行約束
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
根據類型有
nodeAffinity(主機親和性),
podAffinity(POD親和性)
podAntiAffinity(POD反親和性)。
三種親和性和反親和性策略的比較如下表所示:
策略名稱 | 匹配目標 | 支持的操作符 | 支持拓撲域 | 設計目標 |
---|---|---|---|---|
nodeAffinity | 主機標簽 | In,NotIn,Exists,DoesNotExist,Gt,Lt | 不支持 | 決定Pod可以部署在哪些主機上 |
podAffinity | Pod標簽 | In,NotIn,Exists,DoesNotExist | 支持 | 決定Pod可以和哪些Pod部署在同一拓撲域 |
PodAntiAffinity | Pod標簽 | In,NotIn,Exists,DoesNotExist | 支持 | 決定Pod不可以和哪些Pod部署在同一拓撲域 |
對于親和性和反親和性,每種都有三種規則可以設置:
RequiredDuringSchedulingRequiredDuringExecution :在調度期間要求滿足親和性或者反親和性規則,如果不能滿足規則,則POD不能被調度到對應的主機上。在之后的運行過程中,如果因為某些原因(比如修改label)導致規則不能滿足,系統會嘗試把POD從主機上刪除(現在版本還不支持)。
RequiredDuringSchedulingIgnoredDuringExecution :在調度期間要求滿足親和性或者反親和性規則,如果不能滿足規則,則POD不能被調度到對應的主機上。在之后的運行過程中,系統不會再檢查這些規則是否滿足。
PreferredDuringSchedulingIgnoredDuringExecution :在調度期間盡量滿足親和性或者反親和性規則,如果不能滿足規則,POD也有可能被調度到對應的主機上。在之后的運行過程中,系統不會再檢查這些規則是否滿足。
nodeAffinity使用場景 :
將S1服務的所有Pod部署到指定的符合標簽規則的主機上。
將S1服務的所有Pod部署到除部分主機外的其他主機上。
podAffinity使用場景 :
將某一特定服務的pod部署在同一拓撲域中,不用指定具體的拓撲域。
如果S1服務使用S2服務,為了減少它們之間的網絡延遲(或其它原因),把S1服務的POD和S2服務的pod部署在同一拓撲域中。
podAntiAffinity使用場 景:
將一個服務的POD分散在不同的主機或者拓撲域中,提高服務本身的穩定性。
給POD對于一個節點的獨占訪問權限來保證資源隔離,保證不會有其它pod來分享節點資源。
把可能會相互影響的服務的POD分散在不同的主機上。
參考:https://k8smeetup.github.io/docs/concepts/configuration/assign-pod-node/#node-親和性beta-特性
下面這個例子使用nodeAffinity把POD部署到主機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可以有多個,之間是或的關系,滿足任意一個既滿足,,MatchExpressions也可以有多個,他們之間是且的關系 必須都滿足。
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值為列表,根據權重決定順序
MatchExpressions 值為列表 關系為且,必須都滿足
Inter-pod affinity 是根據通過已運行在節點上的pod的標簽而不是node的標簽來決定被調度pod的運行節點,因為pod運行在指定的namespace所以需要自己指定運行pod的namesapce
anti-affinity 和Inter-pod affinity相反
在下面這個例子中,定義了一個Pod親和性和一個Pod反親和性規則。其中Pod親和性規則是一定要滿足的,Pod反親和性規則是參考滿足的。
Pod親和性規則的含義是:Pod必須部署在一個節點上,這個節點上至少有一個正在運行的Pod,這個Pod的security屬性取值是“S1”,并且要求部署的節點同正在運行的Pod所在節點都在相同的云服務區域中,也就是“topologyKey:failure-domain.beta.kubernetes.io/zone”。換言之,一旦某個區域出了問題,我們希望這些 Pod 能夠再次遷移到同一個區域。
Pod反親和性規則的含義是,Pod不能部署在一個節點上,這個節點上正在運行的Pod中security屬性取值是“S2”,并且新部署的Pod不能同security屬性取值是“S2”的Pod在相同的主機上,也就是“topologyKey: kubernetes.io/hostname”。
matchExpressions中operator的取值包括In、NotIn、Exists、DoesNotExist、Gt和Lt。topologyKey的取值包括:
kubernetes.io/hostname 同一個主機
1
failure-domain.beta.kubernetes.io/zone 同一個云服務區
1
failure-domain.beta.kubernetes.io/region 同一個區域
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
到此,相信大家對“k8s nodeSelector和affinity調度親和性的實現方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。