Menempatkan Pod GKE di zona tertentu

Halaman ini menunjukkan cara memberi tahu Google Kubernetes Engine (GKE) untuk menjalankan Pod Anda di node di Google Cloud zona tertentu menggunakan topologi zona. Jenis penempatan ini berguna dalam situasi seperti berikut:

  • Pod harus mengakses data yang disimpan di persistent disk Compute Engine zona.
  • Pod harus berjalan bersama resource zona lain seperti instance Cloud SQL.

Anda juga dapat menggunakan penempatan zona dengan pemilihan rute traffic sesuai topologi untuk mengurangi latensi antara klien dan workload. Untuk mengetahui detail tentang pemilihan rute traffic sesuai topologi, lihat Pemilihan rute sesuai topologi.

Menggunakan topologi zona untuk mengontrol penempatan Pod adalah mekanisme lanjutan Kubernetes yang hanya boleh digunakan jika situasi Anda mengharuskan Pod berjalan di zona tertentu. Di sebagian besar lingkungan produksi, sebaiknya Anda menggunakan resource regional, yang merupakan default GKE, jika memungkinkan.

Metode penempatan zona

Topologi zona yang dibangun di Kubernetes dengan label node topology.kubernetes.io/zone: ZONE. Untuk memberi tahu GKE agar menempatkan Pod di zona tertentu, gunakan salah satu metode berikut:

  • nodeAffinity: Menentukan aturan nodeAffinity dalam spesifikasi Pod untuk satu atau beberapa zona Google Cloud . Metode ini lebih fleksibel daripada nodeSelector karena memungkinkan Anda menempatkan Pod di beberapa zona.
  • nodeSelector: Menentukan nodeSelector di spesifikasi Pod untuk satu zona Google Cloud .

  • Kelas komputasi: Konfigurasi Pod Anda untuk menggunakan kelas komputasi GKE. Pendekatan ini memungkinkan Anda menentukan daftar set zona Google Cloud yang diprioritaskan. Hal ini memungkinkan workload dipindahkan secara dinamis ke kumpulan zona yang paling disukai saat node tersedia di zona ini. Untuk mengetahui informasi selengkapnya, lihat Tentang class komputasi kustom.

Pertimbangan

Penempatan Pod zona yang menggunakan topologi zona memiliki pertimbangan berikut:

  • Cluster harus berada di Google Cloud region yang sama dengan zona yang diminta.
  • Di cluster Standard, Anda harus menggunakan penyediaan otomatis node atau membuat node pool dengan node di zona yang diminta. Cluster Autopilot secara otomatis mengelola proses ini untuk Anda.
  • Cluster Standard harus berupa cluster regional.

Harga

Topologi zona adalah kemampuan penjadwalan Kubernetes dan ditawarkan tanpa biaya tambahan di GKE.

Untuk mengetahui detail harga, lihat harga GKE.

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan 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 perintah gcloud components update. gcloud CLI versi sebelumnya mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
  • Pastikan Anda memiliki cluster GKE yang sudah ada di regionGoogle Cloud yang sama dengan zona tempat Anda ingin menempatkan Pod. Untuk membuat cluster baru, lihat Membuat cluster Autopilot.

Menempatkan Pod di beberapa zona menggunakan nodeAffinity

nodeAffinity Kubernetes menyediakan mekanisme kontrol penjadwalan fleksibel yang mendukung beberapa pemilih label dan operator logis. Gunakan nodeAffinity jika Anda ingin membiarkan Pod berjalan di salah satu dari serangkaian zona (misalnya, di us-central1-a atau us-central1-f).

  1. Simpan manifes berikut sebagai multi-zone-affinity.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-multi-zone
      template:
        metadata:
          labels:
            app: nginx-multi-zone
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: topology.kubernetes.io/zone
                    operator: In
                    values:
                    - us-central1-a
                    - us-central1-f
    

    Manifes ini membuat Deployment dengan tiga replika dan menempatkan Pod di us-central1-a atau us-central1-f berdasarkan ketersediaan node.

    Pastikan cluster Anda berada di region us-central1. Jika cluster Anda berada di region berbeda, ubah zona di kolom nilai manifes menjadi zona yang valid di region cluster Anda.

    Opsional: Jika Anda menyediakan VM TPU, gunakan zona AI, seperti us-central1-ai1a. Zona AI adalah lokasi khusus yang dioptimalkan untuk workload AI/ML dalam Google Cloud region.

  2. Membuat Deployment:

    kubectl create -f multi-zone-affinity.yaml
    

    GKE membuat Pod di node di salah satu zona yang ditentukan. Beberapa Pod dapat berjalan di node yang sama. Anda dapat menggunakan anti-afinitas Pod untuk memberi tahu GKE agar menempatkan setiap Pod di node yang terpisah (opsional).

Menempatkan Pod di satu zona menggunakan nodeSelector

Untuk menempatkan Pod di satu zona, gunakan nodeSelector di spesifikasi Pod. nodeSelector setara dengan aturan nodeAfinitas requiredDuringSchedulingIgnoredDuringExecution yang memiliki satu zona yang ditentukan.

  1. Simpan manifes berikut sebagai single-zone-selector.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-singlezone
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-singlezone
      template:
        metadata:
          labels:
            app: nginx-singlezone
        spec:
          nodeSelector:
            topology.kubernetes.io/zone: "us-central1-a"
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
    

    Manifes ini memberi tahu GKE untuk menempatkan semua replika di Deployment di zona us-central1-a.

  2. Membuat Deployment:

    kubectl create -f single-zone-selector.yaml
    

Membuat penempatan Pod di zona yang dipilih menjadi prioritas menggunakan class komputasi

Class komputasi GKE menyediakan mekanisme kontrol yang memungkinkan Anda menentukan daftar prioritas konfigurasi node. Preferensi zona memungkinkan Anda menentukan zona tempat GKE akan menempatkan Pod. Menentukan preferensi zona di class komputasi memerlukan GKE versi 1.33.1-gke.1545000 atau yang lebih baru.

Contoh berikut membuat class komputasi yang menentukan daftar zona pilihan untuk Pod.

Langkah-langkah ini mengasumsikan bahwa cluster Anda berada di region us-central1. Jika cluster Anda berada di region yang berbeda, ubah nilai zona dalam manifes menjadi zona yang valid di region cluster Anda.

  1. Simpan manifes berikut sebagai zones-custom-compute-class.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: zones-custom-compute-class
    spec:
      priorities:
      - location:
        zones: [us-central1-a, us-central1-b]
      - location:
        zones: [us-central1-c]
      activeMigration:
        optimizeRulePriority: true
      nodePoolAutoCreation:
        enabled: true
      whenUnsatisfiable: ScaleUpAnyway
    

    Manifes class komputasi ini mengubah perilaku penskalaan sebagai berikut:

    1. GKE mencoba menempatkan Pod di us-central1-a atau di us-central1-b.
    2. Jika us-central1-a dan us-central1-b tidak memiliki kapasitas yang tersedia, GKE akan mencoba menempatkan Pod di us-central1-c.
    3. Jika us-central1-c tidak memiliki kapasitas yang tersedia, kolom whenUnsatisfiable: ScaleUpAnyway akan membuat GKE menempatkan Pod di zona yang tersedia di region.
    4. Jika zona yang memiliki prioritas lebih tinggi di class komputasi tersedia nanti, kolom activeMigration.optimizeRulePriority: true akan membuat GKE memindahkan Pod ke zona tersebut dari zona dengan prioritas lebih rendah. Migrasi ini menggunakan Anggaran Gangguan Pod untuk memastikan ketersediaan layanan.
  2. Buat Class Compute Kustom:

    kubectl create -f zones-custom-compute-class.yaml
    

    GKE membuat class komputasi kustom yang dapat dirujuk oleh workload Anda.

  3. Simpan manifes berikut sebagai custom-compute-class-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-zonal-preferences
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-zonal-preferences
      template:
        metadata:
          labels:
            app: nginx-zonal-preferences
        spec:
          nodeSelector:
            cloud.google.com/compute-class: "zones-custom-compute-class"
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
    
  4. Membuat Deployment:

    kubectl create -f custom-compute-class-deployment.yaml
    

Zona AI target

Zona AI adalah zona khusus yang digunakan untuk beban kerja pelatihan dan inferensi AI/ML. Zona ini menyediakan kapasitas akselerator ML yang signifikan. Untuk mengetahui informasi selengkapnya, lihat dokumentasi zona AI.

Sebelum menggunakan zona AI di GKE, pertimbangkan karakteristik berikut:

  • Zona AI terpisah secara fisik dari zona standar untuk menyediakan ruang penyimpanan dan daya tambahan. Pemisahan ini dapat menyebabkan latensi yang lebih tinggi, yang umumnya dapat ditoleransi untuk beban kerja AI/ML.
  • Zona AI memiliki akhiran dengan notasi ai. Misalnya, zona AI di region us-central1 diberi nama us-central1-ai1a.
  • Saat ini, hanya VM TPU yang didukung.
  • Bidang kontrol cluster berjalan di satu atau beberapa zona standar dalam region yang sama dengan zona AI.
  • Anda dapat menjalankan VM tanpa TPU terlampir di zona AI hanya jika Anda memenuhi persyaratan berikut:

    • Anda sudah menjalankan workload lain yang menggunakan VM TPU di zona yang sama.
    • VM non-TPU adalah Spot VM, terikat ke reservasi, atau merupakan bagian dari node pool dengan rasio VM tujuan umum terhadap akselerator tertentu.
  • Zona AI berbagi komponen, seperti koneksi jaringan dan peluncuran software, dengan zona standar yang memiliki akhiran yang sama dalam region yang sama. Untuk workload dengan ketersediaan tinggi, sebaiknya gunakan zona yang berbeda. Misalnya, hindari penggunaan us-central1-ai1a dan us-central1-a untuk ketersediaan tinggi.

Secara default, GKE tidak men-deploy workload Anda di zona AI. Untuk menggunakan zona AI, Anda harus mengonfigurasi salah satu opsi berikut:

  • (Direkomendasikan) ComputeClasses: tetapkan prioritas tertinggi untuk meminta TPU sesuai permintaan di zona AI. ComputeClass membantu Anda menentukan daftar konfigurasi hardware yang diprioritaskan untuk beban kerja Anda. Untuk contoh, lihat Tentang ComputeClass.
  • Penyediaan otomatis node: gunakan nodeSelector atau nodeAffinity dalam spesifikasi Pod untuk menginstruksikan penyediaan otomatis node agar membuat node pool di zona AI. Jika workload Anda tidak secara eksplisit menargetkan zona AI, penyediaan otomatis node hanya mempertimbangkan zona standar atau zona dari --autoprovisioning-locations saat membuat node pool baru. Konfigurasi ini memastikan bahwa workload yang tidak menjalankan model AI/ML tetap berada di zona standar, kecuali jika Anda mengonfigurasi secara eksplisit. Untuk contoh manifes yang menggunakan nodeSelector, lihat Menetapkan zona default untuk node yang dibuat otomatis.
  • GKE Standard: jika Anda mengelola node pool secara langsung, gunakan zona AI di flag --node-locations saat membuat node pool. Untuk melihat contohnya, lihat Men-deploy workload TPU di GKE Standard.

Memverifikasi penempatan Pod

Untuk memverifikasi penempatan Pod, buat daftar Pod dan periksa label node. Beberapa Pod mungkin berjalan di satu node, sehingga Anda mungkin tidak melihat Pod tersebar di beberapa zona jika menggunakan nodeAffinity.

  1. Mencantumkan Pod Anda:

    kubectl get pods -o wide
    

    Outputnya adalah daftar Pod yang berjalan dan node GKE yang sesuai.

  2. Jelaskan node:

    kubectl describe node NODE_NAME | grep "topology.kubernetes.io/zone"
    

    Ganti NODE_NAME dengan nama node.

    Outputnya mirip dengan yang berikut ini:

    topology.kubernetes.io/zone: us-central1-a
    

Jika Anda ingin GKE menyebarkan Pod secara merata di beberapa zona untuk peningkatan failover di beberapa domain gagal, gunakan topologySpreadConstraints.

Langkah berikutnya