Menjalankan workload fault-tolerant dengan biaya lebih rendah di Pod Spot


Halaman ini menunjukkan cara menjalankan workload fault-tolerant dengan biaya lebih rendah menggunakan Pod Spot di cluster Google Kubernetes Engine (GKE) Autopilot Anda.

Ringkasan

Di cluster GKE Autopilot, Spot Pod adalah Pod yang berjalan pada node yang didukung oleh Spot VM Compute Engine. Pod Spot dihargai lebih rendah daripada Pod Autopilot standar, tetapi dapat ditiadakan oleh GKE setiap kali resource komputasi diperlukan untuk menjalankan Pod standar.

Pod Spot ideal untuk menjalankan beban kerja stateless, batch, atau fault-tolerant dengan biaya lebih rendah daripada menjalankan beban kerja tersebut sebagai Pod standar. Untuk menggunakan Pod Spot di cluster Autopilot, ubah manifes dengan spesifikasi Pod untuk meminta Pod Spot.

Anda dapat menjalankan Pod Spot di class komputasi Autopilot umum default serta di class komputasi khusus yang memenuhi persyaratan hardware tertentu. Untuk mengetahui informasi tentang class komputasi ini, lihat Class komputasi di Autopilot.

Untuk mempelajari lebih lanjut harga Pod Spot di cluster Autopilot, lihat Harga Google Kubernetes Engine.

Pod Spot dikecualikan dari Perjanjian Tingkat Layanan Autopilot.

Manfaat

Menggunakan Pod Spot di cluster Autopilot akan memberi Anda manfaat berikut:

  • Harga lebih rendah daripada menjalankan beban kerja yang sama pada Pod Autopilot standar.
  • GKE mengelola penskalaan otomatis dan penjadwalan secara otomatis.
  • GKE secara otomatis taint node yang menjalankan Pod Spot untuk memastikan bahwa Pod standar, seperti beban kerja penting, tidak dijadwalkan pada node tersebut. Deployment Anda yang menggunakan Pod Spot akan otomatis diupdate dengan tolerasi yang sesuai.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Meminta Pod Spot di beban kerja Autopilot Anda

Untuk meminta agar Pod Anda berjalan sebagai Pod Spot, gunakan label cloud.google.com/gke-spot=true di nodeSelector atau afinitas node dalam spesifikasi Pod Anda. GKE secara otomatis menyediakan node yang dapat menjalankan Pod Spor.

Pod Spot dapat dikeluarkan dan dihentikan kapan saja, misalnya jika resource komputasi diperlukan di tempat lain di Google Cloud. Saat penghentian terjadi, Pod Spot di node penghentian dapat meminta masa tenggang hingga 15 detik sebelum penghentian, yang diberikan berdasarkan upaya terbaik, dengan menentukan kolom terminationGracePeriodSeconds.

Masa tenggang maksimum yang diberikan untuk Pod Spot selama preemption adalah 15 detik. Meminta lebih dari 15 detik dalam terminationGracePeriodSeconds tidak berarti mendapatkan lebih dari 15 detik selama preemption. Saat dikeluarkan, Pod Anda akan dikirimi sinyal SIGTERM, dan harus mengambil langkah untuk mematikan selama masa tenggang.

Untuk Autopilot, GKE juga secara otomatis melakukan taint pada node yang dibuat untuk menjalankan Pod Spot dan mengubah beban kerja tersebut dengan toleransi yang sesuai. Taint ini mencegah Pod standar dijadwalkan pada node yang menjalankan Pod Spot.

Menggunakan PemilihNode untuk mengharuskan Pod Spot

Anda dapat menggunakan Pemilihnode untuk mewajibkan Pod Spot dalam Deployment. Tambahkan label cloud.google.com/gke-spot=true ke Deployment Anda, seperti dalam contoh berikut:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      labels:
        app: pi
    spec:
      nodeSelector:
        cloud.google.com/gke-spot: "true"
      terminationGracePeriodSeconds: 15
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

Menggunakan afinitas node untuk meminta Pod Spot

Atau, Anda dapat menggunakan afinitas node untuk meminta Pod Spot. Afinitas node memberi Anda cara yang lebih luas dalam memilih node yang akan menjalankan beban kerja. Misalnya, Anda dapat menggabungkan beberapa kriteria pemilihan untuk mendapatkan kontrol yang lebih baik atas lokasi di mana Pod Anda berjalan. Saat menggunakan afinitas node untuk meminta Pod Spot, Anda dapat menentukan jenis afinitas node yang akan digunakan, sebagai berikut:

  • requiredDuringSchedulingIgnoredDuringExecution: Harus menggunakan Pod Spot.
  • preferredDuringSchedulingIgnoredDuringExecution: Gunakan Pod Spot atas dasar upaya terbaik.

Untuk menggunakan afinitas node guna mengharuskan Pod Spot dalam Deployment, tambahkan aturan nodeAffinity berikut ke manifes Deployment Anda:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      labels:
        app: pi
    spec:
      terminationGracePeriodSeconds: 15
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: cloud.google.com/gke-spot
                operator: In
                values:
                - "true"
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

Meminta Pod Spot atas dasar upaya terbaik

Untuk menggunakan afinitas node guna meminta Pod Spot dengan upaya terbaik, gunakan preferredDuringSchedulingIgnoredDuringExecution. Saat Anda meminta Pod Spot berdasarkan pilihan, GKE akan menjadwalkan Pod berdasarkan urutan berikut:

  1. Node yang ada yang dapat menjalankan Pod Spot yang memiliki ketersediaan kapasitas yang dapat dialokasikan.
  2. Node standar yang ada dan memiliki kapasitas alokasi yang tersedia.
  3. Node baru yang dapat menjalankan Pod Spot, jika resource komputasi tersedia.
  4. Node standar baru.

Karena GKE lebih memilih node standar yang ada dan memiliki kapasitas yang dapat dialokasikan daripada membuat node baru untuk Pod Spot, Anda mungkin melihat lebih banyak Pod yang berjalan sebagai Pod standar daripada Pod Spot, sehingga Anda tidak bisa memanfaatkan sepenuhnya harga Pod Spot yang lebih rendah.

Permintaan untuk Pod yang dapat dihentikan

Cluster Autopilot mendukung permintaan untuk Pod yang dapat dihentikan menggunakan pemilih cloud.google.com/gke-preemptible. Pod yang menggunakan pemilih ini otomatis dimigrasikan ke Pod Spot, dan pemilih diubah menjadi cloud.google.com/gke-spot.

Menemukan dan menghapus Pod yang dihentikan

Selama penghentian Pod setelah selesai, kubelet menetapkan status Failed dan alasan Shutdown ke Pod yang dihentikan. Saat jumlah Pod yang dihentikan mencapai batas 1.000, pembersihan sampah memori akan membersihkan Pod. Anda juga dapat menghapus Pod shutdown secara manual menggunakan perintah berikut:

kubectl get pods --all-namespaces | grep -i shutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n

Menghentikan workload agar tidak menggunakan Pod Spot

Jika memiliki Pod Spot yang ada dan ingin diupdate agar berjalan sebagai Pod standar, Anda dapat menggunakan salah satu metode berikut:

  • Buat ulang beban kerja: Hapus Deployment, hapus baris dalam manifes yang memilih Pod Spot, lalu terapkan manifes Deployment yang diperbarui ke cluster.
  • Mengedit workload: Mengedit spesifikasi Deployment saat Pod berjalan di cluster.

Dengan kedua metode ini, Anda mungkin mengalami gangguan beban kerja kecil.

Membuat ulang workload

Langkah-langkah berikut menunjukkan cara menghapus Deployment yang ada dan menerapkan manifes yang diperbarui ke cluster. Anda juga dapat menggunakan langkah-langkah ini untuk jenis workload Kubernetes lainnya, seperti Tugas.

Untuk memastikan GKE menempatkan Pod yang diperbarui pada jenis node yang benar, Anda harus mengekspor status workload yang ada dari server Kubernetes API ke file dan mengedit file tersebut.

  1. Tulis spesifikasi beban kerja ke file YAML:

    kubectl get deployment DEPLOYMENT_NAME -o yaml > DEPLOYMENT_NAME-on-demand.yaml
    

    Ganti DEPLOYMENT_NAME dengan nama deployment Anda. Untuk jenis workload lainnya, seperti Tugas atau Pod, gunakan nama resource yang sesuai dalam perintah kubectl get, seperti kubectl get pod.

  2. Buka file YAML di editor teks:

    vi DEPLOYMENT_NAME-on-demand.yaml
    
  3. Hapus nodeSelector untuk Pod Spot dan toleransi yang ditambahkan GKE untuk Pod Spot dari file:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
      # lines omitted for clarity
    spec:
      progressDeadlineSeconds: 600
      replicas: 6
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          pod: nginx-pod
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
        # lines omitted for clarity
        spec:
          containers:
          - image: nginx
            imagePullPolicy: Always
            name: web-server
            resources:
              limits:
                ephemeral-storage: 1Gi
              requests:
                cpu: 500m
                ephemeral-storage: 1Gi
                memory: 2Gi
            securityContext:
              capabilities:
                drop:
                - NET_RAW
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          nodeSelector:
            cloud.google.com/gke-spot: "true"
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext:
            seccompProfile:
              type: RuntimeDefault
          terminationGracePeriodSeconds: 15
          tolerations:
          - effect: NoSchedule
            key: kubernetes.io/arch
            operator: Equal
            value: amd64
          - effect: NoSchedule
            key: cloud.google.com/gke-spot
            operator: Equal
            value: "true"
    status:
      #lines omitted for clarity
    

    Anda harus menghapus toleransi dan nodeSelector untuk menunjukkan kepada GKE bahwa Pod harus berjalan di node on-demand, bukan di node Spot.

  4. Simpan manifes yang diperbarui.

  5. Hapus dan terapkan kembali manifes Deployment ke cluster:

    kubectl replace -f DEPLOYMENT_NAME-on-demand.yaml
    

    Durasi operasi ini bergantung pada jumlah Pod yang perlu dihentikan dan dibersihkan oleh GKE.

Mengedit beban kerja di tempat

Langkah-langkah berikut menunjukkan cara mengedit Deployment yang sedang berjalan di tempat untuk menunjukkan kepada GKE bahwa Pod harus berjalan di node on-demand. Anda juga dapat menggunakan langkah-langkah ini untuk jenis workload Kubernetes lainnya, seperti Tugas.

Anda harus mengedit objek workload di Kubernetes API karena GKE secara otomatis menambahkan toleransi untuk Pod Spot ke spesifikasi workload selama penerimaan workload.

  1. Buka manifes beban kerja Anda untuk diedit di editor teks:

    kubectl edit deployment/DEPLOYMENT_NAME
    

    Ganti DEPLOYMENT_NAME dengan nama Deployment. Untuk jenis workload lainnya, seperti Tugas atau Pod, gunakan nama resource yang sesuai dalam perintah kubectl edit, seperti kubectl edit pod/POD_NAME.

  2. Di editor teks, hapus pemilih node atau aturan afinitas node untuk Pod Spot dan toleransi yang ditambahkan GKE ke manifes, seperti dalam contoh berikut:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: example-deployment
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          type: dev
      template:
        metadata:
          labels:
            type: dev
        spec:
          nodeSelector:
            cloud.google.com/gke-spot: "true"
          tolerations:
          - effect: NoSchedule
            key: cloud.google.com/gke-spot
            operator: Equal
            value: "true"
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
    
  3. Simpan manifes yang diperbarui dan tutup editor teks. Konfigurasi objek yang diperbarui menunjukkan kepada GKE bahwa Pod harus berjalan di node on demand. GKE membuat ulang Pod untuk menempatkannya di node on-demand baru.

Memverifikasi bahwa workload berjalan di node on-demand

Untuk memverifikasi bahwa workload yang diperbarui tidak lagi berjalan di Spot Pod, periksa workload dan cari toleransi untuk Spot Pod:

  • Periksa workload:

    kubectl describe deployment DEPLOYMENT_NAME
    

Output tidak menampilkan entri untuk cloud.google.com/gke-spot di kolom spec.tolerations.

Langkah selanjutnya