將Pod調度到虛擬節點以ECI運行時,ACK集群和ACK Serverless集群均默認將Pod調度到x86架構的虛擬節點上。如果您的應用采用Arm架構,需要您額外添加nodeSelector來指定Arm架構的虛擬節點。本文介紹如何將Pod調度到Arm架構的虛擬節點。
前提條件
請確認集群滿足以下要求:
集群所屬地域支持Arm實例。
目前ECI支持的Arm架構規格族為g8y、c8y和r8y,支持的地域請參見ECS實例規格可購買地域總覽。
集群版本為1.20及以上。
集群中的ACK Virtual Node組件版本支持Arm節點。
集群中的kube-scheduler組件版本支持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架構的虛擬節點。
修改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****
查看生成的節點。
配置enableLinuxArm64Node為true后,通過
kubectl get node
命令查看節點信息時,您可以看到集群已自動生成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"]
相關文檔
ACK集群:調度至Arm節點
ACK Serverless集群:調度至Arm虛擬節點