在ACK叢集中部署服務時,您可以使用容忍度和節點親和性來聲明只使用ECS或ECI資源,或者在ECS資源不足時自動申請ECI資源。通過配置調度策略,您可以在不同工作負載情境下實現對彈性資源的不同需求。
相關概念
汙點(Taints):節點上設定的規則,用於排斥某些Pod被調度到該節點上。
容忍度(Tolerations):應用於Pod,允許該Pod調度時忽略節點上的汙點。
節點親和性(Node affinity):Pod的屬性,用於將Pod調度到特定標籤的節點。包括以下兩類:
requiredDuringSchedulingIgnoredDuringExecution:硬性要求,調度時必須滿足的規則。調度器只有在規則被滿足的時候才能執行調度。preferredDuringSchedulingIgnoredDuringExecution:優先偏好,調度時優先考慮的規則。調度器會嘗試尋找滿足對應規則的節點。如果找不到匹配的節點,調度器仍然會調度該Pod。
更多資訊,請參見Taints and Tolerations和Node affinity。
前提條件
叢集類型為ACK託管叢集Pro版,且版本為v1.22版本及以上。
叢集中已部署ack-virtual-node組件,且版本為v2.10.0及以上。關於如何安裝和升級ack-virtual-node組件,請參見虛擬節點。
叢集中的kube-scheduler組件的版本為5.9及以上,並且已開啟虛擬節點調度策略。
在組件管理頁面找到Kube Scheduler,單擊配置,然後確認已選中開啟虛擬節點調度。
配置樣本
在ACK叢集中部署的虛擬節點預設帶有汙點:virtual-kubelet.io/provider=alibabacloud:NoSchedule,以避免在您不知情的情況下使用ECI資源。因此,您需要配置對該汙點的容忍度,才能將Pod調度到虛擬節點,使用ECI資源。
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule結合使用容忍度和節點親和性,可以實現優先順序與強制性的混合調度策略,滿足不同業務對於資源的不同需求。
優先使用ECS:優先使用ECS資源,當叢集內ECS資源不足時,使用ECI資源。
只使用ECI:只使用ECI資源,不使用叢集的ECS資源。
只使用ECS:只使用叢集現有的ECS資源。
優先使用ECS
由於虛擬節點預設帶有汙點,您需要配置對於該汙點的容忍度,才能將Pod調度到虛擬節點。同時,配置節點親和性,通過preferredDuringSchedulingIgnoredDuringExecution可以指定Pod調度的偏好:優先調度到未帶有type: virtual-kubelet標籤的節點(即ECS節點)。
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecs-prefer
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: type
operator: NotIn
values:
- virtual-kubelet
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6配置節點親和性時,請注意以下資訊:
如果在
nodeSelectorTerms中配置多個條件(即多個matchExpressions),則只要其中一個條件滿足(各個條件按邏輯或操作組合)時,Pod就可以被調度到對應節點上。如果在單個matchExpressions中配置多個運算式,則只有當所有運算式都滿足(各運算式按邏輯與操作組合)時,Pod才能被調度到對應節點上。使用
preferredDuringSchedulingIgnoredDuringExecution實現優先ECS調度時,不能保證僅在ECS資源不足時才調度到ECI上,也會存在ECS資源充足時但Pod被調度到ECI上的情況。如果您有更高的需求,建議結合requiredDuringSchedulingIgnoredDuringExecution配置更細緻的強制規則。
如果希望將Pod優先部署在帶有指定標籤(如label_1=key_1)的ECS節點上,在該類節點資源不足時,使用虛擬節點進行Auto Scaling,您可以通過以下YAML配置。
只使用ECI
由於虛擬節點預設帶有汙點,您需要配置對於該汙點的容忍度,才能將Pod調度到虛擬節點。同時,配置節點親和性,通過requiredDuringSchedulingIgnoredDuringExecution可以指定Pod必須調度到帶有type: virtual-kubelet標籤的節點(即虛擬節點)。
apiVersion: apps/v1
kind: Deployment
metadata:
name: eci-only
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
只使用ECS
由於虛擬節點預設帶有汙點,因此只要您未配置對於該汙點的容忍度,Pod將只會調度到ECS節點。
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecs-only
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6