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.
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. PriorityClasslow-priority
menggunakanNever
, dan PriorityClassdefault
menggunakanPreemptLowerPriority
.value
: Prioritas untuk Pod yang menggunakan PriorityClass. PriorityClassdefault
menggunakan0
. PriorityClasslow-priority
menggunakan-1
. Di Autopilot, Anda dapat menetapkannya ke nilai apa pun yang kurang dari prioritas PriorityClassdefault
.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. PriorityClasslow-priority
menggunakanfalse
, dan PriorityClassdefault
menggunakantrue
.
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
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
danspec.containers.args
: Memberi tahu Pod untuk tetap aktif sampai dikeluarkan oleh GKE.
Terapkan manifes:
kubectl apply -f capacity-res-deployment.yaml
Dapatkan status Pod:
kubectl get pods -l app=reservation
Tunggu hingga semua replika memiliki status
Running
.
Menggunakan Job untuk penyediaan kapasitas peristiwa tunggal
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
dantemplate.spec.containers.args
: Meminta Job agar tetap aktif selama jangka waktu tertentu, dalam detik, saat Anda memerlukan kapasitas tambahan.
Terapkan manifes:
kubectl apply -f capacity-res-job.yaml
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:
Di terminal Anda, pantau status workload penyediaan kapasitas:
Untuk Deployment, jalankan perintah berikut:
kubectl get pods --label=app=reservation -w
Untuk Job, jalankan perintah berikut:
kubectl get Jobs -w
Buka jendela terminal baru, lalu lakukan hal berikut:
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
Terapkan manifes:
kubectl apply -f test-deployment.yaml
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
- Pelajari cara memisahkan workload Anda satu sama lain
- Pelajari cara mengoptimalkan penskalaan otomatis workload berdasarkan metrik