延續昨天的內容,今天我們要測試的是pod親和性佈署中的SoftMode模式。
如同之前所說的,SoftMode和HardMode最大的不同是前者參考YAML檔中的邏輯判斷式選擇積分最高的節點作為服務指派節點;而Pod Affinity代表依照節點上的Pod環境作為依據。
開始之前一樣放上我的節點狀態,方便辨認那些節點是透過KubeEdge規則加進來的那些是透過Kubernetes加入叢集的:
底下是我們用到的YAML檔,接著對參數部分作對照:
# soft-podaffinity.yaml
apiVersion: v1
kind: Pod
metadata:
name: soft-podaffinity
labels:
app: soft-podaff
spec:
affinity:
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- target
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx:stable
ports:
- containerPort: 80
格式和前幾天提到的Node Affinity SoftMode類似,可以參考我前幾天發過的文章
接著在佈署之前,我們先營造Pod環境。這裡我們將busybox透過nodeSelector的方式讓他運行到edge節點上。
# busybox-podaffinity.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
labels:
app: target
spec:
containers:
- image: busybox:latest
name: busybox
command:
- "sleep"
- "3600"
nodeSelector:
name: edge
在這裡的YAML檔可以看到labels欄位中的app: target,就是Pod身上附帶的標籤(label)。
kubectl apply -f busybox-podaffinity.yaml
# 檢查佈署狀態
kubectl get pods -o wide
接著佈署soft-podaffinity.yaml
kubectl apply -f soft-podaffinity.yaml
# 查看佈署狀態
kubectl get pods -o wide
可以發現NGINX和busybox被佈署在相同節點上(edge)。
同樣我們也可以在Kubernetes節點上試一次。
先把剛剛佈署的服務砍掉:
kubectl delete -f busybox-podaffinity.yaml
kubectl delete -f soft-podaffinity.yaml
稍微修改一下busybox-podaffinity.yaml,改成將busybox佈署到k8s-node02節點上:
# busybox-podaffinity.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
labels:
app: target
spec:
containers:
- image: busybox:latest
name: busybox
command:
- "sleep"
- "3600"
nodeSelector:
name: k8s-node02
#再次佈署服務
kubectl apply -f busybox-podaffinity.yaml
# 確定服務佈署狀態
kubectl get pods -o wide
kubectl apply -f soft-podaffinity.yaml
kubectl get pods -o wide
可以看到兩個服務同樣都被佈署到k8s-node02上。
接著測試如果叢集中不存在app=target這個標籤的Pod:
# 將服務清掉
kubectl delete -f soft-podaffinity.yaml
kubectl delete -f busybox-podaffinity.yaml
# 直接佈署soft-podaffinity.yaml
kubectl apply -f soft-podaffinity.yaml
kubectl get pods -o wide
由於k8s-node02節點資源較多,因此選擇將服務運行在該節點上。