在Kubernetes中,調度策略是指如何將Pod調度到節點上的規則。親和性(Affinity)和反親和性(Anti-Affinity)是兩種常見的調度策略,它們可以幫助您控制Pod的分布,以提高應用的性能和可靠性。
親和性和反親和性策略
節點親和性(Node Affinity):控制Pod應該調度到哪些節點。
節點反親和性(Node Anti-Affinity):控制Pod不應該調度到哪些節點。
Pod親和性(Pod Affinity):控制Pod應該與哪些Pod共同調度到同一節a點。
Pod反親和性(Pod Anti-Affinity):控制Pod不應該與哪些Pod共同調度到同一節點。
通過控制臺配置負載親和/反親和調度策略
1、登錄CCE控制臺,單擊集群名稱進入集群。
2、在集群控制臺左側導航欄中選擇**“工作負載"**,切換至“無狀態”頁簽,點擊"創建Deployment"。
3、在創建deployment中,點擊顯示高級設置,選擇負載親和性調度的策略類型。
4、配置親和性調度規則,親和性調度規則又分為必須滿足(強制pod調度到某些節點上)和盡量滿足(優先pod調度到某些節點上)。
5、待一切配置完成后,單機"提交",創建完成。
6、查看親和狀態調度到相同節點。
7、刪除親和性規則,添加反親和性規則。反親和性規則也分為強制分散調度(強制pod調度在不同節點上)和優先分散調度(優先pod調度在不同節點上)。
8、查看反親和性分配在不同的節點上。
通過命令行設置
設置節點親和性
節點親和性允許您基于節點的標簽來控制Pod的調度。以下是一個示例:
apiVersion:?apps/v1
kind:?Deployment
metadata:
??name:?my-deployment
spec:
??replicas:?5
??selector:
????matchLabels:
??????app:?my-app
??template:
????metadata:
??????labels:
????????app:?my-app
????spec:
??????affinity:
????????nodeAffinity:
??????????requiredDuringSchedulingIgnoredDuringExecution:
????????????nodeSelectorTerms:
????????????-?matchExpressions:
??????????????-?key:?disktype
????????????????operator:?In
????????????????values:
????????????????-?ssd
??????containers:
??????-?name:?my-container
????????image:?my-repo/my-image:latest
在上述示例中,節點必須具有標簽disktype=ssd,Pod才會被調度到這些節點上。
設置節點反親和性
apiVersion:?apps/v1
kind:?Deployment
metadata:
??name:?my-deployment
spec:
??replicas:?5
??selector:
????matchLabels:
??????app:?my-app
??template:
????metadata:
??????labels:
????????app:?my-app
????spec:
??????affinity:
????????nodeAffinity:
??????????requiredDuringSchedulingIgnoredDuringExecution:
????????????nodeSelectorTerms:
??????????????-?matchExpressions:
??????????????????-?key:?disktype
????????????????????operator:?NotIn
????????????????????values:
??????????????????????-?ssd
??????containers:
????????-?name:?my-app-container
??????????image:?my-app-image:latest
??????????ports:
????????????-?containerPort:?8080
注意上述示例中,將確保 my-app 的 Pod 不會調度到標記為 disktype=ssd 的節點上,從而實現節點反親和性。
設置Pod親和性
Pod親和性允許您基于其他Pod的標簽來控制Pod的調度。以下是一個示例:
apiVersion:?apps/v1
kind:?Deployment
metadata:
??name:?my-deployment
spec:
??replicas:?5
??selector:
????matchLabels:
??????app:?my-app
??template:
????metadata:
??????labels:
????????app:?my-app
????spec:
??????affinity:
????????podAffinity:
??????????requiredDuringSchedulingIgnoredDuringExecution:
????????????labelSelector:
??????????????matchLabels:
????????????????app:?my-app
????????????topologyKey:?"kubernetes.io/hostname"
??????containers:
??????-?name:?my-container
????????image:?my-repo/my-image:latest
注意在上述示例中,新創建的Pod將被調度到與具有標簽app=my-app的Pod相同的節點上。
設置Pod反親和性
Pod反親和性允許您基于其他Pod的標簽來避免Pod被調度到相同的節點。以下是一個示例:
apiVersion:?apps/v1
kind:?Deployment
metadata:
??name:?my-deployment
spec:
??replicas:?5
??selector:
????matchLabels:
??????app:?my-app
??template:
????metadata:
??????labels:
????????app:?my-app
????spec:
??????affinity:
????????podAntiAffinity:
??????????requiredDuringSchedulingIgnoredDuringExecution:
????????????labelSelector:
??????????????matchLabels:
????????????????app:?my-app
????????????topologyKey:?"kubernetes.io/hostname"
??????containers:
??????-?name:?my-container
????????image:?my-repo/my-image:latest
注意在上述示例中,新創建的Pod將避免與具有標簽app=my-app的Pod調度到相同的節點上。
應用配置并驗證
應用配置
使用以下命令應用配置文件:
kubectl?apply?-f?my-deployment.yaml
驗證Pod分布
使用以下命令查看Pod的分布情況:
kubectl?get?pods?-o?wide
確認Pod被調度到了期望的節點上。
常見問題和解決方法
Pod未按預期調度
確保節點和Pod的標簽正確無誤。
檢查調度器事件日志,找出調度失敗的原因。
調度失敗
確保集群中有符合條件的節點。
調整親和性和反親和性的規則,確保其合理且不沖突。