決定工作負載的Pod和哪些工作負載的Pod部署在同一個拓撲域。
步驟 1 登錄CCE控制臺,在左側導航欄中選擇“工作負載 > 無狀態負載 Deployment”或“工作負載 > 有狀態負載 StatefulSet”。
步驟 2 在無狀態工作負載或有狀態工作負載列表中,單擊工作負載名稱進入詳情頁,在“調度策略”頁簽下,單擊 “自定義調度策略”。
步驟 3 在工作負載親和性設置中,依據工作負載的Pod標簽,同時配置命名空間和拓撲域進行業務需求的設置。
說明:工作負載親和性調度支持必須滿足和盡量滿足(硬約束Required/軟約束Preferred),以及可以設置相應的匹配關系(In, NotIn, Exists, DoesNotExist):
- 必須滿足:即硬約束,設置必須要滿足的條件,對應于requiredDuringSchedulingIgnoredDuringExecution,您可以添加多條必須滿足的規則。在規則中還需要設置命名空間和拓撲域。
- 盡量滿足:即軟約束,設置盡量滿足的條件,對應于preferredDuringSchedulingIgnoredDuringExecution,您可以添加多條盡量滿足的規則,無論是滿足其中一條或者是都不滿足都會進行調度。另外可以為規則設置權重值,權重值越高會被優先調度。
- 命名空間:即namespaces,默認情況下使用和當前工作負載相同的命名空間,您可以設置其他的已有的命名空間。
- 拓撲域:即topologyKey,拓撲域通過設置工作節點的標簽,包含默認和自定義標簽,用于指定調度時作用域。
- 選擇器:對應于matchExpressions,您可以添加多條選擇器,多條選擇器之間是一種“與”的關系,即需要滿足全部選擇器才能依據此條規則進行調度。
- 標簽名:對應工作負載的標簽,您可以使用默認標簽app或者使用自定義標簽。
- 匹配關系:即操作符,可以設置四種匹配關系(In, NotIn, Exists, DoesNotExist)。In和NotIn操作符可以添加單個值或者多個value值(多值使用;進行劃分),Exists和DoesNotExist判斷某個label是否存在,不需設置value值。
本節以nginx為例,創建工作負載節點的親和性。
前提條件
已有使用nginx容器的工作負載和節點。
操作步驟
使用默認的命名空間default,拓撲域使用內置的節點標簽kubernetes.io/hostname用于表示以節點為區分范圍,設置標簽app和type,標簽值為redis和database。同時設置操作符為In,最后單擊“確定”提交。
設置后的工作負載親和性所得的yaml如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
imagePullSecrets:
- name: default-secret
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- redis
- key: type
operator: In
values:
- database
namespaces:
- default
topologyKey: kubernetes.io/hostname
說明:上例中只有當某個工作負載同時具有app和type兩個標簽的時候,工作負載nginx才能調度成功,會將工作負載nginx調度到此工作負載的節點上。