將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虛擬節點