溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

k8s nodeSelector和affinity調(diào)度親和性的實(shí)現(xiàn)方法

發(fā)布時(shí)間:2021-06-26 09:15:52 來(lái)源:億速云 閱讀:449 作者:chen 欄目:大數(shù)據(jù)

本篇內(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)方法”吧!

nodeSelector

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ī)上
podAffinityPod標(biāo)簽In,NotIn,Exists,DoesNotExist支持決定Pod可以和哪些Pod部署在同一拓?fù)溆?/td>
PodAntiAffinityPod標(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ī)則是否滿足。

使用場(chǎng)景介紹

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ī)上。

NodeAffinity

參考:https://k8smeetup.github.io/docs/concepts/configuration/assign-pod-node/#node-親和性beta-特性

requiredDuringSchedulingIgnoredDuringExecution的示例

下面這個(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)系 必須都滿足。

preferredDuringSchedulingIgnoredDuringExecution 例子
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 and anti-affinity

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的取值包括:

  1.   kubernetes.io/hostname       同一個(gè)主機(jī)

     

    • 1

  2.   failure-domain.beta.kubernetes.io/zone      同一個(gè)云服務(wù)區(qū)

     

    • 1

  3.   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í)!

向AI問一下細(xì)節(jié)

免責(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)容。

AI