kubernetes資源調度


kubernetes默認情況下創建pod調度是由kubernetes scheduler來管理的,但顯然有時候還是需要人為介入。根據目前的kubernetes版本來說,有兩種自定義資源調度的方式:Node和Pod。

實例label配置:
10-19-53-145 node=node01
10-19-152-121 node=node02
10-19-25-188 node=node03

一.Node資源調度
Node資源調度又分為兩種:1.通過NodeSelector選擇label指定到相應的node節點。2.Node的親和性(nodeAffinity
1.NodeSelector的原理是通過在node節點創建對應的label,然后直接創建分配pod。通過命令賦予node節點lable的key和value,然后kubectl get nodes --show-labels查看具體效果。

kubectl label node nodename key=value

使用創建了goweb-4.yaml文件使用NodeSelector選擇到指定的node01。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: goweb-4
spec:
  selector:
    matchLabels:
      app: goweb-4
  replicas: 1
  template:
    metadata:
      labels:
        app: goweb-4
    spec: 
      containers: 
      - image: harbor.yanjiyou.net/yjy/goweb:v1.1
        name: goweb-4
        ports: 
        - containerPort: 8000
      nodeSelector:
         node: node01

NodeSelector只是最簡單的調度使用,顯然還不能完全滿足額外的需求。
2.Node的親和性(affinity)可以更加靈活選擇的node調度,其中涉及到兩個容易混淆的參數requiredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingIgnoredDuringExecution,最為簡單的理解就是必要硬件條件,非必要軟性條件,只要在滿足硬性條件下才能執行軟性條件。
使用創建了goweb-5.yaml文件選擇不在node02調度,盡量在node03上進行資源調度。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: goweb-5
spec:
  selector:
    matchLabels:
      app: goweb-5
  replicas: 2
  template:
    metadata:
      labels:
        app: goweb-5
    spec: 
      containers: 
      - image: harbor.yanjiyou.net/yjy/goweb:v1.1
        name: goweb-5
        ports: 
        - containerPort: 8000
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: node
                operator: NotIn
                values:
                - node02
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: node
                operator: In
                values:
                - node03


key和values需要提前指定
operator有In和NotIn參數,指定和非指定到某個節點

二.Pod資源調度
和node節點的資源調度一樣pod資源調度也是親和性(podAffinity)和反親和性(podAntiAffinity)的管理方式,只是管理的范圍不同,一個是面向node資源管理,一個是面向pod資源管理。
使用創建了goweb-6.yaml文件選擇和goweb-4容器在同一個節點上。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: goweb-6
spec:
  selector:
    matchLabels:
      app: goweb-6
  replicas: 2
  template:
    metadata:
      labels:
        app: goweb-6
    spec: 
      containers: 
      - image: harbor.yanjiyou.net/yjy/goweb:v1.1
        name: goweb-6
        ports: 
        - containerPort: 8000
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - goweb-4
              topologyKey: kubernetes.io/hostname

topologyKey可以設置成如下幾種類型
kubernetes.io/hostname#同個Node
failure-domain.beta.kubernetes.io/zone#同個Zone
failure-domain.beta.kubernetes.io/region #同個Region

補充:
1.使用親和性后可以同理使用反親和性,結果取相反。
2.Taints和tolerations特殊用法:如果一個節點被標記為taints,除非pod配置了tolerations,否則是不會被允許調度。在生產環境如果master也作為work節點的話,可以把master標記Taints,畢竟master運行kubernetes系統組件,如果運行pod容易把資源耗盡,造成master節點崩潰,當然后期如果要添加額外的系統組件,這時就可以通過給對應的pod配置toleration。

kubectl taint nodes nodename key=value:NoSchedule

value參數可以配置多個值
NoSchedule:不能調度,當之前調度的不管。
PreferNoSchedule:盡量不調度。
NoExecute:不能調度,而且之前已經調度上去的也會自動遷移走。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: goweb-7
spec:
  selector:
    matchLabels:
      app: goweb-7
  replicas: 2
  template:
    metadata:
      labels:
        app: goweb-7
    spec:
      containers:
      - image: harbor.yanjiyou.net/yjy/goweb:v1.1
        name: goweb-7
        ports:
        - containerPort: 8000
      tolerations:
      - key: "key"
        operator: "Equal"
        value: "value"
        effect: "NoSchedule


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM