Menyediakan kapasitas komputasi tambahan untuk penskalaan Pod yang cepat


Halaman ini menunjukkan cara mencadangkan kapasitas komputasi tambahan di cluster Google Kubernetes Engine (GKE) Anda sehingga workload Anda dapat ditingkatkan skalanya dengan cepat selama peristiwa traffic tinggi tanpa menunggu node baru dimulai. Anda dapat menggunakan petunjuk ini untuk mencadangkan overhead komputasi pada dasar yang tersedia secara konsisten, atau sebelum peristiwa tertentu.

Alasan pentingnya penyediaan kapasitas cadangan

Cluster GKE Autopilot dan cluster Standard dengan penyediaan otomatis node akan membuat node baru saat tidak ada node dengan kapasitas untuk menjalankan Pod baru. Setiap node baru memerlukan waktu sekitar 80 hingga 120 detik untuk melakukan booting. GKE menunggu hingga node dimulai sebelum menempatkan Pod yang tertunda di node baru, setelah itu Pod dapat melakukan booting. Di cluster Standard, Anda juga dapat membuat node pool baru secara manual yang memiliki kapasitas tambahan yang dibutuhkan untuk menjalankan Pod baru. Halaman ini berlaku untuk cluster yang menggunakan mekanisme penskalaan otomatis node, seperti Autopilot atau penyediaan otomatis node.

Dalam beberapa kasus, Anda mungkin ingin Pod melakukan booting lebih cepat selama peristiwa peningkatan skala. Misalnya, jika Anda meluncurkan ekspansi baru untuk game multiplayer live-service yang populer, waktu booting yang lebih cepat untuk Pod server game dapat mengurangi waktu antrean bagi pemain yang login pada hari peluncuran. Sebagai contoh lainnya, jika Anda menjalankan platform e-commerce dan berencana melakukan flash sale untuk waktu terbatas, Anda akan mengalami burst traffic selama durasi penjualan.

Penyediaan kapasitas cadangan kompatibel dengan bursting Pod, yang memungkinkan Pod untuk sementara menggunakan resource yang diminta oleh Pod lain pada node, jika kapasitas tersebut tersedia dan tidak digunakan oleh Pod lain. Untuk menggunakan burst, tetapkan batas resource lebih tinggi dari permintaan resource atau jangan tetapkan batas resource. Untuk mengetahui detailnya, lihat Mengonfigurasi burst Pod di GKE.

Cara kerja penyediaan kapasitas cadangan di GKE

Untuk menyediakan kapasitas cadangan, Anda dapat menggunakan PriorityClasses Kubernetes dan Pod placeholder. PriorityClass memungkinkan Anda memberi tahu GKE bahwa beberapa workload memiliki prioritas yang lebih rendah daripada workload lain. Anda dapat men-deploy Pod placeholder yang menggunakan PriorityClass prioritas rendah dan meminta kapasitas komputasi yang perlu Anda cadangkan. GKE menambahkan kapasitas ke cluster dengan membuat node baru untuk mengakomodasi Pod placeholder.

Saat workload produksi Anda bertambah, GKE akan mengeluarkan Pod placeholder berprioritas lebih rendah dan menjadwalkan replika baru dari Pod produksi Anda (yang menggunakan PriorityClass berprioritas lebih tinggi) sebagai penggantinya. Jika Anda memiliki beberapa Pod prioritas rendah yang memiliki tingkat prioritas berbeda, GKE akan mengeluarkan Pod prioritas terendah terlebih dahulu.

Metode penyediaan kapasitas

Bergantung pada kasus penggunaan, Anda dapat menyediakan kapasitas tambahan di cluster GKE dengan salah satu cara berikut:

  • Penyediaan kapasitas yang konsisten: Gunakan Deployment untuk membuat sejumlah Pod placeholder prioritas rendah yang terus berjalan dalam cluster tersebut. Saat GKE mengeluarkan Pod ini untuk menjalankan workload produksi Anda, pengontrol Deployment akan memastikan bahwa GKE menyediakan kapasitas yang lebih besar untuk membuat ulang Pod prioritas rendah yang dikeluarkan. Metode ini menyediakan overhead kapasitas yang konsisten di beberapa peristiwa peningkatan dan penurunan skala, hingga Anda menghapus Deployment.
  • Penyediaan kapasitas penggunaan tunggal: Gunakan Job untuk menjalankan sejumlah Pod placeholder paralel prioritas rendah selama jangka waktu tertentu. Setelah periode tersebut berlalu atau saat GKE mengeluarkan semua replika Job, kapasitas yang dicadangkan akan berhenti tersedia. Metode ini menyediakan kapasitas tertentu yang tersedia selama periode tertentu.

Harga

Di GKE Autopilot, Anda akan dikenai biaya untuk permintaan resource dari Pod yang berjalan, termasuk workload prioritas rendah yang Anda deploy. Untuk detailnya, lihat Harga Autopilot.

Di GKE Standard, Anda akan dikenai biaya untuk VM Compute Engine dasar yang disediakan GKE, terlepas dari apakah Pod menggunakan kapasitas tersebut atau tidak. Untuk 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.
  • Pastikan Anda memiliki cluster GKE Autopilot, atau cluster GKE Standard dengan penyediaan otomatis node yang diaktifkan.
  • Baca Pertimbangan untuk penyediaan kapasitas guna memastikan Anda memilih nilai yang sesuai dalam permintaan kapasitas.

Membuat PriorityClass

Untuk menggunakan salah satu metode yang dijelaskan dalam Metode penyediaan kapasitas, Anda harus membuat PriorityClass berikut terlebih dahulu:

  • PriorityClass Default: PriorityClass default global yang ditetapkan ke setiap Pod yang tidak secara eksplisit menetapkan PriorityClass berbeda dalam spesifikasi Pod. Pod dengan PriorityClass default ini dapat mengeluarkan Pod yang menggunakan PriorityClass lebih rendah.
  • PriorityClass Rendah: PriorityClass non-default yang disetel ke prioritas paling rendah di GKE. Pod dengan PriorityClass ini dapat dikeluarkan untuk menjalankan Pod dengan PriorityClass lebih tinggi.
  1. Simpan manifes berikut sebagai priorityclasses.yaml:

    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: low-priority
    value: -10
    preemptionPolicy: Never
    globalDefault: false
    description: "Low priority workloads"
    ---
    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: default-priority
    value: 0
    preemptionPolicy: PreemptLowerPriority
    globalDefault: true
    description: "The global default priority."
    

    Manifes ini mencakup kolom berikut:

    • preemptionPolicy: Menentukan apakah Pod yang menggunakan PriorityClass atau tidak dapat mengeluarkan Pod dengan prioritas lebih rendah. PriorityClass low-priority menggunakan Never, dan PriorityClass default menggunakan PreemptLowerPriority.
    • value: Prioritas untuk Pod yang menggunakan PriorityClass. PriorityClass default menggunakan 0. PriorityClass low-priority menggunakan -1. Di Autopilot, Anda dapat menetapkannya ke nilai apa pun yang kurang dari prioritas PriorityClass default.

      Di Standard, jika Anda menetapkan nilai ini ke kurang dari -10, Pod yang menggunakan PriorityClass tersebut tidak akan memicu pembuatan node baru dan tetap berada dalam Pending.

      Untuk membantu menentukan nilai yang sesuai untuk prioritas, lihat Memilih prioritas.

    • globalDefault: Menentukan apakah GKE menetapkan PriorityClass ke Pod yang tidak secara eksplisit menetapkan PriorityClass dalam spesifikasi Pod. PriorityClass low-priority menggunakan false, dan PriorityClass default menggunakan true.

  2. Terapkan manifes:

    kubectl apply -f priorityclasses.yaml
    

Menyediakan kapasitas komputasi tambahan

Bagian berikut menunjukkan contoh saat Anda menyediakan kapasitas untuk satu peristiwa atau secara konsisten dari waktu ke waktu.

Menggunakan Deployment untuk penyediaan kapasitas yang konsisten

  1. Simpan manifes berikut sebagai capacity-res-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: capacity-res-deploy
    spec:
      replicas: 10
      selector:
        matchLabels:
          app: reservation
      template:
        metadata:
          labels:
            app: reservation
        spec:
          priorityClassName: low-priority
          terminationGracePeriodSeconds: 0
          containers:
          - name: ubuntu
            image: ubuntu
            command: ["sleep"]
            args: ["infinity"]
            resources:
              requests:
                cpu: 500m
                memory: 500Mi
    

    Manifes ini mencakup kolom berikut:

    • spec.replicas: Ubah nilai ini untuk memenuhi persyaratan Anda.
    • spec.resources.requests: Mengubah permintaan CPU dan memori untuk memenuhi persyaratan Anda. Gunakan panduan dalam Memilih ukuran kapasitas untuk membantu Anda memutuskan nilai permintaan yang tepat.
    • spec.containers.command dan spec.containers.args: Memberi tahu Pod untuk tetap aktif sampai dikeluarkan oleh GKE.
  2. Terapkan manifes:

    kubectl apply -f capacity-res-deployment.yaml
    
  3. Dapatkan status Pod:

    kubectl get pods -l app=reservation
    

    Tunggu hingga semua replika memiliki status Running.

Menggunakan Job untuk penyediaan kapasitas peristiwa tunggal

  1. Simpan manifes berikut sebagai capacity-res-job.yaml:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: capacity-res-job
    spec:
      parallelism: 4
      backoffLimit: 0
      template:
        spec:
          priorityClassName: low-priority
          terminationGracePeriodSeconds: 0
          containers:
          - name: ubuntu-container
            image: ubuntu
            command: ["sleep"]
            args: ["36000"]
            resources:
              requests:
                cpu: "16"
          restartPolicy: Never
    

    Manifes ini mencakup kolom berikut:

    • spec.parallelism: Mengubah ke jumlah Job yang ingin Anda jalankan secara paralel untuk mencadangkan kapasitas.
    • spec.backoffLimit: 0: Mencegah pengontrol Job membuat ulang Job yang dihapus.
    • template.spec.resources.requests: Mengubah permintaan CPU dan memori untuk memenuhi persyaratan Anda. Gunakan panduan di Pertimbangan untuk membantu Anda memutuskan nilai yang sesuai.
    • template.spec.containers.command dan template.spec.containers.args: Meminta Job agar tetap aktif selama jangka waktu tertentu, dalam detik, saat Anda memerlukan kapasitas tambahan.
  2. Terapkan manifes:

    kubectl apply -f capacity-res-job.yaml
    
  3. Dapatkan status Job:

    kubectl get jobs
    

    Tunggu hingga semua Job memiliki status Running.

Menguji penyediaan dan penghapusan kapasitas

Untuk memastikan bahwa penyediaan kapasitas berfungsi seperti yang diharapkan, lakukan hal berikut:

  1. Di terminal Anda, pantau status workload penyediaan kapasitas:

    1. Untuk Deployment, jalankan perintah berikut:

      kubectl get pods --label=app=reservation -w
      
    2. Untuk Job, jalankan perintah berikut:

      kubectl get Jobs -w
      
  2. Buka jendela terminal baru, lalu lakukan hal berikut:

    1. Simpan manifes berikut sebagai test-deployment.yaml:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: helloweb
        labels:
          app: hello
      spec:
        replicas: 5
        selector:
          matchLabels:
            app: hello
            tier: web
        template:
          metadata:
            labels:
              app: hello
              tier: web
          spec:
            containers:
            - name: hello-app
              image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
              ports:
              - containerPort: 8080
              resources:
                requests:
                  cpu: 400m
                  memory: 400Mi
      
    2. Terapkan manifes:

      kubectl apply -f test-deployment.yaml
      
  3. Di jendela terminal asli, perhatikan bahwa GKE menghentikan beberapa workload penyediaan kapasitas untuk menjadwalkan replika baru Anda, mirip dengan contoh berikut:

    NAME                                         READY   STATUS    RESTARTS   AGE
    capacity-res-deploy-6bd9b54ffc-5p6wc         1/1     Running   0          7m25s
    capacity-res-deploy-6bd9b54ffc-9tjbt         1/1     Running   0          7m26s
    capacity-res-deploy-6bd9b54ffc-kvqr8         1/1     Running   0          2m32s
    capacity-res-deploy-6bd9b54ffc-n7zn4         1/1     Running   0          2m33s
    capacity-res-deploy-6bd9b54ffc-pgw2n         1/1     Running   0          2m32s
    capacity-res-deploy-6bd9b54ffc-t5t57         1/1     Running   0          2m32s
    capacity-res-deploy-6bd9b54ffc-v4f5f         1/1     Running   0          7m24s
    helloweb-85df88c986-zmk4f                    0/1     Pending   0          0s
    helloweb-85df88c986-lllbd                    0/1     Pending   0          0s
    helloweb-85df88c986-bw7x4                    0/1     Pending   0          0s
    helloweb-85df88c986-gh8q8                    0/1     Pending   0          0s
    helloweb-85df88c986-74jrl                    0/1     Pending   0          0s
    capacity-res-deploy-6bd9b54ffc-v6dtk   1/1     Terminating   0          2m47s
    capacity-res-deploy-6bd9b54ffc-kvqr8   1/1     Terminating   0          2m47s
    capacity-res-deploy-6bd9b54ffc-pgw2n   1/1     Terminating   0          2m47s
    capacity-res-deploy-6bd9b54ffc-n7zn4   1/1     Terminating   0          2m48s
    capacity-res-deploy-6bd9b54ffc-2f8kx   1/1     Terminating   0          2m48s
    ...
    helloweb-85df88c986-lllbd              0/1     Pending       0          1s
    helloweb-85df88c986-gh8q8              0/1     Pending       0          1s
    helloweb-85df88c986-74jrl              0/1     Pending       0          1s
    helloweb-85df88c986-zmk4f              0/1     Pending       0          1s
    helloweb-85df88c986-bw7x4              0/1     Pending       0          1s
    helloweb-85df88c986-gh8q8              0/1     ContainerCreating   0          1s
    helloweb-85df88c986-zmk4f              0/1     ContainerCreating   0          1s
    helloweb-85df88c986-bw7x4              0/1     ContainerCreating   0          1s
    helloweb-85df88c986-lllbd              0/1     ContainerCreating   0          1s
    helloweb-85df88c986-74jrl              0/1     ContainerCreating   0          1s
    helloweb-85df88c986-zmk4f              1/1     Running             0          4s
    helloweb-85df88c986-lllbd              1/1     Running             0          4s
    helloweb-85df88c986-74jrl              1/1     Running             0          5s
    helloweb-85df88c986-gh8q8              1/1     Running             0          5s
    helloweb-85df88c986-bw7x4              1/1     Running             0          5s
    

    Output ini menunjukkan bahwa Deployment baru Anda memerlukan waktu lima detik untuk berubah dari Pending menjadi Running.

Pertimbangan untuk penyediaan kapasitas

Penyediaan kapasitas yang konsisten

  • Evaluasi jumlah replika Pod placeholder yang Anda butuhkan dan ukuran permintaan di setiap replika. Replika prioritas rendah harus meminta kapasitas setidaknya yang sama dengan workload produksi terbesar Anda, sehingga workload tersebut dapat masuk ke kapasitas yang dicadangkan oleh workload prioritas rendah Anda.
  • Jika Anda mengoperasikan sejumlah besar workload produksi dalam skala besar, pertimbangkan untuk menetapkan permintaan resource Pod placeholder ke nilai yang menyediakan kapasitas yang cukup untuk menjalankan beberapa workload produksi, bukan hanya satu.

Penyediaan kapasitas sekali pakai

  • Tetapkan durasi waktu agar Job placeholder dipertahankan hingga waktu saat Anda memerlukan kapasitas tambahan. Misalnya, jika Anda menginginkan kapasitas tambahan untuk hari peluncuran game selama 24 jam, tetapkan durasi waktu ke 86.400 detik. Cara ini memastikan bahwa kapasitas yang disediakan tidak bertahan lebih lama dari yang Anda butuhkan.
  • Tetapkan masa pemeliharaan untuk jangka waktu yang sama saat Anda mencadangkan kapasitas. Hal ini mencegah Job prioritas rendah dikeluarkan selama upgrade node. Menetapkan masa pemeliharaan juga merupakan praktik yang baik saat Anda mengantisipasi permintaan yang tinggi untuk workload Anda.
  • Jika Anda mengoperasikan sejumlah besar workload produksi dalam skala besar, pertimbangkan untuk menetapkan permintaan resource Job placeholder ke nilai yang menyediakan kapasitas yang cukup untuk menjalankan beberapa workload produksi, bukan hanya satu.

Kapasitas hanya disediakan untuk satu peristiwa penskalaan. Jika Anda meningkatkan skala dan menggunakan kapasitas, lalu menurunkan skalanya, kapasitas tersebut tidak akan tersedia lagi untuk peristiwa peningkatan skala lainnya. Jika Anda mengantisipasi beberapa peristiwa peningkatan dan penurunan skala, gunakan metode pencadangan kapasitas yang konsisten dan sesuaikan ukuran cadangan sesuai kebutuhan. Misalnya, membuat permintaan Pod lebih besar sebelum peristiwa, dan lebih rendah atau nol setelahnya.

Memilih prioritas

Tetapkan prioritas di PriorityClasses ke kurang dari 0.

Anda dapat menentukan beberapa PriorityClasses di cluster Anda untuk digunakan dengan workload yang memiliki persyaratan berbeda. Misalnya, Anda dapat membuat PriorityClass dengan prioritas -10 untuk penyediaan kapasitas sekali pakai dan PriorityClass dengan prioritas -9 untuk penyediaan kapasitas yang konsisten. Anda kemudian dapat menyediakan kapasitas yang konsisten menggunakan PriorityClass dengan prioritas -9 dan, jika menginginkan kapasitas lebih untuk peristiwa khusus, Anda dapat men-deploy Job baru yang menggunakan PriorityClass dengan prioritas -10. GKE mengeluarkan workload prioritas berprioritas paling rendah terlebih dahulu.

Anda juga dapat menggunakan PriorityClass lain untuk menjalankan workload non-produksi prioritas rendah yang melakukan tugas aktual, seperti workload batch fault-tolerant, dengan prioritas lebih rendah dari workload produksi Anda tetapi lebih tinggi daripada Pod placeholder Anda. Misalnya -5.

Memilih ukuran kapasitas

Tetapkan jumlah replika dan permintaan resource dari workload placeholder Anda ke lebih dari atau sama dengan kapasitas yang mungkin diperlukan workload produksi Anda saat meningkatkan skala.

Total kapasitas yang disediakan didasarkan pada jumlah Pod placeholder yang Anda deploy dan permintaan resource dari setiap replika. Jika peningkatan skala Anda memerlukan kapasitas lebih dari GKE yang disediakan untuk Pod placeholder Anda, beberapa workload produksi Anda akan tetap berada di Pending sampai GKE dapat menyediakan kapasitas yang lebih besar.

Langkah selanjutnya