Kubernetes中kube-scheduler組件負責Pod的調度,對每一個新創建的 Pod 或者是未被調度的 Pod,kube-scheduler 會選擇一個最優的節點去運行這個 Pod。
kube-scheduler 給一個 Pod 做調度選擇包含過濾和打分兩個步驟。
過濾階段會將所有滿足 Pod 調度需求的節點選出來,在打分階段 kube-scheduler 會給每一個可調度節點進行優先級打分,最後kube-scheduler 會將 Pod 調度到得分最高的節點上,如果存在多個得分最高的節點,kube-scheduler 會從中隨機選取一個。
打分優先級中節點調度均衡(BalancedResourceAllocation)只是其中一項,還有其他打分項會導致分佈不均勻。詳細的調度說明請參見Kubernetes 調度器和調度策略。
想要讓多個Pod儘可能的均勻分佈在各個節點上,可以考慮使用工作負載反親和特性,讓Pod之間儘量“互斥”,這樣就能儘量均勻的分佈在各節點上。
示例如下:
kind: Deployment apiVersion: apps/v1 metadata: name: nginx namespace: default spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: container-0 image: nginx:alpine resources: limits: cpu: 250m memory: 512Mi requests: cpu: 250m memory: 512Mi affinity: podAntiAffinity: # 工作負載反親和 preferredDuringSchedulingIgnoredDuringExecution: # 儘量滿足如下條件 - podAffinityTerm: labelSelector: # 選擇Pod的標籤,與工作負載本身反親和 matchExpressions: - key: app operator: In values: - nginx namespaces: - default topologyKey: kubernetes.io/hostname # 在節點上起作用 imagePullSecrets: - name: default-secret