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 .
Class komputasi: Konfigurasi Pod Anda untuk menggunakan class komputasi GKE. Dengan pendekatan ini, Anda dapat menentukan daftar set zona yang diprioritaskan. Google Cloud 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 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
.
- Pastikan Anda memiliki cluster GKE yang sudah ada di region Google 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
).
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
atauus-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.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.
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
.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.
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:
- GKE mencoba menempatkan Pod di
us-central1-a
atau dius-central1-b
. - Jika
us-central1-a
danus-central1-b
tidak memiliki kapasitas yang tersedia, GKE akan mencoba menempatkan Pod dius-central1-c
. - Jika
us-central1-c
tidak memiliki kapasitas yang tersedia, kolomwhenUnsatisfiable: ScaleUpAnyway
akan membuat GKE menempatkan Pod di zona yang tersedia di region. - 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.
- GKE mencoba menempatkan Pod di
Buat Class Komputasi Kustom:
kubectl create -f zones-custom-compute-class.yaml
GKE membuat class komputasi kustom yang dapat dirujuk oleh workload Anda.
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
Membuat Deployment:
kubectl create -f custom-compute-class-deployment.yaml
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.
Mencantumkan Pod Anda:
kubectl get pods -o wide
Outputnya adalah daftar Pod yang berjalan dan node GKE yang sesuai.
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
- Memisahkan workload GKE satu sama lain
- Menjaga traffic jaringan dalam topologi yang sama dengan node
- Menyebarkan Pod di beberapa domain gagal