首先在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