kubernete集群中pod的調(diào)度機(jī)制

今天小編給大家分享的是kubernete集群中pod的調(diào)度機(jī)制,相信大部分人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,話不多說(shuō),一起往下看吧。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到臨沭網(wǎng)站設(shè)計(jì)與臨沭網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋臨沭地區(qū)。

1. Pod調(diào)度

1.1 pod調(diào)度概述

kubernets是容器編排引擎,其中最主要的一個(gè)功能是容器的調(diào)度,通過(guò)kube-scheduler實(shí)現(xiàn)容器的完全自動(dòng)化調(diào)度,調(diào)度周期分為:調(diào)度周期Scheduling Cycle和綁定周期Binding Cycle,其中調(diào)度周期細(xì)分為過(guò)濾filter和weight稱重,按照指定的調(diào)度策略將滿足運(yùn)行pod節(jié)點(diǎn)的node賽選出來(lái),然后進(jìn)行排序;綁定周期是經(jīng)過(guò)kube-scheduler調(diào)度優(yōu)選的pod后,由特定的node節(jié)點(diǎn)watch然后通過(guò)kubelet運(yùn)行。

kubernete集群中pod的調(diào)度機(jī)制

過(guò)濾階段包含預(yù)選Predicate和scoring排序,預(yù)選是篩選滿足條件的node,排序是最滿足條件的node打分并排序,預(yù)選的算法包含有:

  • CheckNodeConditionPred  節(jié)點(diǎn)是否ready
  • MemoryPressure             節(jié)點(diǎn)內(nèi)存是否壓力大(內(nèi)存是否足夠)
  • DiskPressure                  節(jié)點(diǎn)磁盤(pán)壓力是否大(空間是否足夠)
  • PIDPressure                   節(jié)點(diǎn)Pid是否有壓力(Pid進(jìn)程是否足夠)
  • GeneralPred                   匹配pod.spec.hostname字段
  • MatchNodeSelector         匹配pod.spec.nodeSelector標(biāo)簽
  • PodFitsResources           判斷resource定義的資源是否滿足
  • PodToleratesNodeTaints  能容忍的污點(diǎn)pod.spec.tolerations
  • CheckNodeLabelPresence
  • CheckServiceAffinity
  • CheckVolumeBinding
  • NoVolumeZoneConflict

過(guò)濾條件需要檢查node上滿足的條件,可以通過(guò)kubectl describe node node-id方式查看,如下圖:

kubernete集群中pod的調(diào)度機(jī)制

優(yōu)選調(diào)度算法有:

  • least_requested  資源消耗最小的節(jié)點(diǎn)
  • balanced_resource_allocation 各項(xiàng)資源消耗最均勻的節(jié)點(diǎn)
  • node_prefer_avoid_pods  節(jié)點(diǎn)傾向
  • taint_toleration  污點(diǎn)檢測(cè),檢測(cè)有污點(diǎn)條件的node,得分越低
  • selector_spreading  節(jié)點(diǎn)selector
  • interpod_affinity      pod親和力遍歷
  • most_requested      資源消耗最大的節(jié)點(diǎn)
  • node_label             node標(biāo)簽

1. 2 指定nodeName調(diào)度

nodeName是PodSpec中的一個(gè)字段,可以通過(guò)pod.spec.nodeName指定將pod調(diào)度到某個(gè)具體的node節(jié)點(diǎn)上,該字段比較特殊一般都為空,如果有設(shè)置nodeName字段,kube-scheduler會(huì)直接跳過(guò)調(diào)度,在特定節(jié)點(diǎn)上通過(guò)kubelet啟動(dòng)pod。通過(guò)nodeName調(diào)度并非是集群的智能調(diào)度,通過(guò)指定調(diào)度的方式可能會(huì)存在資源不均勻的情況,建議設(shè)置Guaranteed的Qos,防止資源不均時(shí)候Pod被驅(qū)逐evince。如下以創(chuàng)建一個(gè)pod運(yùn)行在node-3上為例:

  1. 編寫(xiě)yaml將pod指定在node-3節(jié)點(diǎn)上運(yùn)行
[root@node-1 demo]# cat nginx-nodeName.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-run-on-nodename
  annotations:
    kubernetes.io/description: "Running the Pod on specific nodeName"
spec:
  containers:
  - name: nginx-run-on-nodename
    image: nginx:latest
    ports:
    - name: http-80-port
      protocol: TCP
      containerPort: 80 
  nodeName: node-3       #通過(guò)nodeName指定將nginx-run-on-nodename運(yùn)行在特定節(jié)點(diǎn)node-3上
  1. 運(yùn)行yaml配置使之生效
[root@node-1 demo]# kubectl apply -f nginx-nodeName.yaml 
pod/nginx-run-on-nodename created
  1. 查看確認(rèn)pod的運(yùn)行情況,已運(yùn)行在node-3節(jié)點(diǎn)
[root@node-1 demo]# kubectl get pods nginx-run-on-nodename -o wide 
NAME                    READY   STATUS    RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
nginx-run-on-nodename   1/1     Running   0          6m52s   10.244.2.15   node-3   <none>           <none>

1.2. 通過(guò)nodeSelector調(diào)度

nodeSelector是PodSpec中的一個(gè)字段,nodeSelector是最簡(jiǎn)單實(shí)現(xiàn)將pod運(yùn)行在特定node節(jié)點(diǎn)的實(shí)現(xiàn)方式,其通過(guò)指定key和value鍵值對(duì)的方式實(shí)現(xiàn),需要node設(shè)置上匹配的Labels,節(jié)點(diǎn)調(diào)度的時(shí)候指定上特定的labels即可。如下以node-2添加一個(gè)app:web的labels,調(diào)度pod的時(shí)候通過(guò)nodeSelector選擇該labels:
  1. 給node-2添加labels
[root@node-1 demo]# kubectl label node node-2 app=web
node/node-2 labeled
  1. 查看校驗(yàn)labels設(shè)置情況,node-2增加多了一個(gè)app=web的labels
[root@node-1 demo]# kubectl get nodes --show-labels 
NAME     STATUS   ROLES    AGE   VERSION   LABELS
node-1   Ready    master   15d   v1.15.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node-2   Ready    <none>   15d   v1.15.3   app=web,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-2,kubernetes.io/os=linux
node-3   Ready    <none>   15d   v1.15.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-3,kubernetes.io/os=linux
  1. 通過(guò)nodeSelector將pod調(diào)度到app=web所屬的labels
[root@node-1 demo]# cat nginx-nodeselector.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-run-on-nodeselector
  annotations:
    kubernetes.io/description: "Running the Pod on specific node by nodeSelector"
spec:
  containers:
  - name: nginx-run-on-nodeselector
    image: nginx:latest
    ports:
    - name: http-80-port
      protocol: TCP
      containerPort: 80 
  nodeSelector:     #通過(guò)nodeSelector將pod調(diào)度到特定的labels
    app: web
  1. 應(yīng)用yaml文件生成pod
[root@node-1 demo]# kubectl apply -f nginx-nodeselector.yaml 
pod/nginx-run-on-nodeselector created
  1. 檢查驗(yàn)證pod的運(yùn)行情況,已經(jīng)運(yùn)行在node-2節(jié)點(diǎn)
[root@node-1 demo]# kubectl get pods nginx-run-on-nodeselector -o wide 
NAME                        READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx-run-on-nodeselector   1/1     Running   0          51s   10.244.1.24   node-2   <none>           <none>

系統(tǒng)默認(rèn)預(yù)先定義有多種內(nèi)置的labels,這些labels可以標(biāo)識(shí)node的屬性,如arch架構(gòu),操作系統(tǒng)類型,主機(jī)名等

  • beta.kubernetes.io/arch=amd64
  • beta.kubernetes.io/os=linux
  • kubernetes.io/arch=amd64
  • kubernetes.io/hostname=node-3
  • kubernetes.io/os=linux

1.3 node Affinity and anti-affinity

affinity/anti-affinity和nodeSelector功能相類似,相比于nodeSelector,affinity的功能更加豐富,未來(lái)會(huì)取代nodeSelector,affinity增加了如下的一些功能增強(qiáng):

  • 表達(dá)式更加豐富,匹配方式支持多樣,如In,NotIn, Exists, DoesNotExist. Gt, and Lt;
  • 可指定soft和preference規(guī)則,soft表示需要滿足的條件,通過(guò)requiredDuringSchedulingIgnoredDuringExecution來(lái)設(shè)置,preference則是優(yōu)選選擇條件,通過(guò)preferredDuringSchedulingIgnoredDuringExecution指定
  • affinity提供兩種級(jí)別的親和和反親和:基于node的node affinity和基于pod的inter-pod affinity/anti-affinity,node affinity是通過(guò)node上的labels來(lái)實(shí)現(xiàn)親和力的調(diào)度,而pod affinity則是通過(guò)pod上的labels實(shí)現(xiàn)親和力的調(diào)度,兩者作用的范圍有所不同。

下面通過(guò)一個(gè)例子來(lái)演示node affinity的使用,requiredDuringSchedulingIgnoredDuringExecution指定需要滿足的條件,preferredDuringSchedulingIgnoredDuringExecution指定優(yōu)選的條件,兩者之間取與關(guān)系。

  1. 查詢node節(jié)點(diǎn)的labels,默認(rèn)包含有多個(gè)labels,如kubernetes.io/hostname
[root@node-1 ~]# kubectl get nodes --show-labels 
NAME  STATUS  ROLES AGE  VERSION  LABELS
node-1  Ready master  15d  v1.15.3  beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node-2  Ready <none>  15d  v1.15.3  app=web,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-2,kubernetes.io/os=linux
node-3  Ready <none>  15d  v1.15.3  beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-3,kubernetes.io/os=linux
  1. 通過(guò)node affiinity實(shí)現(xiàn)調(diào)度,通過(guò)requiredDuringSchedulingIgnoredDuringExecution指定滿足條件kubernetes.io/hostname為node-2和node-3,通過(guò)preferredDuringSchedulingIgnoredDuringExecution優(yōu)選條件需滿足app=web的labels
[root@node-1 demo]# cat nginx-node-affinity.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-run-node-affinity
  annotations:
    kubernetes.io/description: "Running the Pod on specific node by node affinity"
spec:
  containers:
  - name: nginx-run-node-affinity
    image: nginx:latest
    ports:
    - name: http-80-port
      protocol: TCP
      containerPort: 80 
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - node-1
            - node-2
            - node-3
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: app
            operator: In
            values: ["web"] 
  1. 應(yīng)用yaml文件生成pod
[root@node-1 demo]# kubectl apply -f nginx-node-affinity.yaml 
pod/nginx-run-node-affinity created
  1. 確認(rèn)pod所屬的node節(jié)點(diǎn),滿足require和 preferre條件的節(jié)點(diǎn)是node-2
[root@node-1 demo]# kubectl get pods --show-labels nginx-run-node-affinity -o wide 
NAME                      READY   STATUS    RESTARTS   AGE    IP            NODE     NOMINATED NODE   READINESS GATES   LABELS
nginx-run-node-affinity   1/1     Running   0          106s   10.244.1.25   node-2   <none>           <none>            <none>

看完上述內(nèi)容,你們對(duì)kubernete集群中pod的調(diào)度機(jī)制有進(jìn)一步的了解嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。

名稱欄目:kubernete集群中pod的調(diào)度機(jī)制
分享地址:http://bm7419.com/article48/jjeoep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、商城網(wǎng)站、標(biāo)簽優(yōu)化、企業(yè)建站、搜索引擎優(yōu)化、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)