溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

docker筆記33-調度器、預選策略及優(yōu)選函數(shù)

發(fā)布時間:2020-08-07 04:31:59 來源:ITPUB博客 閱讀:140 作者:czxin788 欄目:開發(fā)技術

     master是工作平面,上面運行著三個最核心的組件,apiserver、scheduler、controller manager。除此之外,master還依賴于ectd存儲節(jié)點,最好ectd是有冗余能力的集群,

 調度器(scheduler)   

   master上的 scheduler控制著pod運行在哪個node上的。不指定就用default scheduler。

   調度器的功能就是調度Pod在哪個Node上運行,這些調度信息存儲在master上的etcd里面。能夠和etcd打交道的只有apiserver。

    kubelete運行在node節(jié)點上,監(jiān)控著Node節(jié)點上的pod狀態(tài),并參與pod的創(chuàng)建等工作。

    kube-proxy也運行在node節(jié)點上,它監(jiān)控著service資源的變動。

    kubelete和kube-proxy都要連接master上的apiserver去獲取定義信息。

預選步驟

    default scheduler是通過三個步驟來實現(xiàn)調度的:

        a)、預選策略(predicate):先排除那些完全不符合此pod運行法則的節(jié)點,有兩個維度來排除,一個是最低資源需求,即節(jié)點必須滿足此Pod的最低資源;第二個是資源限額,即當前節(jié)點最多能給pod提供的資源。

        b)、優(yōu)選(priority):在符合節(jié)點找到最佳匹配的節(jié)點。

        c)、綁定(select):把pod綁定到優(yōu)選的節(jié)點上。

[root@master ~]# kubectl explain pod.spec
nodeName:指定pod運行在指定節(jié)點上
nodeSelector:用nodeSelector指定Pod運行在擁有某種selector 標簽的節(jié)點上。

    在k8s上,調度方式有這么幾類:   

    1、nodeaffinity,表示node親和性調度,表示這個pod對這個節(jié)點有一定的傾向性。我們通過上面的nodeselector來完成這類調度

    2、podaffinity或podunaffinity:pod親和性或者pod反親和性調度,有時我們期望某些Pod運行在同一個節(jié)點上或者是相鄰的節(jié)點上,或者我們期望某些Pod不要運行在某些節(jié)點上。

    3、taints和tolerations:污點和污點容忍調度:可以在某些節(jié)點上打上污點,表示這些節(jié)點不讓pod在其上面運行。taints是定義在節(jié)點之上的,tolerations是定義在pod之上的。

常用的預選策略

    訪問 https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/algorithm/predicates/predicates.go  ,查看k8s源代碼,可以看到這些策略。

    1、ChekNodeCondition

    表示檢查是否可以在節(jié)點磁盤、網(wǎng)絡不可用,或未準備好的前提下,能夠把pod調度到上去。

    2、GeneralPredicate

       a) hostname預選策略,表示如果pod定義了hostname屬性(pod.spec.hostname),則檢查節(jié)點的名字跟pod的hostname是否想匹配,但這里并不是定義這個pod必須運行在這些節(jié)點上。

       b)PodFitsHostPorts:如果節(jié)點定義了hostport屬性(pod.spec.containers.ports.hostPort),表示指定在節(jié)點的哪個端口上。如果這個節(jié)點的端口被占用了,那么這個節(jié)點就不適合運行這個pod。

       c)MatchNodeSelector:檢查pods.spec.nodeSelector這個字段你是否定義了,運行在攜有這有這些標簽選擇器的節(jié)點上。

       d) PodFitsResources:檢查節(jié)點是否有足夠的資源來支持這個pod運行。

[root@master ~]# kubectl describe nodes node1
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource  Requests(需求量)   Limits(限額)
  --------  --------   ------
  cpu       360m (9%)  110m (2%)
  memory    70Mi (1%)  70Mi (1%)
Events:     <none>

    e)NoDiskConfict:檢查Pod所請求存儲卷在此節(jié)點上是否不可用。 注意NoDiskConfict調度策略默認沒有啟用。

    f) PodToleratesNodeTaints:如果Pod定義了Tolerates(容忍度),即 pods.spec.tolerations,那么就看pod能不能容忍節(jié)點上的污點,如果是,表示這個節(jié)點可以被選定;

    g) PodToleratesNodeNoExecuteTaints:檢查pod是否容忍節(jié)點上有NoExecute污點。NoExecute這個污點是啥意思呢。如果一個pod上運行在一個沒有污點的節(jié)點上后,這個節(jié)點又給加上污點了,那么NoExecute表示這個新加污點的節(jié)點會祛除其上正在運行的pod;不加NoExecute不會祛除節(jié)點上運行的pod,表示接受既成事實,這是默認策略。

    h) CheckNodeLabelPresence:檢查節(jié)點上指定標簽的存在性,如果節(jié)點有pod指定的標簽,那么這個節(jié)點就被選中。 這個調度策略默認沒有啟用。

    i) CheckServceAffinity:一個service下可以有多個pod,比如這些pod都運行在1、2、3機器上,而沒有運行在4、5、6機器上,那么CheckServceAffinity就表示新加入的pod都集中運行在1、2、3機器上,這樣集中好處是一個service下pod之間內部通信的效率變高了。 這個策略默認也是沒有啟用的。

    j)MaxEBSVolumeCountPred:檢查節(jié)點上掛載的EBS存儲器(亞馬遜的彈性塊存儲)的數(shù)量是否超出了最大的設定值。一般來說,一個節(jié)點上最多可以掛載39個存儲卷??梢跃幾g安裝k8s指定該值。

    k) MaxGCEPDVolumeCountPred:GCE是谷歌的云存儲引擎??梢跃幾g安裝k8s指定該值。

    l) MaxAzureDiskVolumeCountPred:pod會選擇掛載足量Azure存儲卷的節(jié)點。

    m) CheckVolumeBinding:檢查節(jié)點上的pvc是否被別的pod綁定了

    n) NoVolumeZoneConfict: 檢查節(jié)點上的pod是否與pod的需求沖突。

    o) CheckNodeMemoryPressure:檢查節(jié)點內存是否存在壓力

    p)  CheckNodePIDpressure:檢查節(jié)點pid數(shù)量是否壓力過大,但一般pid是可以重復使用的。

    q)CheckNodeDiskPressure:

    r) MatchInterPodAffinity:檢查Pod是否滿足親和性或者反親和性。

    如果一個節(jié)點的第一個策略符合了,k8s

   常用的優(yōu)選函數(shù) 

        訪問 https://github.com/kubernetes/kubernetes/tree/master/pkg/scheduler/algorithm/priorities  可以看到k8s源碼里面的優(yōu)選函數(shù)。

    balanced_resource_allocation.go:均衡資源的使用方式,表示以cpu和內存占用率的相近程度作為評估標準,二者占用越接近,得分就越高,得分高的勝出。

    image_locality.go:表示根據(jù)滿足當前pod對象需求的已有鏡的體積大小之和來選擇節(jié)點的。

    least_requested.go:最少請求,空閑比例。對cpu來說,用cpu((capacity-sum(requested))*10/capacity)方式進行評估,得分最高的勝出。

    most_requested.go:表示盡可能的把一個節(jié)點的資源先用完,這個和least_requested相反,二者不能同時使用。

    node_prefer_avoid_pods.go:看節(jié)點是否有注解信息"scheduler.alpha.kubernetes.io/preferAvoidPods"。沒有這個注解信息,說明這個節(jié)點是適合運行這個pod的。

    node_affinity.go:根據(jù)pod對象中的nodeselector,對節(jié)點進行匹配度檢查,能夠成功匹配的數(shù)量越多,得分就越高。

    taint_toleration.go:將pod對象的spec.toleration與節(jié)點的taint列表項進行匹配度檢查,匹配的條目越多,得分越低。

    selector_spreading.go:spreading是散開的意思,查找當前pod對象對應的service,statefulset,replicatset等所匹配的標簽選擇器,在節(jié)點上運行的帶有這樣標簽的pod越少得分越高,這樣的pod優(yōu)選被選出。 這就是說我們要把同一個標簽選擇器下運行的pod散開(spreading)到多個節(jié)點上。

    interpod_affinity.go:遍歷Pod對象親和性的條目,并將那些能夠匹配到節(jié)點權重相加,值越大的得分越高,得分高的勝出。

    node_label.go:根據(jù)節(jié)點是否擁有標簽,來評估分數(shù)。

高級調度方式

    包括兩類:

    節(jié)點選擇器:nodeSelector(給node打上標簽,pod通過標簽預選節(jié)點),nodeName

    節(jié)點親和調度:nodeAffinity

節(jié)點選擇器(nodeSelector,nodeName)

[root@master ~]# kubectl explain pods.spec.nodeSelector
[root@master scheduler]# cat pod-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp  #kv格式的,也可以用花括號表示
    tier: frontend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對
spec:
  containers: 
  - name: myapp  #前面的-號表示這是一個列表格式的,也可以用中括號表示
    image: ikubernetes/myapp:v1
  nodeSelector: #指定該pod運行在有disktype=ssd標簽的node節(jié)點上
    disktype: harddisk #自己隨便寫
[root@master scheduler]# kubectl apply -f pod-demo.yaml 
pod/pod-demo created

[root@master scheduler]# kubectl get pods -o wide |grep demo

pod-demo                           0/1       Pending            0          14s       <none>        <none>

    可見,我們的pod-demo沒有運行起來,這是因為沒有任何節(jié)點打了disktype=harddisk標簽。

    那我們就給node2節(jié)點打disktype=harddisk標簽試試:

[root@master scheduler]# kubectl  label nodes node2 disktype=harddisk
node/node2 labeled
[root@master scheduler]# kubectl get nodes --show-labels  
NAME      STATUS    ROLES     AGE       VERSION   LABELS
master    Ready     master    34d       v1.11.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=master,node-role.kubernetes.io/master=
node1     Ready     <none>    34d       v1.11.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/hostname=node1
node2     Ready     <none>    34d       v1.11.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=harddisk,kubernetes.io/hostname=node2
[root@master scheduler]#  kubectl get pods -o wide |grep demo
pod-demo                           1/1       Running            0          5m        10.244.2.29   node2         0          3m        10.244.1.51   node1

    可以看到,我們新建立的pod-demo運行在node2節(jié)點上,因為只有node2才有disktype=harddisk標簽。

  節(jié)點親和調度(nodeAffinity)

[root@master scheduler]# kubectl explain pods.spec.affinity
[root@master scheduler]# kubectl explain pods.spec.affinity.nodeAffinity
preferredDuringSchedulingIgnoredDuringExecution:軟親和,可以滿足,也可以不滿足
requiredDuringSchedulingIgnoredDuringExecution:硬親和,表示必須滿足
[root@master ~]# kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms.matchExpressions
[root@master scheduler]# cat pod-nodeaffinity-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-node-affinity-demo
  namespace: default
  labels:
    app: myapp  #kv格式的,也可以用花括號表示
    tier: frontend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對
spec:
  containers: 
  - name: myapp  #前面的-號表示這是一個列表格式的,也可以用中括號表示
    image: ikubernetes/myapp:v1
  affinity:
     nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution: #硬親和性
        nodeSelectorTerms:
        - matchExpressions:
          - key: zone
            operator: In
            values:
            - foo
            - bar
[root@master scheduler]# kubectl apply -f pod-nodeaffinity-demo.yaml 
pod/pod-node-affinity-demo created
[root@master ~]# kubectl get pods -o wide |grep affinity
pod-node-affinity-demo             0/1       Pending            0          15s       <none>        <none>

    因為我們沒有任何一個節(jié)點擁有zone這個標簽,所以pod-node-affinity-demo運行不起來。

    下面我們再創(chuàng)建一個軟親和性的pod。

[root@master scheduler]# cat pod-nodeaffinity-demo2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-node-affinity-demo-2
  namespace: default
  labels:
    app: myapp  #kv格式的,也可以用花括號表示
    tier: frontend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對
spec:
  containers: 
  - name: myapp  #前面的-號表示這是一個列表格式的,也可以用中括號表示
    image: ikubernetes/myapp:v1
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution: #軟親和性
      - preference:
          matchExpressions:
          - key: zone
            operator: In
            values:
            - foo
            - bar
        weight: 60
 
[root@master scheduler]# kubectl apply -f pod-nodeaffinity-demo2.yaml 
pod/pod-node-affinity-demo-2 created
[root@master scheduler]# kubectl get pods -o wide |grep affinity-demo-2
pod-node-affinity-demo-2           1/1       Running            0          1m        10.244.2.30   node2

    看到pod-node-affinity-demo-2 運行起來了,因為這個pod我們是定義的軟親和性,表示即使任何節(jié)點都沒有zone標簽,也會找個節(jié)點讓Pod運行起來。

pod親和調度 

docker筆記33-調度器、預選策略及優(yōu)選函數(shù)    

    rack是機柜的意思,如果是用rack1、rack2、rack3、rack4這樣表示節(jié)點,那么每個節(jié)點都是不同的位置;可是我們給每個節(jié)點都打一個row=row1,即表示這些機器都在第一排機柜上,那么這四個機器又在同一位置,即第一排。所以我們可以用row這樣的方式來做親和性。

 [root@master scheduler]# kubectl explain pods.spec.affinity.podAffinity
 preferredDuringSchedulingIgnoredDuringExecution:軟親和,盡量滿足標簽
 requiredDuringSchedulingIgnoredDuringExecution:硬親和,必須滿足標簽
[root@master scheduler]# kubectl explain pods.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution
topologyKey:定義上圖row那樣的鍵
labelSelector:表示選定一組資源,跟哪些pod進行親和;
namespaces:指定Pod屬于哪個名稱空間中,一般我們不跨名稱空間去引用。
[root@master scheduler]# cat  pod-required-affnity-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  namespace: default
  labels:
    app: myapp  #kv格式的,也可以用花括號表示
    tier: frontend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對
spec:
  containers: 
  - name: myapp  #前面的-號表示這是一個列表格式的,也可以用中括號表示
    image: ikubernetes/myapp:v1
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  namespace: default
  labels:
    app: db  #kv格式的,也可以用花括號表示
    tier: backend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對
spec:
  containers: 
  - name: busybox  #前面的-號表示這是一個列表格式的,也可以用中括號表示
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ["sh","-c","sleep 3600"]
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution: #硬親和性
      - labelSelector:
          matchExpressions: #匹配pod的,而不是匹配節(jié)點
          - {key: app, operator: In, values: ["myapp"]} #意思是當前這個pod要跟一個有著標簽app=myapp(要和上面pod-first的metadata里面的標簽一致)的pod在一起
        topologyKey: kubernetes.io/hostname
[root@master scheduler]# kubectl apply -f pod-required-affnity-demo.yaml 
pod/pod-first unchanged
pod/pod-second created
[root@master scheduler]# kubectl get pods -o wide
NAME                               READY     STATUS             RESTARTS   AGE       IP            NODE
pod-first                          1/1       Running            0          2m        10.244.2.33   node2
pod-second                         1/1       Running            0          1m        10.244.2.34   node2

    上面看到我們的兩個pod都運行在同一個節(jié)點了,這是因為pod-second會和pod-first運行在同一個節(jié)點上。

pod反親和調度

[root@master ~]# kubectl explain pods.spec.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution
[root@master scheduler]# cat  pod-required-anti-affnity-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  namespace: default
  labels:
    app: myapp  #kv格式的,也可以用花括號表示
    tier: frontend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對
spec:
  containers: 
  - name: myapp  #前面的-號表示這是一個列表格式的,也可以用中括號表示
    image: ikubernetes/myapp:v1
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  namespace: default
  labels:
    app: db  #kv格式的,也可以用花括號表示
    tier: backend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對
spec:
  containers: 
  - name: busybox  #前面的-號表示這是一個列表格式的,也可以用中括號表示
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ["sh","-c","sleep 3600"]
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution: #硬親和性
      - labelSelector:
          matchExpressions: #匹配pod的,而不是匹配節(jié)點
          - {key: app, operator: In, values: ["myapp"]} #意思是當前這個pod要跟一個有著標簽app=myapp(要和上面pod-first的metadata里面的標簽一致)的pod在一起
        topologyKey: kubernetes.io/hostname
[root@master scheduler]# kubectl apply -f pod-required-anti-affnity-demo.yaml 
pod/pod-first created
pod/pod-second created
[root@master scheduler]# kubectl get pods -o wide
NAME                               READY     STATUS             RESTARTS   AGE       IP            NODE
pod-first                          1/1       Running            0          1m        10.244.2.35   node2
pod-second                         0/1       Running            0          1m        10.244.2.36        node1

    上面可以看到pod-first和pod-second就不會被調度到同一個節(jié)點上。

    下面給兩個節(jié)點打標簽,給兩個節(jié)點打一樣的標簽

[root@master scheduler]# kubectl label nodes node2 zone=foo
node/node2 labeled
[root@master scheduler]# kubectl label nodes node1 zone=foo
node/node1 labeled
[root@master scheduler]# cat  pod-required-anti-affnity-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  namespace: default
  labels:
    app: myapp  #kv格式的,也可以用花括號表示
    tier: frontend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對
spec:
  containers: 
  - name: myapp  #前面的-號表示這是一個列表格式的,也可以用中括號表示
    image: ikubernetes/myapp:v1
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  namespace: default
  labels:
    app: db  #kv格式的,也可以用花括號表示
    tier: backend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對
spec:
  containers: 
  - name: busybox  #前面的-號表示這是一個列表格式的,也可以用中括號表示
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ["sh","-c","sleep 3600"]
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution: #硬親和性
      - labelSelector:
          matchExpressions: #匹配pod的,而不是匹配節(jié)點
          - {key: app, operator: In, values: ["myapp"]} #意思是當前這個pod要跟一個有著標簽app=myapp(要和上面pod-first的metadata里面的標簽一致)的pod在一起
        topologyKey: zone

    上面把topologyKey(標簽選擇器的值)的值改成zone,而pod調度策略是podAntiAffinity反親和性,所以pod-first和pod-second不能同時運行在標有zone標簽的節(jié)點上。所以最終出現(xiàn)的現(xiàn)場就是有一個pod-first能成功運行,而另外一個pod-second因為是反親和的,沒有節(jié)點可以運行而處于pending狀態(tài)。

[root@master scheduler]# kubectl get pods -o wide
NAME                               READY     STATUS             RESTARTS   AGE       IP            NODE
pod-first                          1/1       Running            0          10m       10.244.2.37   node2
pod-second                         0/1       Pending            0          10m       <none>        <none>

污點調度

    前面幾種調度方式都是讓pod來選擇節(jié)點。污點是讓節(jié)點來選擇哪些pod能運行在其上面。

    污點也是鍵值對。

[root@master scheduler]# kubectl explain nodes.spec.taints
effect:表示當pod不能容忍節(jié)點上污點時的行為是什么,主要有三種行為:
NoSchedule:僅影響調度過程,不影響現(xiàn)存pod。沒調度過來的就調度不過來了。如果對節(jié)點新加了污點,那么對節(jié)點上現(xiàn)存的Pod沒有影響。
NoExecute:既影響調度過程,也影響現(xiàn)存Pod,沒調度過來的就調度不過來了,如果對節(jié)點新加了污點,那么對現(xiàn)存的pod對象將會被驅逐
PreferNoSchedule:不能容忍就不能調度過來,但是實在沒辦法也是能調度過來的。對節(jié)點新加了污點,那么對節(jié)點上現(xiàn)存的pod沒有影響。

    查看節(jié)點的污點:

[root@master scheduler]# kubectl describe node node1
Taints:             <none>

    查看pod的容忍度:

[root@master scheduler]# kubectl describe pods myapp-0
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s

    每次都要檢查pod的容忍度是否和節(jié)點的污點匹配。

    下面我們給node1打上污點node-type=production:NoSchedule,注意污點和容忍度都是自定義的鍵值對。

[root@master scheduler]# kubectl taint node node1 node-type=production:NoSchedule
node/node1 tainted
[root@master scheduler]# kubectl explain pods.spec.tolerations
tolerationSeconds:表示寬限多長時間pod被驅逐
operator:操作符,其值有Exists表示只要節(jié)點有這個污點的key,pod都能容忍;Equal表示只要節(jié)點必須精確匹配污點的key和value才能容忍,
[root@master scheduler]# cat pod-demo.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80
      tolerations: 
        - key: "node-type"
          operator: "Equal" #表示只要節(jié)點必須精確匹配污點的key和value才能容忍
          value: "production"
          effect: "NoSchedule"
[root@master scheduler]# kubectl get pods -o wide
NAME                            READY     STATUS              RESTARTS   AGE       IP            NODE
myapp-deploy-98fddd79f-6dzbg    1/1       Running             0          9s        10.244.1.58   node1
myapp-deploy-98fddd79f-8fqn4    1/1       Running             0          12s       10.244.1.57   node1
myapp-deploy-98fddd79f-cqnbj    1/1       Running             0          6s        10.244.1.59   node1

    看到pod能容忍node1的污點node-type=production:NoSchedule,所以pod可以被調度到node1上運行。

    下面我們把operator: "Equal"改成operator: "Exists"

[root@master scheduler]# cat pod-demo.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80
      tolerations: 
        - key: "node-type"
          operator: "Exists" #表示只要節(jié)點匹配key: node-type,不管其value是什么,pod都能容忍節(jié)點上的污點
          value: ""
          effect: "NoSchedule"
[root@master scheduler]# kubectl apply -f pod-demo.yaml
[root@master scheduler]# kubectl get pods -o wide
NAME                            READY     STATUS              RESTARTS   AGE       IP            NODE
myapp-deploy-7dd988dc9d-747t4   1/1       Running             0          51s       10.244.2.45   node2
myapp-deploy-7dd988dc9d-cl4ft   1/1       Running             0          47s       10.244.1.60   node1
myapp-deploy-7dd988dc9d-hnrr5   1/1       Running             0          49s       10.244.2.46   node2

    最后,我們去掉節(jié)點上的污點:

[root@master metrics]# kubectl taint node node1 node-type-
node/node1 untainted



向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI