Saat menjadwalkan Pod untuk dijalankan pada node virtual sebagai Elastic Container Instance (ECI), baik kluster ACK maupun kluster ACK Serverless secara default akan menjadwalkan Pod tersebut ke node virtual berbasis x86. Jika aplikasi Anda menggunakan arsitektur ARM, Anda harus menambahkan nodeSelector untuk menentukan node virtual berbasis ARM.
Prasyarat
Kluster memenuhi persyaratan berikut:
-
Wilayah tempat kluster dideploy mendukung instans berbasis ARM.
ECI mendukung keluarga tipe instans ECS g8y, c8y, dan r8y pada arsitektur ARM. Untuk informasi selengkapnya mengenai wilayah yang didukung, lihat Tipe instans ECS yang tersedia untuk setiap wilayah.
Kluster menjalankan Kubernetes versi 1.20 atau lebih baru.
-
Versi komponen ACK Virtual Node dalam kluster mendukung node berbasis ARM.
-
Versi komponen kube-scheduler dalam kluster mendukung node berbasis ARM.
Peringatan
Anda akan ditagih berdasarkan tipe instans ECS berbasis ARM yang sebenarnya disediakan, bukan berdasarkan sumber daya vCPU dan memori yang Anda tentukan.
Setelah membuat Pod ECI, jalankan perintah kubectl describe pod <pod name> dan periksa anotasi k8s.aliyun.com/eci-instance-spec untuk memastikan tipe instans ECS yang sebenarnya digunakan.
Tambahkan node virtual berbasis ARM
Ikuti langkah-langkah berikut untuk memodifikasi eci-profile dan menambahkan node virtual berbasis ARM ke kluster Anda.
-
Modifikasi eci-profile.
kubectl edit configmap eci-profile -n kube-systemPada bagian
datadari eci-profile, aturenableLinuxArm64Nodemenjaditrue. Pastikan setidaknya salah satu zona yang dikonfigurasi mendukung tipe instans berbasis ARM.data: enableClusterIp: "true" enableHybridMode: "false" enableLinuxArm64Node: "true" # Aktifkan node berbasis 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**** # Zona yang dikonfigurasi harus mencakup zona yang mendukung tipe instans berbasis ARM. vpcId: vpc-2zeghwzptn5zii0w7**** -
Lihat node virtual berbasis ARM yang dihasilkan dalam kluster.
Setelah Anda mengatur
enableLinuxArm64Nodemenjaditrue, jalankan perintahkubectl get nodeuntuk melihat informasi node. Node virtual berbasis ARM akan secara otomatis ditambahkan ke kluster.kubectl get node NAME STATUS ROLES AGE VERSION virtual-kubelet-cn-beijing-h Ready agent 169m v1.24.6-aliyun.1 virtual-kubelet-cn-beijing-i Ready agent 169m v1.24.6-aliyun.1 virtual-kubelet-cn-beijing-i-linux-arm64 Ready agent 75s v1.24.6-aliyun.1 virtual-kubelet-cn-beijing-k Ready agent 169m v1.24.6-aliyun.1
Jadwalkan pod ke node virtual berbasis ARM
Konfigurasikan bidang nodeSelector
Node virtual berbasis ARM dalam kluster ACK dan kluster ACK Serverless memiliki label kubernetes.io/arch: arm64. Anda dapat menggunakan label ini dalam nodeSelector untuk menjadwalkan Pod ECI ke node virtual berbasis ARM.
nodeSelector:
kubernetes.io/arch: arm64
Contoh file YAML pod:
-
Tidak ada spesifikasi yang ditentukan untuk pod.
Jika Anda tidak menentukan tipe instans ECS, sistem akan menggunakan ecs.c8y.large secara default, yaitu tipe instans berbasis ARM dengan 2 vCPU dan memori 4 GiB.
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" # Jadwalkan Pod ke node virtual. spec: containers: - name: nginx image: arm64v8/centos:7.9.2009 # Gunakan image berbasis arsitektur ARM. command: ["sleep"] args: ["999999"] nodeSelector: kubernetes.io/arch: arm64 # Tentukan node berbasis ARM. -
Spesifikasi vCPU dan memori ditentukan.
Jika Anda menentukan sumber daya vCPU dan memori, sistem akan secara otomatis memilih tipe instans ECS berbasis ARM yang sesuai dari tipe instans yang didukung oleh ECI.
CatatanAnda dapat menentukan vCPU dan memori dengan mendefinisikan bidang
limitsataurequestsuntuk kontainer (disarankan menggunakanlimits), atau dengan menambahkan anotasik8s.aliyun.com/eci-use-specs.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" # Jadwalkan Pod ke node virtual. spec: containers: - name: nginx image: arm64v8/centos:7.9.2009 # Gunakan image berbasis arsitektur ARM. command: ["sleep"] args: ["999999"] resources: limits: cpu: "1000m" # Tentukan 1 vCPU. memory: "4096Mi" # Tentukan memori 4 GiB untuk kontainer nginx. nodeSelector: kubernetes.io/arch: arm64 # Tentukan node berbasis ARM. -
Tentukan tipe instans ECS berbasis ARM
Jika Anda memiliki kebutuhan khusus terkait spesifikasi, Anda dapat menggunakan anotasi
k8s.aliyun.com/eci-use-specsuntuk menentukan spesifikasi ARM tertentu. Untuk informasi mengenai spesifikasi ARM yang didukung oleh ECI, lihat Tentukan spesifikasi ARM untuk membuat 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" # Tentukan tipe instans ECS berbasis ARM yang didukung. Anda dapat menentukan hingga lima tipe. spec: containers: - name: nginx image: arm64v8/centos:7.9.2009 # Gunakan image berbasis arsitektur ARM. command: ["sleep"] args: ["999999"] nodeSelector: kubernetes.io/arch: arm64 # Jadwalkan Pod ke node berbasis ARM.
Konfigurasikan toleransi dan afinitas node untuk menjadwalkan image multi-arsitektur
Jika Anda menggunakan image multi-arsitektur dan perlu menjadwalkan Pod di kedua arsitektur x86 dan ARM, Anda dapat menggunakan toleransi dan nodeAffinity untuk menetapkan preferensi penjadwalan ke node virtual berbasis ARM atau x86.
Sebelum menggunakan nodeAffinity untuk mengonfigurasi afinitas node berdasarkan file YAML berikut, pastikan fitur penjadwalan pod berbasis node virtual telah diaktifkan untuk kluster. Untuk informasi selengkapnya, lihat Aktifkan kebijakan penjadwalan pod berbasis node virtual untuk kluster ACK.
Contoh file YAML pod:
-
Lebih memilih node berbasis 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" # Jadwalkan Pod ke node virtual. spec: tolerations: # Toleransi terhadap taint pada node berbasis ARM. - 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 # Lebih memilih node berbasis ARM. containers: - name: nginx image: nginx # Gunakan image multi-arsitektur. command: ["sleep"] args: ["999999"] -
Lebih memprioritaskan penjadwalan pod ke node virtual berbasis 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" # Jadwalkan Pod ke node virtual. spec: tolerations: # Toleransi terhadap taint pada node berbasis ARM. - 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 # Lebih memilih node berbasis x86. containers: - name: nginx image: nginx # Gunakan image multi-arsitektur. command: ["sleep"] args: ["999999"]
Referensi
Kluster ACK: Jadwalkan beban kerja ke node berbasis ARM
Kluster ACK Serverless: Jadwalkan beban kerja ke node virtual berbasis ARM