7.k8s.調度器scheduler 親和性、污點


#k8s. 調度器scheduler 親和性、污點

默認調度過程:預選 Predicates (過濾節點) --> 優選 Priorities(優先級排序) --> 優先級最高節點
實際使用,根據需求控制Pod調度,需要用到如下:
指定節點、nodeAffinity(節點親和性)、podAffinity(pod 親和性)、 podAntiAffinity(pod 反親和性)

#指定調度節點

# Pod.spec.nodeName 強制匹配,直接指定Node 節點,跳過 Scheduler 調度策略
#node-name-demo.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: demo-nodename
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: demo1
    spec:
      nodeName: node03  #指定Node節點
      containers:
      - name: demo1
        image: alivv/nginx:node
        ports:
        - containerPort: 80
#部署
kubectl apply -f node-name-demo.yaml
#查看pod全部在node03上 (node03節點不存在會一直處於pending)
kubectl get pod -o wide
#刪除
kubectl delete -f node-name-demo.yaml
# Pod.spec.nodeSelector 強制約束,調度策略匹配 label,調度 Pod 到目標節點
#node-selector-demo.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: demo-node-selector
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: demo1
    spec:
      nodeSelector:
        test1: node  #匹配lable test1=node
      containers:
      - name: demo1
        image: alivv/nginx:node
        ports:
        - containerPort: 80
#部署
kubectl apply -f node-selector-demo.yaml

#查看pod處於pending
kubectl get pod -o wide
#給node02節點添加lable
kubectl label nodes node02 test1=node
kubectl get nodes --show-labels
#再次查看pod在node02節點
kubectl get pod -o wide

#刪除
kubectl delete -f node-selector-demo.yaml
kubectl label nodes node02 test1-

親和性調度

親和性調度可以分成軟策略硬策略兩種方式

  • preferredDuringSchedulingIgnoredDuringExecution:軟策略,沒滿足條件就忽略,Pod可以啟動
  • requiredDuringSchedulingIgnoredDuringExecution:硬策略,沒滿足條件就等待,Pod處於Pending

操作符

  • In:label 的值在某個列表中
  • NotIn:label 的值不在某個列表中
  • Gt:label 的值大於某個值
  • Lt:label 的值小於某個值
  • Exists:某個 label 存在
  • DoesNotExist:某個 label 不存在

#節點親和性 pod.spec.nodeAffinity

#node-affinity-demo.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: node-affinity
  labels:
    app: affinity
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: affinity
    spec:
      containers:
      - name: nginx
        image: alivv/nginx:node
        ports:
        - containerPort: 80
          name: nginxweb
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:  #硬策略,不在node01節點
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: NotIn
                values:
                - node01
          preferredDuringSchedulingIgnoredDuringExecution:  #軟策略,優先匹配test2=node
          - weight: 1
            preference:
              matchExpressions:
              - key: test2
                operator: In
                values:
                - node
#給node03節點添加lable
kubectl label nodes node03 test2=node
kubectl get nodes --show-labels

#部署
kubectl apply -f node-affinity-demo.yaml

#查看pod
kubectl get pod -o wide

#刪除
kubectl delete -f node-affinity-demo.yaml
kubectl label nodes node03 test2-

#Pod親和性pod.spec.affinity.podAffinity/podAntiAffinity

podAffinity Pod親和性,解決 pod 部署在同一個拓撲域 、或同一個節點
podAntiAffinity Pod反親和性,避開Pod部署在一起

#pod-affinity-demo.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: pod-affinity-demo
  labels:
    app: pod-affinity
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: pod-affinity
    spec:
      containers:
      - name: nginx
        image: alivv/nginx:node
        ports:
        - containerPort: 80
          name: nginxweb
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:  #硬策略
          - labelSelector:  #匹配Pod有 app=demo1
              matchExpressions:
              - key: app
                operator: In
                values:
                - demo1
            topologyKey: kubernetes.io/hostname
#部署
kubectl apply -f pod-affinity-demo.yaml

#查看pod全部處於Pending 因為沒標簽app=demo1的Pod
kubectl get pod -o wide

#部署上面的node-name-demo.yaml
kubectl apply -f  node-name-demo.yaml
#再次查看pod全部在node03節點
kubectl get pod -o wide
#Pod反親和性測試
#改podAffinity為podAntiAffinity
sed -i 's/podAffinity/podAntiAffinity/' pod-affinity-demo.yaml
kubectl apply -f pod-affinity-demo.yaml

#查看node03節點移除pod-affinity-demo
kubectl get pod -o wide
#刪除
kubectl delete -f pod-affinity-demo.yaml
kubectl delete -f node-name-demo.yaml

# 污點taints與容忍tolerations

節點標記為 Taints ,除非 pod可以容忍污點節點,否則該 Taints 節點不會被調度pod
kubeadm安裝k8s,默認master節點會添加NoSchedule 類型污點

污點設置 kubectl taint nodes node-name key=value:effect
key 和 value 為污點標簽, value 可以為空,effect 描述污點的作用,effect 支持如下三個選項:

  • NoSchedule 不會將 Pod 調度到有污點的 Node
  • PreferNoSchedule 避免將 Pod 調度到有污點的 Node
  • NoExecute 不會將 Pod 調度到有污點的 Node ,將已經存在的 Pod 驅逐出去
#給node03添加污點
kubectl taint nodes node03 test-taint=node:NoSchedule
#查看
kubectl describe node node03 |grep Taints

容忍 pod.spec.tolerations

#pod-tolerations-demo.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: pod-tolerations-demo
  labels:
    app: pod-tolerations
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: pod-tolerations
    spec:
      containers:
      - name: nginx
        image: alivv/nginx:node
        ports:
        - containerPort: 80
          name: http
#創建Pod
kubectl apply -f pod-tolerations-demo.yaml

#查看Pod,node03節點有污點將不會創建Pod
kubectl get pod -o wide

#文件pod-tolerations-demo.yaml追加容忍污點配置
echo '#容忍污點
      tolerations:
      - key: "test-taint"
        #value: "node"
        operator: "Exists"  #忽略value值
        effect: "NoSchedule"
'>>pod-tolerations-demo.yaml
cat pod-tolerations-demo.yaml

#更新
kubectl apply -f pod-tolerations-demo.yaml
#Pod擴容
kubectl scale deployment pod-tolerations-demo --replicas 5

#再次查看Pod,Node03有Pod
kubectl get pod -o wide
#刪除Pod
kubectl delete -f pod-tolerations-demo.yaml
#刪除污點
kubectl taint nodes node03 test-taint-

#不指定 key 值時,容忍所有的污點 key

tolerations:
- operator: "Exist

#不指定 effect 值時,表示容忍所有的污點作用

tolerations:
- key: "key"
  operator: "Exist"

#避免資源浪費,設置master運行Pod,可以如下配置:

kubectl taint nodes --all  node-role.kubernetes.io/master- #先刪除默認污點
kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule

Blog地址 https://www.cnblogs.com/elvi/p/11755828.html
本文git地址 https://gitee.com/almi/k8s/tree/master/notes


免責聲明!

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



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