k8s-Pod調度策略


首先在k8s中,k8s會根據每個work節點的配置,負載差異,自動生成優選函數,根據優選函數,當master節點分配下來任務時,將pod分配帶最適合運行的node節點上。

之外我們技術人員還有以下三種方式去影響我們的pod調度,

1. node節點調度器

2. 親和性調度

3. 污點容忍度

4. 資源影響調度

 

區別和實例操作

一 .node節點調度

是最直接的調度方式,簡單粗暴,所以常用在簡單的集群架構中,負載的資源分類和編制不適合這種方式,
解釋:大概意思就是給我們的work節點綁定唯一便簽,然后在pod的yml文件中去設置node便簽匹配器綁定節點,這樣就能實現影響k8s優選參數的選擇,讓當前的pod啟動在設置的node節點上。

1、首先通過 kubectl 給 node 打上標簽

格式:
kubectl label nodes <node-name> <label-key>=<label-value>
[root@k8s-master ~]# kubectl label nodes k8s-node01 zone=sh
[root@k8s-master ~]# kubectl get nodes --show-labels

 

2、通過 nodeSelector 調度 pod 到 node
  • Pod的定義中通過nodeSelector指定label標簽,pod將會只調度到具有該標簽的node之上
[root@k8s-master ~]# vim pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd

  

  • 這個例子中pod只會調度到具有 disktype=ssd 的 node 上面.
  • 驗證 節點調度
[root@k8s-master ~]# kubectl apply -f pod-demo.yaml 
[root@k8s-master ~]# kubectl get pods -o wide
[root@k8s-master ~]# kubectl describe pod  pod-demo   ##查看事件

  

二 .親和性調度

較復雜,應用在復雜的多節點歸類,資源分類管理的中大型集群中,有硬親和,軟親和,親和性和反親和,兩兩為一組,反義詞

硬親和:匹配節點上的其中一個或多個標簽(必須存在一個)
軟親和:匹配節點上的其中一個或多個標簽(有則選擇這個node,沒有就參考優選函數)

1.硬親和

[root@k8s-master ~]# vim pod-nodeaffinity-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-node-affinity-demo
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: zone
            operator: In
            values:
            - foo
            - bar

[root@k8s-master ~]# kubectl apply -f pod-nodeaffinity-demo.yaml

[root@k8s-master ~]# kubectl describe pod pod-node-affinity-demo
# 運行結果:
Warning  FailedScheduling  2s (x8 over 20s)  default-scheduler  0/3 nodes are available: 3 node(s) didn't match node selector.

# 給其中一個node打上foo的標簽
[root@k8s-master ~]# kubectl label node k8s-node01 zone=foo

# 正常啟動
[root@k8s-master ~]# kubectl get pods

  

2.軟親和

[root@k8s-master ~]# vim pod-nodeaffinity-demo-2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-node-affinity-demo-2
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - preference:
          matchExpressions:
          - key: zone
            operator: In
            values:
            - foo
            - bar
        weight: 60
      - preference:
          matchExpressions:
          - key: zone1
            operator: In
            values:
            - foo1
            - bar1
        weight: 10 

[root@k8s-master ~]# kubectl apply -f pod-nodeaffinity-demo-2.yaml

  

3.同時存在時(硬,軟親和)

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: zone
            operator: In
            values:
            - dev
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd
  containers:
  - name: with-node-affinity
    image: nginx

  

三.污點和容忍度

與之前兩個調度方式不同,污點是首先給節點綁定污點,作用是保護節點,不再讓這個節點會scheduler(資源調度)選為pod啟動環境。
我們集群中master就是設置污點,所以你啟動任何pod都不會在master上工作,保證master的工作效率。

相關參數
介紹幾個用到的參數

operator 可以定義為
  Equal:表示key是否等於value,默認
  Exists:表示key是否存在,此時無需定義value
tain 的 effect 定義對 Pod 排斥效果
  NoSchedule:僅影響調度過程,對現存的Pod對象不產生影響;
  NoExecute:既影響調度過程,也影響現有的Pod對象;不容忍的Pod對象將被驅逐
  PreferNoSchedule: 表示盡量不調度

查看節點的污點

kubectl describe node k8s-node01 | grep Taints

  

設置污點

kubectl taint node k8s-node01 node-type=production:NoSchedule

  

創建容器測試

[root@k8s-master ~]# vim deploy-demo.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 2
  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

[root@k8s-master ~]# kubectl apply -f deploy-demo.yaml 

[root@k8s-master ~]# kubectl get pods -o wide
# 運行結果:
NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE
myapp-deploy-69b47bc96d-cwt79   1/1     Running   0          5s    10.244.2.6   k8s-node02
myapp-deploy-69b47bc96d-qqrwq   1/1     Running   0          5s    10.244.2.5   k8s-node02

  

所以只能啟動到沒有污點的node2節點上

設置一個能容忍node1污點的pod測試

[root@k8s-master ~]# vim deploy-demo.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: defaultm
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v2
        ports:
        - name: http
          containerPort: 80
      tolerations:
      - key: "node-type"
        operator: "Equal"
        value: "production"
        effect: "NoSchedule"


[root@k8s-master ~]# kubectl apply -f deploy-demo.yaml

  

測試

[root@k8s-master ~]# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE
myapp-deploy-65cc47f858-tmpnz   1/1     Running   0          10s   10.244.1.10   k8s-node01
myapp-deploy-65cc47f858-xnklh   1/1     Running   0          13s   10.244.1.9    k8s-node01

  

其他參數的作用

  • 定義Toleration,是否存在 node-type 這個key 且 effect 值為 NoSchedule
[root@k8s-master ~]# vim deploy-demo.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v2
        ports:
        - name: http
          containerPort: 80
      tolerations:
      - key: "node-type"
        operator: "Exists"
        value: ""
        effect: "NoSchedule"

[root@k8s-master ~]# kubectl apply -f deploy-demo.yaml

[root@k8s-master ~]# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE
myapp-deploy-559f559bcc-6jfqq   1/1     Running   0          10s   10.244.1.11   k8s-node01
myapp-deploy-559f559bcc-rlwp2   1/1     Running   0          9s    10.244.1.12   k8s-node01

  

  • 定義Toleration,是否存在 node-type 這個key 且 effect 值為空,則包含所有的值
[root@k8s-master ~]# vim deploy-demo.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v2
        ports:
        - name: http
          containerPort: 80
      tolerations:
      - key: "node-type"
        operator: "Exists"
        value: ""
        effect: ""

[root@k8s-master ~]# kubectl apply -f deploy-demo.yaml

# 兩個 pod 均衡調度到兩個節點
kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE
myapp-deploy-5d9c6985f5-hn4k2   1/1     Running   0          2m    10.244.1.13   k8s-node01
myapp-deploy-5d9c6985f5-lkf9q   1/1     Running   0          2m    10.244.2.7    k8s-node02

  

4. 資源影響調度

在創建pod 的時候會配置resource 來設定容器需要的CPU 和memory,,主要是包括 requsts 和 limits,, 當然schedule 在調度的時候也會根據node 上剩余資源的情況,來調度pod 在哪個節點上。這里就不做具體演示了。

 

原文:https://blog.csdn.net/ht9999i/article/details/108037568


免責聲明!

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



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