全部產品
Search
文件中心

Elastic Container Instance:調度Pod到Arm架構的虛擬節點

更新時間:Jul 23, 2024

將Pod調度到虛擬節點以ECI運行時,ACK叢集和ACK Serverless叢集均預設將Pod調度到x86架構的虛擬節點上。如果您的應用採用Arm架構,需要您額外添加nodeSelector來指定Arm架構的虛擬節點。本文介紹如何將Pod調度到Arm架構的虛擬節點。

前提條件

請確認叢集滿足以下要求:

注意事項

將Pod調度到Arm架構的虛擬節點上時,對應的ECI執行個體按照實際產生的Arm規格進行計費,不按vCPU和記憶體計費。

說明

ECI Pod建立成功後,您可以通過kubectl describe pod <pod name>命令查看Pod詳情,通過k8s.aliyun.com/eci-instance-spec欄位確認Pod實際使用的ECS規格。

添加Arm架構的虛擬節點

您可以通過以下步驟修改eci-profile,在叢集中添加Arm架構的虛擬節點。

  1. 修改eci-profile。

    kubectl edit configmap eci-profile -n kube-system

    在eci-profile的data中將enableLinuxArm64Node配置為true,同時確保配置的可用性區域中至少有一個可用性區域開放了Arm規格。樣本如下:

    data:
      enableClusterIp: "true"
      enableHybridMode: "false"
      enableLinuxArm64Node: "true"    #開啟Arm節點
      enableLogController: "false"
      enablePVCController: "false"
      enablePrivateZone: "false"
      enableReuseSSLKey: "false"
      featureGates: MetricsVpcNet=true,ProtectionFinalizers=false,WaitForFirstConsumer=false
      resourceGroupId: ""
      securityGroupId: sg-2zeg1fci0oq1hljo6h0a
      selectors: ""
      slsMachineGroup: ""
      vSwitchIds: vsw-2zewa5mb19wr45g63****,vsw-2zevanrscmoiaxryx****,vsw-2ze94pjtfuj9vaymf****   #配置的可用性區域中包含已開放Arm規格的可用性區域
      vpcId: vpc-2zeghwzptn5zii0w7****
  2. 查看產生的節點。

    配置enableLinuxArm64Node為true後,通過kubectl get node命令查看節點資訊時,您可以看到叢集已自動產生Arm節點。

    ARM節點

將Pod調度到Arm架構的虛擬節點

通過nodeSelector調度

在ACK叢集和ACK Serverless叢集中,Arm架構的節點均帶有kubernetes.io/arch: arm64 的標籤,建立ECI Pod時,可以通過nodeSelector來指定Arm架構的節點,將Pod調度到Arm架構的虛擬節點上運行。

nodeSelector:
  kubernetes.io/arch: arm64 

YAML樣本如下:

  • 不指定規格

    沒有指定任何規格時,系統預設採用2 vCPU和4 GiB記憶體的Arm規格,即ecs.c8y.large。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true"    # 調度到虛擬節點。
        spec:
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # 使用基於Arm架構的鏡像。
            command: ["sleep"]
            args: ["999999"]
          nodeSelector:
            kubernetes.io/arch: arm64  # 指定Arm架構的節點。
  • 指定vCPU和記憶體規格

    指定vCPU和記憶體規格時,系統會從ECI支援的ECS Arm規格中自動選擇一個符合vCPU和記憶體條件的Arm規格。

    說明

    指定vCPU和記憶體規格時,可以直接定義Containers的limits或requests來指定(建議使用limits),也可以添加k8s.aliyun.com/eci-use-specs的Annotation來指定。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true"    # 調度到虛擬節點。
        spec:
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # 使用基於Arm架構的鏡像。
            command: ["sleep"]
            args: ["999999"]
            resources:
              limits:
                cpu: "1000m"      # 指vCPU為1 vCPU。
                memory: "4096Mi"   # 指定nginx容器的記憶體為4 GiB。
          nodeSelector:
            kubernetes.io/arch: arm64  # 指定Arm架構的節點。
  • 指定ECS Arm規格

    如果您對規格有特殊需求,可以通過k8s.aliyun.com/eci-use-specs的Annotation來指定具體的Arm規格。關於ECI支援的Arm規格,請參見指定Arm規格建立Pod

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true" 
          annotations:
            k8s.aliyun.com/eci-use-specs: "ecs.c8y.large,ecs.g8y.large"   # 指定支援的ECS Arm規格,單次最多5個。
        spec:
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # 使用基於Arm架構的鏡像。
            command: ["sleep"]
            args: ["999999"]
          nodeSelector:
            kubernetes.io/arch: arm64  # 調度到Arm節點。

多架構鏡像調度

如果您的應用鏡像為多架構鏡像,需要配置跨x86和Arm架構的節點調度,您可以通過tolerations和nodeAffinity實現將Pod優先調度到Arm架構或者x86架構的虛擬節點。

重要

參考以下YAML使用nodeAffinity配置節點親和性時,請確保叢集已開啟虛擬節點調度功能。具體操作,請參見開啟叢集虛擬節點調度策略

YAML樣本如下:

  • 優先調度到Arm節點

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true"    # 調度到虛擬節點。
        spec:
          tolerations:                 # 容忍Arm架構的節點的Taint。
          - key: kubernetes.io/arch
            operator: Equal
            value: arm64
            effect: NoSchedule
          affinity:                 
            nodeAffinity:     
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 1
                preference:
                  matchExpressions:
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                    - arm64       # 優先調度到Arm架構的節點。
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # 使用多架構鏡像。
            command: ["sleep"]
            args: ["999999"]
  • 優先調度到x86節點

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true"    # 調度到虛擬節點。
        spec:
          tolerations:                 # 容忍Arm架構節點的Taint。
          - key: kubernetes.io/arch
            operator: Equal
            value: arm64
            effect: NoSchedule
          affinity:                 
            nodeAffinity:     
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 1
                preference:
                  matchExpressions:
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                    - amd64         # 優先調度到x86架構的節點。
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # 使用多架構鏡像。
            command: ["sleep"]
            args: ["999999"]

相關文檔