全部产品
Search
文档中心

Container Service for Kubernetes:Jadwalkan beban kerja ARM atau multi-arsitektur ke node virtual berbasis ARM

更新时间:Jul 06, 2025

Secara default, atau kluster ACK Serverless menjadwalkan semua beban kerja ke node virtual dengan arsitektur x86. Jika kluster Anda mencakup node virtual berbasis ARM dan node lainnya seperti node virtual berbasis x86, Anda dapat mengonfigurasi penjadwalan Kubernetes untuk menjadwalkan beban kerja ARM hanya ke node virtual berbasis ARM atau memprioritaskan penjadwalan beban kerja multi-arsitektur ke node tersebut.

Prasyarat

  • Kluster:

    Kluster ACK Serverless yang menjalankan Kubernetes versi 1.20 atau lebih baru telah dibuat. Untuk informasi lebih lanjut, lihat Buat Kluster ACK Serverless dan Tingkatkan Manual Kluster ACK.

    Catatan

    Instance Elastic Compute Service (ECS) berbasis ARM hanya tersedia di beberapa wilayah dan zona. Pastikan kluster Anda dibuat di salah satu wilayah tersebut. Untuk informasi lebih lanjut tentang wilayah dan zona tempat instance ECS berbasis ARM tersedia, lihat Tipe Instance yang Tersedia untuk Setiap Wilayah.

  • Komponen: Komponen ack-virtual-node terinstal dengan versi 2.9.0 atau lebih baru. Untuk informasi lebih lanjut, lihat ack-virtual-node.

Catatan Penggunaan

Jika kluster Anda menjalankan versi Kubernetes sebelum 1.24, saat mendefinisikan nodeSelector atau nodeAffinity untuk menjadwalkan beban kerja ke node virtual berbasis ARM, Anda juga harus menambahkan tolerations untuk mentoleransi kubernetes.io/arch=arm64:NoSchedule. Jika kluster Anda menjalankan Kubernetes 1.24 atau lebih baru, penjadwal secara otomatis mengenali kubernetes.io/arch=arm64:NoSchedule dari node virtual berbasis ARM, sehingga Anda tidak perlu menambahkan tolerations.

Penagihan

Untuk informasi lebih lanjut tentang tipe instance ECS yang menggunakan arsitektur ARM dan harga dari tipe-tipe ini, lihat topik-topik berikut:

Langkah 1: Tambahkan node virtual berbasis ARM

Sebelum menerapkan beban kerja ARM di kluster Anda, Anda harus membuat node virtual berbasis ARM. Anda dapat mengonfigurasi eci-profile untuk membuat node virtual berbasis ARM. Gunakan salah satu metode berikut untuk memodifikasi ConfigMap eci-profile. Untuk informasi lebih lanjut, lihat Konfigurasikan eci-profile.

Gunakan konsol ACK

  1. Masuk ke konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Di halaman Clusters, klik nama kluster yang ingin Anda ubah. Di panel navigasi kiri, pilih Configurations > ConfigMaps.

  3. Pilih kube-system dari daftar drop-down Namespace. Temukan eci-profile dan klik Edit di kolom Aksi. Atur parameter enableLinuxArm64Node menjadi true. Klik OK.

    image.png

    Catatan

    Jika semua vSwitch kluster berada di zona yang tidak mendukung instance berbasis ARM, buat vSwitch di zona yang mendukung instance berbasis ARM. Kemudian, tentukan ID vSwitch untuk parameter vSwitchIds. Untuk informasi lebih lanjut tentang cara membuat vSwitch di zona, lihat Buat dan Kelola vSwitches.

Jalankan perintah kubectl edit

Prasyarat

File kubeconfig kluster diperoleh dan kubectl digunakan untuk terhubung ke kluster. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig Kluster dan Gunakan kubectl untuk Terhubung ke Kluster.

Prosedur

Jalankan perintah berikut untuk memodifikasi ConfigMap eci-profile:

kubectl edit configmap eci-profile -n kube-system
  1. Atur parameter enableLinuxArm64Node menjadi true. Jika parameter tersebut tidak ada, tambahkan parameter dan atur nilainya menjadi true.

  2. Tentukan parameter vSwitchIds. Pastikan setidaknya satu vSwitch yang ditentukan dalam parameter vSwitchIds berada di zona yang mendukung instance berbasis ARM.

    Catatan

    Jika semua vSwitch kluster berada di zona yang tidak mendukung instance berbasis ARM, buat vSwitch di zona yang mendukung instance berbasis ARM. Kemudian, tentukan ID vSwitch untuk parameter vSwitchIds. Untuk informasi lebih lanjut tentang cara membuat vSwitch di zona, lihat Buat dan Kelola vSwitches.

Langkah 2: Jadwalkan beban kerja ke node virtual berbasis ARM

Jadwalkan beban kerja ARM ke node virtual berbasis ARM

Jika kluster Anda mencakup node virtual berbasis ARM dan node lainnya tetapi semua beban kerja menggunakan arsitektur ARM, Anda perlu menjadwalkan beban kerja hanya ke node virtual berbasis ARM. Jika pod dijadwalkan ke node lain, pod tidak dapat dimulai. Secara default, semua node virtual berbasis ARM memiliki label kubernetes.io/arch=arm64. Anda dapat mengonfigurasi nodeSelector atau nodeAffinity untuk menjadwalkan beban kerja ke node virtual berbasis ARM.

nodeSelector

Tambahkan batasan berikut ke pod untuk memaksa nodeSelector menjadwalkan pod ke node virtual berbasis ARM. Dalam hal ini, nodeSelector hanya menjadwalkan pod ke node dengan label arm64. Semua node virtual berbasis ARM di kluster ACK Serverless memiliki label ini.

nodeSelector:
  kubernetes.io/arch: arm64 # Tentukan label yang digunakan untuk memilih node berbasis ARM.

Kode sampel berikut menunjukkan contoh cara menjadwalkan pod yang dibuat oleh Deployment ke node virtual berbasis ARM.

Perluas untuk Melihat Template YAML

Catatan

Template YAML berikut menambahkan toleration untuk kubernetes.io/arch=arm64:NoSchedule. Jika kluster Anda menjalankan Kubernetes 1.24 atau lebih baru, penjadwal dapat secara otomatis mengenali taint ini. Anda tidak perlu menambahkan toleration secara manual.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: only-arm
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        kubernetes.io/arch: arm64 # Tentukan label yang digunakan untuk memilih node berbasis ARM.
      tolerations:
      # Tolerate the taint of the virtual node.
        - key: virtual-kubelet.io/provider
          operator: Exists
          effect: NoSchedule
      # Tolerate the taint of the ARM-based virtual node.
        - key: kubernetes.io/arch
          operator: Equal
          value: arm64
          effect: NoSchedule
      containers:
      - name: nginx
        image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0

nodeAffinity

Prasyarat

Kluster telah mengaktifkan penjadwalan node virtual, dan versi Kubernetes serta komponen kluster memenuhi persyaratan.

Prosedur

Tambahkan batasan berikut ke pod untuk menjadwalkan pod ke node berbasis ARM berdasarkan afinitas node. Setelah batasan ini ditambahkan, pod hanya dapat dijadwalkan ke node yang memiliki label kubernetes.io/arm=arm64.

Ketika podSpec berisi batasan ini, penjadwal secara otomatis mentoleransi kubernetes.io/arch=arm64:NoSchedule.

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/arch
          operator: In
          values:
          - arm64

Kode sampel berikut menunjukkan contoh cara menjadwalkan pod yang dibuat oleh Deployment ke node virtual berbasis ARM.

Perluas untuk Melihat Template YAML

Catatan

Template YAML berikut menambahkan toleration untuk kubernetes.io/arch=arm64:NoSchedule. Jika kluster Anda menjalankan Kubernetes 1.24 atau lebih baru, penjadwal dapat secara otomatis mengenali taint ini. Anda tidak perlu menambahkan toleration secara manual.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: only-arm
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64
      tolerations:
       # Tolerate the taint of the virtual node.
        - key: virtual-kubelet.io/provider
          operator: Exists
          effect: NoSchedule
       # Tolerate the taint of the ARM-based virtual node.
        - key: kubernetes.io/arch
          operator: Equal
          value: arm64
          effect: NoSchedule 
      containers:
      - name: nginx
        image: nginx

Jadwalkan beban kerja multi-arsitektur ke node virtual berbasis ARM

Prasyarat

Kluster telah mengaktifkan penjadwalan node virtual, dan versi Kubernetes serta komponen kluster memenuhi persyaratan.

Prosedur

Secara default, beban kerja di kluster ACK Serverless dijadwalkan ke node virtual berbasis x86. Pod tetap dalam status Pending ketika node virtual berbasis x86 tidak mencukupi. Jika Anda menggunakan gambar multi-arsitektur, seperti gambar yang mendukung arsitektur x86 dan ARM, Anda perlu menjadwalkan pod ke node lintas arsitektur x86 dan ARM.

Sebagai contoh, Anda dapat mengonfigurasi afinitas node untuk lebih memilih menjadwalkan beban kerja ke node virtual berbasis ARM atau node virtual berbasis x86. Jika node virtual yang diminta tidak mencukupi, penjadwal mencoba menjadwalkan beban kerja ke jenis node virtual lainnya.

      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64

Lebih memilih menjadwalkan ke node virtual berbasis ARM

Kode sampel berikut menunjukkan contoh cara lebih memilih menjadwalkan beban kerja ke node virtual berbasis ARM.

Perluas untuk Melihat Template YAML

Catatan

Template YAML berikut menambahkan toleration untuk kubernetes.io/arch=arm64:NoSchedule. Jika kluster Anda menjalankan Kubernetes 1.24 atau lebih baru, penjadwal dapat secara otomatis mengenali taint ini. Anda tidak perlu menambahkan toleration secara manual.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: arm-prefer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations:
      # Tolerate the taint of the virtual node.
      - key: virtual-kubelet.io/provider
        operator: Exists
        effect: NoSchedule
      # Tolerate the taint of the ARM-based virtual node. 
      - key: kubernetes.io/arch
        operator: Equal
        value: arm64
        effect: NoSchedule
      # Preferably schedule the workload to an ARM-based node. 
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64
      containers:
      - name: my-container
        image: nginx

Lebih memilih menjadwalkan ke node virtual berbasis x86

Kode sampel berikut menunjukkan contoh cara lebih memilih menjadwalkan beban kerja ke node virtual berbasis x86.

Perluas untuk Melihat Template YAML

Catatan

Template YAML berikut menambahkan toleration untuk kubernetes.io/arch=arm64:NoSchedule. Jika kluster Anda menjalankan Kubernetes 1.24 atau lebih baru, penjadwal dapat secara otomatis mengenali taint ini. Anda tidak perlu menambahkan toleration secara manual.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: amd-prefer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations:
      # Tolerate the taint of the virtual node.
      - key: virtual-kubelet.io/provider
        operator: Exists
        effect: NoSchedule
      # Tolerate the taint of ARM-based virtual nodes. 
      - key: kubernetes.io/arch
        operator: Equal
        value: arm64
        effect: NoSchedule
      # Preferably schedule the workload to a x86-based virtual node. 
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - amd64
      containers:
      - name: my-container
        image: nginx

FAQ

Mengapa pod dijadwalkan ke instance ECS berbasis x86 setelah saya mengonfigurasi nodeAffinity untuk lebih memilih menjadwalkan pod ke node berbasis ARM?

Secara default, penjadwal kluster lebih memilih menjadwalkan beban kerja ke instance ECS. Jika sumber daya instance ECS tidak mencukupi, penjadwal kluster akan menjadwalkan beban kerja ke node virtual. Jika Anda tidak mengubah bobot plugin penilaian penjadwal, pod mungkin dijadwalkan ke instance ECS berbasis x86 meskipun kluster memiliki sumber daya yang cukup dan nodeAffinity dikonfigurasi untuk lebih memilih menjadwalkan pod ke node berbasis ARM. Oleh karena itu, gunakan konfigurasi nodeAffinity dalam topik ini untuk menentukan prioritas menjadwalkan beban kerja ke node virtual berbasis ARM atau x86. Prioritas menjadwalkan beban kerja ke node virtual atau instance ECS tidak dapat dijamin.

Apakah saya dapat menggunakan instance preemptible berbasis ARM?

Ya, instance preemptible berbasis ARM tersedia. Untuk informasi lebih lanjut, lihat Gunakan Instance Preemptible.

Bagaimana cara mengonfigurasi jaringan yang mendukung node virtual berbasis ARM setelah saya membuat kluster?

Setelah membuat kluster ACK Serverless di zona yang mendukung instance berbasis ARM, Anda dapat memodifikasi parameter vSwitchIds di ConfigMap eci-profile untuk memilih vSwitch yang berada di zona tersebut. Ini memastikan bahwa node virtual yang Anda buat mendukung arsitektur ARM.

Apa batasan penggunaan node berbasis ARM di kluster ACK Serverless?

Komponen yang ditampilkan di halaman Marketplace konsol ACK tidak mendukung arsitektur ARM. Hanya komponen berikut yang mendukung arsitektur ARM:

  • Komponen Utama

  • Komponen Logging dan Pemantauan

  • Komponen Volume

  • Komponen Jaringan

Referensi