Mengonfigurasi pemisahan workload di GKE


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
  1. Membuat node pool dengan taint node dan label node
  2. Menambahkan toleransi untuk taint ke spesifikasi Pod

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.

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.

  1. 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 taint group=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 node group: servers.

    GKE menambahkan label dan taint yang sesuai ke node yang disediakan secara otomatis oleh GKE untuk menjalankan Pod ini.

  2. 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 taint group=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 node group: jobs.

    GKE menambahkan label dan taint yang sesuai ke node yang disediakan secara otomatis oleh GKE untuk menjalankan Pod ini.

  3. Deploy workload:

    kubectl apply -f batch-job.yaml web-server.yaml
    

Saat Anda men-deploy workload, GKE melakukan hal berikut untuk setiap workload:

  1. 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.
  2. 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, atau NoExecute.
  • KEY=VALUE: pasangan nilai kunci yang terkait dengan EFFECT.

Konsol

Buat cluster dengan taint node:

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Klik Create.

  3. Konfigurasi cluster Anda sesuai keinginan.

  4. Dari panel navigasi, di bagian Node Pools, luaskan node pool yang ingin Anda ubah, lalu klik Metadata.

  5. Di bagian Node taints, klik Add Taint.

  6. Dalam menu drop-down Effect, pilih efek yang diinginkan.

  7. Masukkan pasangan nilai kunci yang diinginkan di kolom Kunci dan Nilai.

  8. 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