自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

十分鐘搞懂K8S的親和與反親和調(diào)度

云計(jì)算 云原生
本文主要快速講解Kubernetes的親和性調(diào)度和反親和性調(diào)度,通過(guò)理論結(jié)合實(shí)際的方式,讓理解更深刻。

本文主要快速講解Kubernetes的親和性調(diào)度 和 反親和性調(diào)度,通過(guò)理論結(jié)合實(shí)際的方式,讓理解更深刻。

首先來(lái)個(gè)一句話(huà)總結(jié):親和性調(diào)度就像關(guān)系親密的閨蜜,你去哪兒我也去哪兒。反親和性調(diào)度就像賭氣的兩個(gè)孩子,賭氣永遠(yuǎn)不在一起玩兒。更多解釋和實(shí)戰(zhàn)詳見(jiàn)下文?;?0分鐘看到最后,你肯定會(huì)有收獲。

一、調(diào)度Pod的主要方式

Pod調(diào)度到指定Node的方式主要有4種:

  • nodeName調(diào)度:直接在Pod的yaml編排文件中指定nodeName,調(diào)度到指定name的節(jié)點(diǎn)上。
  • nodeSelector調(diào)度:直接在Pod的yaml編排文件中指定nodeSelector,調(diào)度到帶有指定label的節(jié)點(diǎn)上。
  • 污點(diǎn)(Taints)和容忍度(Tolerations)調(diào)度:詳見(jiàn)文章《5分鐘搞懂K8S的污點(diǎn)和容忍度(理論+實(shí)戰(zhàn))》。主要通過(guò)在Node節(jié)點(diǎn)上打污點(diǎn),然后在Pod的yaml編排文件中配置容忍度,來(lái)實(shí)現(xiàn)調(diào)度。
  • 親和-反親和調(diào)度:見(jiàn)下文講解。

二、為什么需要親和調(diào)度

有了nodeName調(diào)度、nodeSelector調(diào)度、污點(diǎn)(Taints)和容忍度(Tolerations)調(diào)度,為什么還需要親和-反親和調(diào)度呢?

為了更靈活更復(fù)雜的調(diào)度方式。比如有些場(chǎng)景想把2個(gè)Pod 調(diào)度到一臺(tái)節(jié)點(diǎn)上,有的場(chǎng)景為了隔離性高可用性想把2個(gè)Pod分開(kāi)到不同節(jié)點(diǎn)上,或者有的場(chǎng)景想把Pod調(diào)度到指定的一些特點(diǎn)節(jié)點(diǎn)上。

三、親和調(diào)度的前置概念(重要)

label在K8S中是非常重要的概念,不管是什么場(chǎng)景,只要和選擇、篩選相關(guān)的,基本是用label字段來(lái)匹配的。

親和性和反親和性的調(diào)度,篩選的條件依舊用的是Node的label字段。

不管是Node親和性調(diào)度,還是Pod親和性調(diào)度,被調(diào)度的主體都是Pod。都是講的Pod根據(jù)親和規(guī)則調(diào)度到某個(gè)節(jié)點(diǎn),或者Pod跟隨別的Pod調(diào)到到某個(gè)節(jié)點(diǎn)(比如Pod1跟隨Pod2,Pod2被調(diào)度到B節(jié)點(diǎn),那么Pod1也被調(diào)度到B節(jié)點(diǎn))。

Node親和性調(diào)度 和  Pod親和性調(diào)度 的配置都是寫(xiě)在 編排Pod的yaml里。因?yàn)楸徽{(diào)度的主體是Pod。

Node親和性調(diào)度是指Pod和Node的親密關(guān)系。

Pod親和性調(diào)度是指Pod和Pod的親密關(guān)系。

  • 硬親和:親和規(guī)則只有一種,必須符合該規(guī)則。
  • 軟親和:規(guī)則有多種,每個(gè)權(quán)重不同,根據(jù)權(quán)重優(yōu)先級(jí)去選擇一個(gè)規(guī)則。

Node親和性調(diào)度的圖示如下,Pod親和性調(diào)用和Pod反親和性調(diào)用也類(lèi)似。

四、親和調(diào)度的具體概念

Affinity的中文意思是親近,用來(lái)表述親和性調(diào)度再合適不過(guò)了。

親和性調(diào)度:就好像Node(或者Pod)和Pod是關(guān)系很好的閨蜜,Pod說(shuō),“只要符合這種label的Node(Pod)都是我的好閨蜜,閨蜜在哪兒我就去哪兒”。

反親和性調(diào)度:就好像2個(gè)Pod是賭氣的2個(gè)孩子,互相對(duì)著干,一個(gè)往東,另一隨便去哪個(gè)方向就是不往東,他們不會(huì)去到同一個(gè)地方。

1.記住這三種調(diào)度關(guān)系

親和性調(diào)度 和 反親和性調(diào)度的關(guān)系就三種:

  • node親和調(diào)度:硬親和、軟親和
  • pod親和調(diào)度:硬親和、軟親和
  • pod反親和調(diào)度:硬親和、軟親和

2.記住這2種親和表達(dá)式

不管是Node親和 還是Pod親和,他們都有2種親和性表達(dá)方式:

  • RequiredDuringSchedulingIgnoredDuringExecution:是硬親和的方式,必須滿(mǎn)足指定的規(guī)則才可以把Pod調(diào)度到該Node上。這里注意Required這個(gè)詞,中文意思必須的。
  • PreferredDuringSchedulingIgnoredDuringExecution:是軟親和的方式,強(qiáng)調(diào)優(yōu)先滿(mǎn)足某個(gè)規(guī)則,然后根據(jù)優(yōu)先的規(guī)則,將Pod調(diào)度到節(jié)點(diǎn)上。這里注意Preferred這個(gè)詞,中文意思是首選,用來(lái)說(shuō)明選擇規(guī)則的優(yōu)先級(jí),確實(shí)比較合適。

這兩個(gè)字段也比較長(zhǎng),我們來(lái)做下拆解,將RequiredDuringSchedulingIgnoredDuringExecution拆解為RequiredDuringScheduling和IgnoredDuringExecution。

  • RequiredDuringScheduling:定義的規(guī)則必須強(qiáng)制滿(mǎn)足(Required)才會(huì)把Pod調(diào)度到節(jié)點(diǎn)上。
  • IgnoredDuringExecution:已經(jīng)在節(jié)點(diǎn)上運(yùn)行的Pod不需要滿(mǎn)足定義的規(guī)則,即使去除節(jié)點(diǎn)上的某個(gè)標(biāo)簽,那些需要節(jié)點(diǎn)包含該標(biāo)簽的Pod依舊會(huì)在該節(jié)點(diǎn)上運(yùn)行。或者這么理解:如果Pod所在的節(jié)點(diǎn)在Pod運(yùn)行期間標(biāo)簽被刪除了,不再符合該P(yáng)od的節(jié)點(diǎn)親和性規(guī)則,那也沒(méi)關(guān)系,該P(yáng)od 還能繼續(xù)在該節(jié)點(diǎn)上運(yùn)行。

3.表達(dá)式中的操作符

親和性表達(dá)方式需要用到如下幾個(gè)可選的操作符operator:

  • In:標(biāo)簽的值在某個(gè)列表中
  • NotIn:標(biāo)簽的值不在某個(gè)列表中
  • Exists:存在某個(gè)標(biāo)簽
  • DoesNotExist:不存在某個(gè)標(biāo)簽
  • Gt:標(biāo)簽的值大于某個(gè)值(字符串比較)
  • Lt:標(biāo)簽的值小于某個(gè)值(字符串比較)

這些操作符里,雖然沒(méi)有排斥某個(gè)節(jié)點(diǎn)的功能,但是用這幾個(gè)標(biāo)簽也可以變相的實(shí)現(xiàn)排斥的功能。

4.作用域topologyKey

topologyKey很多地方解釋為拓?fù)浣ǎ苁琴M(fèi)解。實(shí)際上就是個(gè)作用域的概念。

topologyKey配置了一個(gè)label的key,那么存在這個(gè)key對(duì)應(yīng)的label的所有Node就在同一個(gè)作用域里。

五、實(shí)戰(zhàn)

理論知識(shí)講解完畢,接下來(lái)通過(guò)實(shí)戰(zhàn)加深理解。你可以按照步驟操作實(shí)踐。

1.nodeName調(diào)度

比如要將Pod調(diào)度到nodeName是k8s-worker-2的節(jié)點(diǎn)上

apiVersion: v1
kind: Pod
metadata:
  name: webapp
  namespace: demo
  labels:
    app: webapp
spec:
  nodeName: 'k8s-worker-2'
  containers:
    - name: webapp
      image: nginx
      ports:
        - containerPort: 80

2.nodeSelector調(diào)度

比如要將Pod調(diào)度到具有"special-app"="specialwebapp"的label節(jié)點(diǎn)上。

查看節(jié)點(diǎn)信息:

kubectl describe node k8s-worker-2

Pod的yaml編排文件:

apiVersion: v1
kind: Pod
metadata:
  name: webapp
  namespace: demo
  labels:
    app: webapp
spec:
  nodeSelector:
    # 選擇調(diào)度到具有這個(gè)label的節(jié)點(diǎn)
    "special-app": "specialwebapp"
  containers:
    - name: webapp
      image: nginx
      ports:
        - containerPort: 80

查看Pod被調(diào)度到哪臺(tái)機(jī)器上:

kubectl get pod -n demo -o wide

3.Node親和調(diào)度

Node的親和調(diào)度是指,Node和Pod的關(guān)系。

(1) 硬親和

定義Pod-Node的硬親和yaml文件:pod_node_required_affinity.yaml。文件內(nèi)容如下:

apiVersion: v1
kind: Pod
metadata:
  name: webapp
  namespace: demo
  labels:
    app: webapp
spec:
  containers:
    - name: webapp
      image: nginx
      ports:
        - containerPort: 80
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: app
                operator: In
                values:
                  - backend

給k8s-worker-3節(jié)點(diǎn)添加label:

kubectl label node k8s-worker-3 app=backend

查看k8s-worker-3節(jié)點(diǎn)的label情況:

kubectl get node k8s-worker-3 --show-labels

執(zhí)行上面的yaml部署Pod,可以看到Pod已經(jīng)被調(diào)度到k8s-worker-3節(jié)點(diǎn)上。

(2) 軟親和

軟親和調(diào)度,主要就是加入了多個(gè)規(guī)則,每個(gè)設(shè)置了權(quán)重,yaml文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: webapp
  namespace: demo
  labels:
    app: webapp
spec:
  containers:
    - name: webapp
      image: nginx
      ports:
        - containerPort: 80
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 80
          preference:
            matchExpressions:
              - key: app2
                operator: Exists
        - weight: 20
          preference:
            matchExpressions:
              - key: app
                operator: In
                values:
                  - backend2

刪除之前的Pod,刪除之前的k8s-worker-3節(jié)點(diǎn)的label,再給k8s-worker-2節(jié)點(diǎn)的增加app2=backend的label。

kubectl delete pod webapp -n demo
kubectl label node k8s-worker-3 app-
kubectl label node k8s-worker-2 app2=backend

部署上面的軟親和yaml文件,可以看到Pod被調(diào)度到了k8s-worker-2節(jié)點(diǎn)。

4.Pod親和調(diào)度

Pod親和調(diào)度,是指Pod和Pod之間的關(guān)系。

(1) 硬親和

比如Pod1跟隨Pod2,Pod2被調(diào)度到B節(jié)點(diǎn),那么Pod1也被調(diào)度到B節(jié)點(diǎn)。

所以這里準(zhǔn)備2個(gè)Pod。Pod1使用上面的例子,讓Pod1采用Node硬親和調(diào)度到k8s-worker-3節(jié)點(diǎn)。然后再部署Pod2,讓它跟隨Pod1,也會(huì)被調(diào)度到k8s-worker-3節(jié)點(diǎn)。

準(zhǔn)備Pod2的yaml編排文件pod_pod_required_affinity.yaml,如下:

apiVersion: v1
kind: Pod
metadata:
  name: webapp-1
  namespace: demo
  labels:
    app: webapp-1
spec:
  containers:
    - name: webapp
      image: nginx
      ports:
        - containerPort: 80
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - topologyKey: kubernetes.io/hostname
          labelSelector:
            matchExpressions:
              - key: app
                operator: In
                values:
                  - webapp

可以看到Pod2跟隨Pod1,也被調(diào)度到了k8s-worker-3節(jié)點(diǎn)。

(2) 軟親和

軟親和和硬親和類(lèi)似,只是多了權(quán)重,你可以自行嘗試。

5.Pod反親和調(diào)度

(1) 反親和的硬親和

接著上面的例子,繼續(xù)準(zhǔn)備Pod3的yaml編排文件,如下:

apiVersion: v1
kind: Pod
metadata:
  name: webapp-2
  namespace: demo
  labels:
    app: webapp-2
spec:
  containers:
    - name: webapp
      image: nginx
      ports:
        - containerPort: 80
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - topologyKey: kubernetes.io/hostname
          labelSelector:
            matchExpressions:
              - key: app
                operator: In
                values:
                  - webapp

使用Pod反親和的方式,讓Pod3和Pod1不會(huì)部署在一起。部署完畢后,查看結(jié)果,Pod3因?yàn)榉从H和被調(diào)度到了k8s-worker-2節(jié)點(diǎn)。

(2) 反親和的軟親和

反親和的軟親和 和 硬親和類(lèi)似,只是多了權(quán)重,你可以自行嘗試。

六、總結(jié)

本文主要快速講解Kubernetes的親和性和反親和性調(diào)度。讀完本文你需要記住以下3點(diǎn):

  • 親和性 和 反親和性的調(diào)度,篩選的條件使用的是Node(Pod)的label字段。
  • 親和性調(diào)度:就好像Node(Pod)和Pod是關(guān)系很好的閨蜜,Pod說(shuō),“只要符合這種label的Node(Pod)都是我的好閨蜜,閨蜜在哪兒我就去哪兒”。
  • 反親和性調(diào)度:就好像2個(gè)Pod是賭氣的2個(gè)孩子,互相對(duì)著干,一個(gè)往東,另一隨便去哪個(gè)方向就是不往東,他們不會(huì)去到同一個(gè)地方。
責(zé)任編輯:趙寧寧 來(lái)源: 不焦躁的程序員
相關(guān)推薦

2023-09-27 22:33:40

KubernetesK8S

2019-09-16 09:14:51

2024-01-29 00:20:00

GolangGo代碼

2024-01-29 13:03:02

2020-12-17 06:48:21

SQLkafkaMySQL

2019-04-01 14:59:56

負(fù)載均衡服務(wù)器網(wǎng)絡(luò)

2020-12-11 09:40:10

DevOpsCICD

2024-01-12 08:03:29

k8s配置持久化

2021-03-03 11:36:57

Java 8Java 15Java

2021-09-07 09:40:20

Spark大數(shù)據(jù)引擎

2022-06-16 07:31:41

Web組件封裝HTML 標(biāo)簽

2024-06-19 09:58:29

2023-04-12 11:18:51

甘特圖前端

2015-09-06 09:22:24

框架搭建快速高效app

2012-07-10 01:22:32

PythonPython教程

2024-05-13 09:28:43

Flink SQL大數(shù)據(jù)

2023-11-30 10:21:48

虛擬列表虛擬列表工具庫(kù)

2023-06-07 08:27:10

Docker容器

2025-02-10 12:05:15

2023-11-09 14:44:27

Docker鏡像容器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)