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 initialize 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 hal 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.

Langkah selanjutnya