為什麼 kube-scheduler-simulator 可以創建一個 fake Cluster?背後用的是 Kwok 這個專案,Kwok 這個專案可以讓我們用很少的資源模擬出大集群的行為。\
Kwok 會用 kwok-controller 模擬出 Pod 以及 Node,其方式就是打 kubernetes api-server,之所以可以這樣測試也得益於微服務的架構便於測試。\
Kwok 甚至可以在 CI/CD 中測試,但筆者對這塊的應用情境還不熟悉,所以就不深入介紹了。
接下來我們會利用 kwokctl 來測試我們前文提到的排程情境
利用 kwokctl 擴展到 21 個 Node
把前 11 個 node 打上標籤 ZoneA,後 10 個打上標籤 ZoneB
部屬 affinity deployment
檢查結果,Pod 都排程到 ZoneA 上面
刪除 ZoneA 所有Node
檢查結果,Pod 都排程到 ZoneB 上面
docker exec -it simulator-cluster sh
kwokctl scale node --replicas 21
這時候回到 UI 應該要看得到這些擴展出來的機器
for i in $(seq -w 0 10); do
kwokctl kubectl label node node-0000$i topology.kubernetes.io/zone=A-zone
done
for i in $(seq -w 11 20); do
kwokctl kubectl label node node-0000$i topology.kubernetes.io/zone=B-zone
done
kwokctl kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
replicas: 30
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- A-zone # Prefer scheduling in A-zone
- weight: 10
preference:
matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- B-zone # If no nodes in A-zone, schedule in B-zone
containers:
- name: backend-container
image: nginx:latest # Replace with your desired image
ports:
- containerPort: 80
EOF
kwokctl kubectl delete node -l topology.kubernetes.io/zone=A-zone
—--
說起來有趣,一開始 kube-scheduler-simulator 並沒有用 Kwok,之後才轉用的,如果沒有 Kwok,kube-scheduler-simulator 會自幹出什麼東西呢?