Halaman ini menunjukkan cara memberi tahu Google Kubernetes Engine (GKE) untuk menjadwalkan Pod secara bersamaan, terpisah, atau di lokasi tertentu.
Pemisahan workload memungkinkan Anda menggunakan taint dan toleransi untuk memberi tahu GKE untuk memisahkan Pod ke node yang berbeda, menempatkan Pod di node yang memenuhi kriteria tertentu, atau menjadwalkan workload tertentu secara bersamaan. Tindakan yang perlu dilakukan untuk mengonfigurasi pemisahan workload tergantung pada konfigurasi cluster GKE Anda. Tabel berikut menjelaskan perbedaannya:
Konfigurasi pemisahan workload | |
---|---|
|
Tambahkan toleransi pada pasangan nilai kunci tertentu ke spesifikasi Pod, dan pilih pasangan nilai kunci tersebut menggunakan nodeSelector. GKE membuat node, menerapkan taint node yang sesuai, dan menjadwalkan Pod di node tersebut. Untuk mendapatkan petunjuk, lihat Memisahkan workload di cluster Autopilot di halaman ini. |
Standard tanpa penyediaan otomatis node |
Untuk mendapatkan petunjuk, lihat Mengisolasi workload Anda di node pool khusus. |
Panduan ini menggunakan contoh skenario di mana Anda memiliki dua workload, tugas batch dan server web, yang ingin Anda pisahkan satu sama lain.
Kapan pemisahan workload digunakan di GKE
Pemisahan workload berguna jika Anda memiliki workload yang melakukan peran yang berbeda dan tidak boleh berjalan di mesin dasar yang sama. Beberapa contoh skenario mencakup:
- Anda memiliki workload koordinator batch yang membuat Tugas yang ingin Anda tetap pisahkan.
- Anda menjalankan server game dengan workload pencarian lawan yang hendak dipisahkan dari Pod sesi.
- Anda ingin memisahkan bagian stack dari satu sama lain, seperti memisahkan server dari database.
- Anda ingin memisahkan beberapa workload karena alasan kepatuhan atau kebijakan.
Harga
Di cluster Autopilot, Anda ditagih untuk resource yang diminta Pod saat berjalan. Untuk mengetahui detailnya, lihat harga Autopilot. Pod yang menggunakan pemisahan workload memiliki permintaan resource minimum yang lebih tinggi yang diterapkan daripada Pod reguler.
Di cluster Standard, Anda akan ditagih berdasarkan konfigurasi hardware dan ukuran setiap node, terlepas dari apakah Pod berjalan di node atau tidak. Untuk mengetahui detailnya, lihat harga Standard.
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. Untuk mempelajari cara membuat cluster, gunakan salah satu cara berikut:
Memisahkan workload di cluster Autopilot
Untuk memisahkan workload satu sama lain, tambahkan toleransi dan pemilih node ke setiap spesifikasi workload yang menentukan node tempat workload harus dijalankan. Metode ini juga berfungsi di cluster Standard yang mengaktifkan penyediaan otomatis node.
Simpan manifes berikut sebagai
web-server.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: web-server spec: replicas: 6 selector: matchLabels: pod: nginx-pod template: metadata: labels: pod: nginx-pod spec: tolerations: - key: group operator: Equal value: "servers" effect: NoSchedule nodeSelector: group: "servers" containers: - name: web-server image: nginx
Manifes ini mencakup kolom berikut:
spec.tolerations
: GKE dapat menempatkan Pod di node yang memiliki taintgroup=servers:NoSchedule
. GKE tidak dapat menjadwalkan Pod yang tidak memiliki toleransi ini di node tersebut.spec.nodeSelector
: GKE harus menempatkan Pod di node yang memiliki label nodegroup: servers
.
GKE menambahkan label dan taint yang sesuai ke node yang disediakan secara otomatis oleh GKE untuk menjalankan Pod ini.
Simpan manifes berikut sebagai
batch-job.yaml
:apiVersion: batch/v1 kind: Job metadata: name: batch-job spec: completions: 5 backoffLimit: 3 ttlSecondsAfterFinished: 120 template: metadata: labels: pod: pi-pod spec: restartPolicy: Never tolerations: - key: group operator: Equal value: "jobs" effect: NoSchedule nodeSelector: group: "jobs" containers: - name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
Manifes ini mencakup kolom berikut:
spec.tolerations
: GKE dapat menempatkan Pod di node yang memiliki taintgroup=jobs:NoSchedule
. GKE tidak dapat menjadwalkan Pod yang tidak memiliki toleransi ini di node tersebut.spec.nodeSelector
: GKE harus menempatkan Pod di node yang memiliki label nodegroup: jobs
.
GKE menambahkan label dan taint yang sesuai ke node yang disediakan secara otomatis oleh GKE untuk menjalankan Pod ini.
Deploy workload:
kubectl apply -f batch-job.yaml web-server.yaml
Saat Anda men-deploy workload, GKE melakukan hal berikut untuk setiap workload:
- GKE mencari node yang sudah ada serta memiliki taint node dan label node yang sesuai yang ditentukan dalam manifes. Jika node sudah ada dan memiliki resource yang tersedia, GKE menjadwalkan workload di node tersebut.
- Jika GKE tidak menemukan node yang sudah ada dan memenuhi syarat untuk menjadwalkan workload, GKE akan membuat node baru dan menerapkan taint node dan label node yang sesuai berdasarkan manifes. GKE menempatkan Pod di node baru.
Keberadaan efek NoSchedule
di taint node memastikan bahwa workload
tanpa toleransi tidak ditempatkan di node.
Memastikan pemisahan workload
Cantumkan Pod Anda untuk menemukan nama node:
kubectl get pods --output=wide
Outputnya mirip dengan yang berikut ini:
NAME READY ... NODE
batch-job-28j9h 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-78rcn 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-gg4x2 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-qgsxh 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-v4ksf 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
web-server-6bb8cd79b5-dw4ds 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-f2f3c272-n6xm
web-server-6bb8cd79b5-g5ld6 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-9f447e18-275z
web-server-6bb8cd79b5-jcdx5 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-9f447e18-275z
web-server-6bb8cd79b5-pxdzw 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-ccd22fd9-qtfq
web-server-6bb8cd79b5-s66rw 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-ccd22fd9-qtfq
web-server-6bb8cd79b5-zq8hh 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-f2f3c272-n6xm
Output ini menunjukkan bahwa Pod batch-job
dan Pod web-server
selalu berjalan
di node yang berbeda.
Keterbatasan pemisahan workload dengan taint dan toleransi
Anda tidak dapat menggunakan awalan kunci berikut untuk pemisahan workload:
- Kunci khusus GKE dan Kubernetes
- *cloud.google.com/
- *kubelet.kubernetes.io/
- *node.kubernetes.io/
Anda harus menggunakan kunci unik Anda sendiri untuk pemisahan workload.
Memisahkan workload di cluster Standard tanpa penyediaan otomatis node
Memisahkan workload di cluster Standard tanpa penyediaan otomatis node mengharuskan Anda membuat node pool secara manual dengan taint node dan label node yang sesuai untuk mengakomodasi workload. Untuk mendapatkan petunjuk, lihat Mengisolasi workload Anda di node pool khusus. Hanya gunakan pendekatan ini jika Anda memiliki persyaratan khusus yang mengharuskan Anda mengelola node pool secara manual.
Membuat cluster dengan taint node
Saat membuat cluster di GKE, Anda dapat menetapkan taint node ke cluster tersebut. Tindakan ini menetapkan taint ke semua node yang dibuat dengan cluster.
Jika Anda membuat node pool, node pool tidak mewarisi taint dari
cluster tersebut. Jika menginginkan taint pada node pool, Anda harus menggunakan flag --node-taints
saat membuat node pool.
Jika Anda membuat cluster Standard dengan taint node yang memiliki
efek NoSchedule
atau efek NoExecute
, GKE tidak dapat
menjadwalkan beberapa komponen yang dikelola GKE, seperti kube-dns
atau
metrics-server
pada node pool default yang dibuat GKE saat
Anda membuat cluster. GKE tidak dapat menjadwalkan komponen ini karena tidak memiliki toleransi yang sesuai untuk taint node Anda.
Anda harus menambahkan node pool baru yang memenuhi salah satu kondisi berikut:
- Tanpa taint
- Taint yang memiliki efek
PreferNoSchedule
- Taint
components.gke.io/gke-managed-components=true:NoSchedule
Dengan salah satu kondisi ini, GKE dapat menjadwalkan komponen yang dikelola GKE di node pool yang baru.
Untuk mendapatkan petunjuk, lihat Mengisolasi workload pada node khusus.
gcloud
Buat cluster dengan taint node:
gcloud container clusters create CLUSTER_NAME \
--node-taints KEY=VALUE:EFFECT
Ganti kode berikut:
CLUSTER_NAME
: nama cluster baru.EFFECT
: salah satu efek berikut:PreferNoSchedule
,NoSchedule
, atauNoExecute
.KEY=VALUE
: pasangan nilai kunci yang terkait denganEFFECT
.
Konsol
Buat cluster dengan taint node:
Buka halaman Google Kubernetes Engine di konsol Google Cloud.
Klik add_box Create.
Konfigurasi cluster Anda sesuai keinginan.
Dari panel navigasi, di bagian Node Pools, luaskan node pool yang ingin Anda ubah, lalu klik Metadata.
Di bagian Node taints, klik add Add Taint.
Dalam menu drop-down Effect, pilih efek yang diinginkan.
Masukkan pasangan nilai kunci yang diinginkan di kolom Kunci dan Nilai.
Klik Buat.
API
Saat Anda menggunakan API untuk membuat cluster, sertakan kolom nodeTaints
di bagian `nodeConfig:
POST https://container.googleapis.com/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/clusters
{
'cluster': {
'name': 'example-cluster',
'nodeConfig': {
'nodeTaints': [
{
'key': 'special',
'Value': 'gpu',
'effect': 'PreferNoSchedule'
}
]
...
}
...
}
}
Menghapus semua taint dari node pool
Untuk menghapus semua taint dari node pool, jalankan perintah berikut:
gcloud beta container node-pools update POOL_NAME \
--node-taints="" \
--cluster=CLUSTER_NAME
Ganti kode berikut:
POOL_NAME
: nama node pool yang akan diubah.CLUSTER_NAME
: nama cluster node pool.
Langkah selanjutnya
- Menerapkan kebijakan keamanan yang telah ditetapkan menggunakan pengontrol penerimaan PodSecurity
- Menjalankan workload full stack dalam skala besar