全部產品
Search
文件中心

Container Service for Kubernetes:指定ECS和ECI的資源分派

更新時間:Jun 19, 2024

在ACK叢集中部署服務時,您可以使用容忍度和節點親和性來聲明只使用ECS或ECI彈性資源,或者是在ECS資源不足時自動申請ECI資源。通過配置調度策略,您可以在不同工作負載情境下實現對彈性資源的不同需求。

相關概念

  • 汙點:ACK叢集中的Virtual Node預設都會打上汙點virtual-kubelet.io/provider=alibabacloud:NoSchedule,以避免您在不知情的情況下使用ECI彈性資源。

  • 容忍度:容忍度(Toleration)應用於Pod上。容忍度允許調度器將該Pod調度到帶有對應汙點的Node。在ACK叢集中,需要配置以下Toleration來容忍汙點virtual-kubelet.io/provider=alibabacloud:NoSchedule,才能讓Pod使用ECI資源。

          tolerations:
          - key: virtual-kubelet.io/provider
            operator: Equal
            value: alibabacloud
            effect: NoSchedule
  • 節點親和性:節點親和性(nodeAffinity)規定了Pod調度時的軟需求或者偏好,且在這種偏好不被滿足時成功調度該Pod到其他節點。

前提條件

操作步驟

下文將介紹如何通過汙點、容忍度、節點親和性完成以下調度策略:

  • 只使用ECI:只使用ECI彈性資源,不使用叢集的ECS資源。

  • 優先使用ECS:當前叢集ECS資源不足時,使用ECI彈性資源。

  • 只使用ECS:只使用叢集現有的ECS資源。

只使用ECI

展開查看YAML檔案

apiVersion: apps/v1
kind: Deployment
metadata:
  name: eci-only
spec:
  replicas: 3
  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: nginx
            

優先使用ECS

展開查看YAML檔案

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ecs-prefer
spec:
  replicas: 3
  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: nginx

當您希望將負載優先部署在帶有標籤label_1=key_1的ECS節點池上,且該節點池資源不足時使用virtual-node進行Auto Scaling時,可以通過以下方式部署。

展開查看YAML檔案

apiVersion: apps/v1
kind: Deployment
metadata:
  name: some-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:
# 指定Pod必須調度到帶有label_1:key_1或type:virtual-kubelet標籤的節點上。
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: label_1
                operator: In
                values:
                - key_1
            - matchExpressions:
              - key: type
                operator: In
                values:
                - virtual-kubelet
# 指定Pod優先調度到帶有label_1:key_1標籤的節點上。
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            preference:
              matchExpressions:
              - key: label_1
                operator: In
                values:
                - key_1
          - weight: 1
            preference:
              matchExpressions:
              - key: type
                operator: In
                values:
                - virtual-kubelet
      containers:
      - name: my-container
        image: nginx
說明
  • 如果您在與nodeAffinity類型關聯的nodeSelectorTerms中指定多個條件,只要其中一個nodeSelectorTerms滿足(各個條件按邏輯或操作組合)時,Pod就可以被調度到節點上。

  • 如果您在與nodeSelectorTerms中的條件相關聯的單個matchExpressions欄位中指定多個運算式,則只有當所有運算式都滿足(各運算式按邏輯與操作組合)時,Pod才能被調度到節點上。

  • 使用preferredDuringSchedulingIgnoredDuringExecution實現優先ECS調度時,不能保證僅在ECS資源不足時才調度到ECI上。也會存在ECS資源充足的情況下,Pod也會被調度到ECI上的情境。

只使用ECS

為了避免您使用價格較為昂貴的ECI執行個體,Virtual Node預設有汙點(Taints)。

      virtual-kubelet.io/provider=alibabacloud:NoSchedule

因此,只要您未配置對於該汙點的容忍度,Pod將只調度到ECS上。

展開查看YAML檔案

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ecs-only
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx