K8S基本操作-08-Scheduling
Kube-scheduler
kube-scheduler 負責監視新創建的或尚未調度(unscheduled)的 Pod,並選擇一個最佳節點來運行這些 Pod。由於 Pod 中的容器和 Pod 本身可能有不同的要求,調度程序會過濾掉任何不滿足 Pod 特定調度需求的節點。
kube-scheduler 的設計上允許你自己編寫一個調度組件並替換原有的 kube-scheduler。
以下是 kube-scheduler 的部分功能:
- 根據 Pod 的資源需求、節點的狀態和調度策略,選擇合適的節點來調度 Pod。
- 支持多種調度策略,包括預設調度策略、最小資源調度策略、優先調度策略和污點調度策略。
- 支持 Pod 的親和性和反親和性規範。
手動 scheduling
情境題: 手動scheduling
重點:沒有 scheduler 時,需要手動在 YAML 裡頭設置要把 POD 哪個 Node 。
建立一個 nginx
kubectl create -f nginx.yaml
nginx.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
name: nginx
檢查狀態
controlplane ~ ✖ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 0/1 Pending 0 69s
發現是 pending ,進一步檢查 kube-system 本身。
controlplane ~ ➜ kubectl get pods --namespace kube-system
NAME READY STATUS RESTARTS AGE
coredns-5d78c9869d-mdvgw 1/1 Running 0 38m
coredns-5d78c9869d-sft2h 1/1 Running 0 38m
etcd-controlplane 1/1 Running 0 38m
kube-apiserver-controlplane 1/1 Running 0 38m
kube-controller-manager-controlplane 1/1 Running 0 38m
kube-proxy-57ftt 1/1 Running 0 38m
kube-proxy-94x5r
結果發現不存在 scheduler。
手動進行 scheduling。
先刪除掉失效的 pod。
kubectl delete pod nginx
檢查可用的 node
kubectl get nodes
發現 node01。
controlplane ~ ➜ kubectl get nodes
NAME STATUS ROLES AGE VERSION
controlplane Ready control-plane 45m v1.27.0
node01 Ready <none> 45m v1.27.0
手動將 YAML 檔案中加入指定 node01 。
nginx.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
nodeName: node01
containers:
- image: nginx
name: nginx
建立 pod 。
kubectl create -f nginx.yaml
這樣就能建立成功了。
檢查一下是否正確放到特定 pod ,用 -o wide
可以顯示所在 pod 。
kubectl get pods -o wide
結果如下:
controlplane ~ ✖ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 21s 10.244.1.2 node01 <none> <none>