Menmbahkan kumpulan node Azure Spot ke kluster Azure Kubernetes Service (AKS)

Dalam artikel ini, Anda menambahkan kumpulan simpul spot sekunder ke kluster Azure Kubernetes Service (AKS) yang ada.

Kumpulan node Spot adalah kumpulan node yang ditopang oleh scale set Azure Spot Virtual Machine. Dengan Spot VM di kluster AKS, Anda dapat memanfaatkan kapasitas Azure yang tidak digunakan dengan penghematan biaya yang signifikan. Jumlah kapasitas yang tidak digunakan yang tersedia bervariasi berdasarkan banyak faktor, seperti ukuran simpul, wilayah, dan waktu hari.

Saat Anda menyebarkan kumpulan simpul Spot, Azure mengalokasikan simpul Spot jika ada kapasitas yang tersedia dan menyebarkan set skala Spot yang mendukung kumpulan simpul Spot dalam satu domain default. Tidak ada SLA untuk node Spot. Tidak ada jaminan ketersediaan tinggi. Jika Azure membutuhkan kapasitas kembali, infrastruktur Azure akan mengeluarkan simpul Spot.

Node spot sangat cocok untuk beban kerja yang dapat menangani gangguan, penghentian dini, atau penghentian paksa. Misalnya, beban kerja seperti pekerjaan pemrosesan batch, lingkungan pengembangan dan pengujian, dan beban kerja komputasi besar mungkin merupakan kandidat yang baik untuk dijadwalkan pada kumpulan simpul Spot.

Sebelum Anda mulai

  • Artikel ini mengasumsikan pemahaman dasar tentang konsep Kube dan Azure Load Balancer. Untuk informasi lebih, lihat konsep inti Kubernetes untuk Azure Kubernetes Service (AKS).
  • Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.
  • Saat Anda membuat kluster untuk menggunakan kumpulan simpul Spot, kluster harus menggunakan Virtual Machine Scale Sets untuk kumpulan simpul dan SKU load balancer Standard. Anda juga harus menambahkan kumpulan simpul lain setelah membuat kluster, yang tercakup dalam tutorial ini.
  • Artikel ini mengharuskan Anda menjalankan Azure CLI versi 2.14 atau versi terbaru. Jalankan az --version untuk menemukan versinya. Jika Anda perlu memasang atau meningkatkan, lihat Memasang Azure CLI.

Batasan

Batasan berikut berlaku saat Anda membuat dan mengelola kluster AKS dengan kumpulan node Spot:

  • Kumpulan simpul Spot tidak dapat menjadi kumpulan simpul default, hanya dapat digunakan sebagai kumpulan sekunder.
  • Anda tidak dapat meningkatkan sarana kontrol dan kumpulan simpul secara bersamaan. Anda harus memutakhirkannya secara terpisah atau menghapus pool node Spot untuk memutakhirkan bidang kontrol dan pool node yang tersisa secara bersamaan.
  • Pool node Spot harus menggunakan Virtual Machine Scale Sets.
  • Anda tidak dapat mengubah ScaleSetPriority atau SpotMaxPrice setelah pembuatan.
  • Saat mengatur SpotMaxPrice, nilainya harus -1 atau nilai positif dengan hingga lima tempat desimal.
  • Kumpulan simpul Spot memiliki kubernetes.azure.com/scalesetpriority:spot label, kubernetes.azure.com/scalesetpriority=spot:NoSchedule taint, dan pod sistem memiliki anti-afinitas.
  • Anda harus menambahkan toleransi yang sesuai serta afinitas untuk menjadwalkan beban kerja pada kumpulan node Spot.

Menambahkan kumpulan node Spot ke kluster AKS

Saat menambahkan kumpulan simpul Spot ke kluster yang sudah ada, kluster tersebut harus mengaktifkan beberapa kumpulan simpul. Saat Anda membuat kluster AKS dengan beberapa node pool diaktifkan, secara default Anda membuat node pool dengan priority sebesar Regular. Untuk menambahkan kumpulan simpul Spot, Anda harus menentukan Spot sebagai nilai untuk priority. Untuk detail selengkapnya tentang membuat kluster AKS dengan beberapa kumpulan node, lihat menggunakan beberapa kumpulan node.

export SPOT_NODEPOOL="spotnodepool"

az aks nodepool add \
    --resource-group $RESOURCE_GROUP \
    --cluster-name $AKS_CLUSTER \
    --name $SPOT_NODEPOOL \
    --priority Spot \
    --eviction-policy Delete \
    --spot-max-price -1 \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3 \
    --no-wait

Dalam perintah sebelumnya, priority dari Spot menjadikan kumpulan simpul sebagai kumpulan simpul Spot. Parameter eviction-policy diatur ke Delete, yang merupakan nilai default. Saat Anda mengatur kebijakan penggusuran ke Delete, node dalam rangkaian skala yang mendasari kumpulan node akan dihapus saat digusur.

Anda juga dapat mengatur kebijakan eviction ke Deallocate, yang berarti bahwa node dalam scale set yang mendasarinya diatur ke status dihentikan-didealokasikan saat terjadi eviction. Node dalam status stopped-deallocated tetap dihitung terhadap kuota komputasi Anda dan dapat menyebabkan masalah pada penskalaan atau pemutakhiran kluster. Nilai priority dan eviction-policy hanya dapat diatur selama pembuatan kumpulan simpul. Nilai-nilai tersebut tidak dapat diperbarui nanti.

Perintah sebelumnya juga memungkinkan autoscaler kluster, yang sebaiknya digunakan dengan kumpulan simpul Spot. Berdasarkan beban kerja yang berjalan di cluster Anda, cluster autoscaler menambah dan mengurangi jumlah node. Untuk kumpulan node Spot, penskala otomatis kluster akan meningkatkan skala jumlah node setelah pengusiran jika node lainnya masih diperlukan. Jika Anda mengubah jumlah maksimum simpul yang dapat dimiliki kumpulan simpul, Anda juga perlu menyesuaikan nilai maxCount yang terkait dengan penskala otomatis kluster. Jika Anda tidak menggunakan autoscaler klaster, saat terjadi eviction, pool Spot pada akhirnya akan berkurang menjadi 0 dan memerlukan tindakan manual untuk menambahkan node Spot tambahan.

Penting

Hanya menjadwalkan beban kerja pada kumpulan node Spot yang dapat menangani gangguan, seperti pekerjaan pemrosesan batch dan lingkungan pengujian. Sebaiknya siapkan taint dan toleransi pada kumpulan simpul Spot Anda untuk memastikan bahwa hanya beban kerja yang dapat menangani pengeluaran simpul yang dijadwalkan pada kumpulan simpul Spot. Misalnya, perintah di atas menambahkan taint kubernetes.azure.com/scalesetpriority=spot:NoSchedule, sehingga hanya pod dengan toleration yang sesuai yang dijadwalkan di node ini.

Memverifikasi kumpulan node Spot

  • Verifikasi bahwa pool node Anda telah ditambahkan menggunakan perintah az aks nodepool show dan pastikan scaleSetPriority bernilai Spot.
az aks nodepool show --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER --name $SPOT_NODEPOOL

Hasil:

{
  "artifactStreamingProfile": null,
  "availabilityZones": null,
  "capacityReservationGroupId": null,
  "count": 3,
  "creationData": null,
  "currentOrchestratorVersion": "1.30.10",
  "eTag": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "enableAutoScaling": true,
  "enableCustomCaTrust": false,
  "enableEncryptionAtHost": false,
  "enableFips": false,
  "enableNodePublicIp": false,
  "enableUltraSsd": false,
  "gatewayProfile": null,
  "gpuInstanceProfile": null,
  "gpuProfile": null,
  "hostGroupId": null,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/xxxxxxxxxxxxxxxx/providers/Microsoft.ContainerService/managedClusters/xxxxxxxxxxxxxxxx/agentPools/xxxxxxxxxxxx",
  "kubeletConfig": null,
  "kubeletDiskType": "OS",
  "linuxOsConfig": null,
  "maxCount": 3,
  "maxPods": 30,
  "messageOfTheDay": null,
  "minCount": 1,
  "mode": "User",
  "name": "xxxxxxxxxxxx",
  "networkProfile": {
    "allowedHostPorts": null,
    "applicationSecurityGroups": null,
    "nodePublicIpTags": null
  },
  "nodeImageVersion": "AKSUbuntu-2204gen2containerd-xxxxxxxx.xx.x",
  "nodeInitializationTaints": null,
  "nodeLabels": {
    "kubernetes.azure.com/scalesetpriority": "spot"
  },
  "nodePublicIpPrefixId": null,
  "nodeTaints": [
    "kubernetes.azure.com/scalesetpriority=spot:NoSchedule"
  ],
  "orchestratorVersion": "x.xx.xx",
  "osDiskSizeGb": 128,
  "osDiskType": "Managed",
  "osSku": "Ubuntu",
  "osType": "Linux",
  "podIpAllocationMode": null,
  "podSubnetId": null,
  "powerState": {
    "code": "Running"
  },
  "provisioningState": "Creating",
  "proximityPlacementGroupId": null,
  "resourceGroup": "xxxxxxxxxxxxxxxx",
  "scaleDownMode": "Delete",
  "scaleSetEvictionPolicy": "Delete",
  "scaleSetPriority": "Spot",
  "securityProfile": {
    "enableSecureBoot": false,
    "enableVtpm": false,
    "sshAccess": "LocalUser"
  },
  "spotMaxPrice": -1.0,
  "status": null,
  "tags": null,
  "type": "Microsoft.ContainerService/managedClusters/agentPools",
  "typePropertiesType": "VirtualMachineScaleSets",
  "upgradeSettings": {
    "drainTimeoutInMinutes": null,
    "maxSurge": null,
    "maxUnavailable": null,
    "nodeSoakDurationInMinutes": null,
    "undrainableNodeBehavior": null
  },
  "virtualMachineNodesStatus": null,
  "virtualMachinesProfile": null,
  "vmSize": "Standard_DS2_v2",
  "vnetSubnetId": null,
  "windowsProfile": null,
  "workloadRuntime": "OCIContainer"
}

Jadwalkan pod agar berjalan pada node Spot

Untuk menjadwalkan pod agar berjalan pada simpul Spot, Anda dapat menambahkan toleransi dan afinitas simpul yang sesuai dengan taint yang diterapkan pada simpul Spot Anda.

Contoh berikut menunjukkan sebagian dari file YAML yang mendefinisikan toleration yang sesuai dengan taint kubernetes.azure.com/scalesetpriority=spot:NoSchedule dan afinitas node yang sesuai dengan label kubernetes.azure.com/scalesetpriority=spot yang digunakan pada langkah sebelumnya dengan aturan afinitas node requiredDuringSchedulingIgnoredDuringExecution dan preferredDuringSchedulingIgnoredDuringExecution:

spec:
  containers:
  - name: spot-example
  tolerations:
  - key: "kubernetes.azure.com/scalesetpriority"
    operator: "Equal"
    value: "spot"
    effect: "NoSchedule"
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "kubernetes.azure.com/scalesetpriority"
            operator: In
            values:
            - "spot"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value

Ketika Anda menyebarkan pod dengan toleransi dan afinitas node ini, Kubernetes berhasil menjadwalkan pod pada node dengan taint dan label yang diterapkan. Dalam contoh ini, aturan berikut berlaku:

  • Simpul harus memiliki label dengan kunci kubernetes.azure.com/scalesetpriority, dan nilai label tersebut harus berupa spot.
  • Node sebaiknya memiliki label dengan kunci another-node-label-key, dan nilai label tersebut harusanother-node-label-value.

Untuk informasi selengkapnya, lihat Menetapkan pod ke node.

Meningkatkan kumpulan node Spot

Saat Anda meningkatkan kumpulan node Spot, AKS secara internal menerapkan cordon dan mengeluarkan pemberitahuan eviksi, tetapi tidak melakukan drain. Tidak ada node surge yang tersedia untuk peningkatan kumpulan node Spot. Di luar perubahan ini, perilaku saat meningkatkan kumpulan simpul Spot konsisten dengan jenis kumpulan simpul lainnya.

Untuk informasi selengkapnya tentang peningkatan, lihat Meningkatkan kluster AKS.

Harga maksimum untuk kumpulan Spot

Harga untuk instans Spot bervariasi, berdasarkan wilayah dan SKU. Untuk informasi selengkapnya, lihat informasi harga untuk Linux dan Windows.

Dengan harga variabel, Anda memiliki opsi untuk menetapkan harga maksimum, dalam dolar AS (USD) menggunakan hingga lima tempat desimal. Misalnya, nilai 0,98765 akan menjadi harga maksimum $0,98765 USD per jam. Jika Anda mengatur harga maks sebesar -1, instans tidak akan dibuang berdasarkan harga. Selama ada kapasitas dan kuota yang tersedia, harga untuk instans akan menjadi harga yang lebih rendah dari harga saat ini untuk instans Spot atau untuk instans standar.

Langkah berikutnya

Dalam artikel ini, Anda telah mempelajari cara menambahkan kumpulan node Spot ke kluster AKS. Untuk informasi selengkapnya tentang cara mengontrol pod di beberapa kumpulan node, lihat Praktik terbaik untuk fitur penjadwal tingkat lanjut di AKS.