Halaman ini menjelaskan cara menggunakan penskalaan otomatis Pod horizontal untuk menskalakan Deployment secara otomatis menggunakan berbagai jenis metrik. Anda dapat menggunakan panduan yang sama
untuk mengonfigurasi HorizontalPodAutoscaler
untuk objek Deployment skalabel apa pun.
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
.
Versi API untuk objek HorizontalPodAutoscaler
Saat Anda menggunakan Konsol Google Cloud, objek HorizontalPodAutoscaler
dibuat menggunakan autoscaling/v2
API.
Saat menggunakan kubectl
untuk membuat atau melihat informasi tentang Horizontal Pod Autoscaler, Anda dapat
menentukan autoscaling/v1
API atau autoscaling/v2
API.
apiVersion: autoscaling/v1
adalah default, dan memungkinkan Anda melakukan penskalaan otomatis hanya berdasarkan pemakaian CPU. Untuk melakukan penskalaan otomatis berdasarkan metrik lain, sebaiknya gunakanapiVersion: autoscaling/v2
. Contoh dalam Membuat contoh Deployment menggunakanapiVersion: autoscaling/v1
.apiVersion: autoscaling/v2
direkomendasikan untuk membuat objekHorizontalPodAutoscaler
baru. Alat ini memungkinkan Anda melakukan penskalaan otomatis berdasarkan beberapa metrik, termasuk metrik kustom atau eksternal. Semua contoh lain dalam topik ini menggunakanapiVersion: autoscaling/v2
.
Untuk memeriksa versi API yang didukung, gunakan perintah
kubectl api-versions
.
Anda dapat menentukan API yang akan digunakan saat
melihat detail tentang Horizontal Pod Autoscaler yang menggunakan apiVersion: autoscaling/v2
.
Membuat contoh Deployment
Sebelum dapat membuat Horizontal Pod Autoscaler, Anda harus membuat workload yang dipantau. Contoh
dalam topik ini menerapkan konfigurasi Horizontal Pod Autoscaler yang berbeda pada Deployment
nginx
berikut. Contoh terpisah menampilkan Horizontal Pod Autoscaler berdasarkan
penggunaan resource, berdasarkan
metrik kustom atau eksternal,
dan berdasarkan beberapa metrik.
Simpan kode berikut ke file bernama nginx.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
resources:
# You must specify requests for CPU to autoscale
# based on CPU utilization
requests:
cpu: "250m"
Manifes ini menentukan nilai untuk permintaan CPU. Jika ingin melakukan penskalaan otomatis berdasarkan penggunaan resource dalam persentase, Anda harus menentukan permintaan untuk resource tersebut. Jika tidak menentukan permintaan, Anda dapat melakukan penskalaan otomatis hanya berdasarkan nilai absolut pemakaian resource, seperti miliCPU untuk pemakaian CPU.
Untuk membuat Deployment, terapkan manifes nginx.yaml
:
kubectl apply -f nginx.yaml
Deployment memiliki spec.replicas
yang ditetapkan ke 3, sehingga tiga Pod di-deploy.
Anda dapat memverifikasi hal ini menggunakan perintah kubectl get deployment nginx
.
Setiap contoh dalam topik ini menerapkan Horizontal Pod Autoscaler yang berbeda pada contoh Deployment nginx.
Penskalaan otomatis berdasarkan penggunaan resource
Contoh ini membuat objek HorizontalPodAutoscaler
untuk menskalakan
Deployment nginx
secara otomatis saat pemakaian CPU
melampaui 50%, dan memastikan selalu ada minimal 1
replika dan maksimum 10 replika.
Anda dapat membuat Horizontal Pod Autoscaler yang menargetkan CPU menggunakan Konsol Google Cloud, perintah kubectl apply
, atau hanya untuk CPU rata-rata, perintah kubectl autoscale
.
Konsol
Buka halaman Workloads di Konsol Google Cloud.
Klik nama Deployment
nginx
.Klik list Tindakan > Skalakan otomatis.
Tentukan nilai berikut:
- Jumlah minimum replika: 1
- Jumlah maksimum replika: 10
- Metrik penskalaan otomatis: CPU
- Target: 50
- Unit: %
Klik Done.
Klik Autoscale.
kubectl apply
Simpan manifes YAML berikut sebagai file bernama nginx-hpa.yaml
:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
Untuk membuat HPA, terapkan manifes menggunakan perintah berikut:
kubectl apply -f nginx-hpa.yaml
kubectl autoscale
Untuk membuat objek HorizontalPodAutoscaler
yang hanya menargetkan pemakaian CPU rata-rata, Anda dapat
menggunakan
perintah
kubectl autoscale
:
kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10
Untuk mendapatkan daftar Horizontal Pod Autoscaler dalam cluster, gunakan perintah berikut:
kubectl get hpa
Outputnya mirip dengan hal berikut ini:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 0%/50% 1 10 3 61s
Untuk mendapatkan detail tentang Horizontal Pod Autoscaler, Anda dapat menggunakan Konsol Google Cloud atau perintah kubectl
.
Konsol
Buka halaman Workloads di Konsol Google Cloud.
Klik nama Deployment
nginx
.Lihat konfigurasi Horizontal Pod Autoscaler di bagian Autoscaler.
Lihat detail selengkapnya tentang peristiwa penskalaan otomatis di tab Events.
kubectl get
Untuk mendapatkan detail tentang Horizontal Pod Autoscaler, Anda dapat menggunakan kubectl get hpa
dengan flag
-o yaml
. Kolom status
berisi informasi tentang jumlah replika saat ini dan peristiwa penskalaan otomatis terbaru.
kubectl get hpa nginx -o yaml
Outputnya mirip dengan hal berikut ini:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
annotations:
autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ScaleDownStabilized","message":"recent
recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ValidMetricFound","message":"the
HPA was able to successfully calculate a replica count from cpu resource utilization
(percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"DesiredWithinRange","message":"the
desired count is within the acceptable range"}]'
autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"},"targetCPUUtilizationPercentage":50}}
creationTimestamp: "2019-10-30T19:42:43Z"
name: nginx
namespace: default
resourceVersion: "220050"
selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx
uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
targetCPUUtilizationPercentage: 50
status:
currentCPUUtilizationPercentage: 0
currentReplicas: 3
desiredReplicas: 3
Sebelum mengikuti contoh yang tersisa dalam topik ini, hapus HPA:
kubectl delete hpa nginx
Saat Anda menghapus Horizontal Pod Autoscaler, jumlah replika Deployment tetap sama. Deployment tidak secara otomatis kembali ke statusnya sebelum Horizontal Pod Autoscaler diterapkan.
Anda dapat mempelajari lebih lanjut cara menghapus Horizontal Pod Autoscaler.
Penskalaan otomatis berdasarkan traffic load balancer
Penskalaan otomatis berbasis traffic adalah kemampuan GKE yang mengintegrasikan sinyal penggunaan traffic dari load balancer untuk menskalakan Pod secara otomatis.
Menggunakan traffic sebagai sinyal penskalaan otomatis mungkin dapat membantu karena traffic merupakan indikator beban utama yang melengkapi CPU dan memori. Integrasi bawaan dengan GKE memastikan bahwa penyiapannya mudah dan penskalaan otomatis bereaksi terhadap lonjakan traffic dengan cepat untuk memenuhi permintaan.
Penskalaan otomatis berbasis traffic diaktifkan oleh Pengontrol gateway dan kemampuan pengelolaan traffic global-nya. Untuk mempelajari lebih lanjut, lihat Penskalaan otomatis berbasis traffic.
Penskalaan otomatis berdasarkan traffic load balancer hanya tersedia untuk Workload gateway.
Persyaratan
Penskalaan otomatis berbasis traffic memiliki persyaratan berikut:
- Didukung di GKE versi 1.24 dan yang lebih baru.
- Gateway API diaktifkan di cluster GKE Anda.
- Didukung untuk traffic yang melewati load balancer yang di-deploy menggunakan Gateway API dan
gke-l7-global-external-managed
,gke-l7-regional-external-managed
,gke-l7-rilb
, ataugke-l7-gxlb
GatewayClass.
Batasan
Penskalaan otomatis berbasis traffic memiliki batasan berikut:
- Tidak didukung oleh GatewayClass multi-cluster
(
gke-l7-global-external-managed-mc
,gke-l7-regional-external-managed-mc
,gke-l7-rilb-mc
, dangke-l7-gxlb-mc
). - Tidak didukung untuk traffic yang menggunakan Service jenis
ClusterIP
atauLoadBalancer
.
Men-deploy penskalaan otomatis berbasis traffic
Latihan berikut menggunakan HorizontalPodAutoscaler
untuk menskalakan Deployment store-autoscale
secara otomatis berdasarkan traffic yang diterima. Gateway menerima traffic masuk dari internet untuk Pod. Autoscaler membandingkan sinyal traffic
dari Gateway dengan
kapasitas traffic per Pod
yang dikonfigurasi pada resource Service store-autoscale
. Dengan menghasilkan
traffic ke Gateway, Anda memengaruhi jumlah Pod yang di-deploy.
Diagram berikut menunjukkan cara kerja penskalaan otomatis berbasis traffic:
Untuk men-deploy penskalaan otomatis berbasis traffic, lakukan langkah berikut:
Untuk cluster Standard, pastikan GatewayClasses diinstal di cluster Anda. Untuk cluster Autopilot, GatewayClasses diinstal secara default.
kubectl get gatewayclass
Output akan mengonfirmasi bahwa resource GKE GatewayClass siap digunakan di cluster Anda:
NAME CONTROLLER ACCEPTED AGE gke-l7-global-external-managed networking.gke.io/gateway True 16h gke-l7-regional-external-managed networking.gke.io/gateway True 16h gke-l7-gxlb networking.gke.io/gateway True 16h gke-l7-rilb networking.gke.io/gateway True 16h
Jika Anda tidak melihat output ini, aktifkan Gateway API di cluster GKE.
Deploy aplikasi contoh dan load balancer Gateway ke cluster Anda:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/master/gateway/docs/store-autoscale.yaml
Aplikasi contoh membuat:
- Deployment dengan 2 replika.
- Kapasitas Service dengan
max-rate-per-endpoint
ditetapkan ke10
. Saat fitur ini berada dalam Pratinjau, gunakan anotasi di Service. Jika fitur ini tersedia secara umum, Kebijakan Service akan menggantikan anotasi. Untuk mempelajari kemampuan Gateway lebih lanjut, lihat Kemampuan GatewayClass. - Gateway eksternal untuk mengakses aplikasi di internet. Untuk mempelajari lebih lanjut cara menggunakan load balancer Gateway, lihat Men-deploy Gateway.
- HTTPRoute yang cocok dengan semua traffic dan mengirimkannya ke
Service
store-autoscale
.
Kapasitas layanan adalah elemen penting saat menggunakan penskalaan otomatis berbasis traffic karena menentukan jumlah traffic per Pod yang memicu peristiwa penskalaan otomatis. Konfigurasi kapasitas Service menggunakan anotasi Service
networking.gke.io/max-rate-per-endpoint
, yang menentukan traffic maksimum yang harus diterima Service dalam permintaan per detik, per Pod. Kapasitas layanan bersifat khusus untuk aplikasi Anda. Untuk mengetahui informasi selengkapnya, lihat Menentukan kapasitas Service.Simpan manifes berikut sebagai
hpa.yaml
:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: store-autoscale spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: store-autoscale minReplicas: 1 maxReplicas: 10 metrics: - type: Object object: describedObject: kind: Service name: store-autoscale metric: name: "autoscaling.googleapis.com|gclb-capacity-utilization" target: averageValue: 70 type: AverageValue
Manifes ini menjelaskan
HorizontalPodAutoscaler
dengan properti berikut:minReplicas
danmaxReplicas
: menetapkan jumlah replika minimum dan maksimum untuk Deployment ini. Dalam konfigurasi ini, jumlah Pod dapat diskalakan dari 1 hingga 10 replika.describedObject.name: store-autoscale
: referensi ke Servicestore-autoscale
yang menentukan kapasitas traffic.scaleTargetRef.name: store-autoscale
: referensi ke Deploymentstore-autoscale
yang menentukan resource yang diskalakan oleh Horizontal Pod Autoscaler.averageValue: 70
: nilai rata-rata target penggunaan kapasitas. Hal ini memberi margin pertumbuhan pada Horizontal Pod Autoscaler sehingga Pod yang berjalan dapat memproses traffic berlebih saat Pod baru sedang dibuat.
Horizontal Pod Autoscaler menghasilkan perilaku traffic berikut:
- Jumlah Pod disesuaikan antara 1 hingga 10 replika untuk mencapai
70% dari tarif maksimum per endpoint. Hal ini akan menghasilkan 7 RPS per Pod saat
max-rate-per-endpoint=10
. - Di atas 7 RPS per pod, skala Pod akan ditingkatkan sampai mencapai maksimum 10 replika atau sampai traffic rata-ratanya adalah 7 RPS per Pod.
- Jika traffic dikurangi, skala Pod akan diturunkan ke kecepatan yang wajar menggunakan algoritma Horizontal Pod Autoscaler.
Anda juga dapat men-deploy generator traffic untuk memvalidasi perilaku penskalaan otomatis berbasis traffic.
Pada 30 RPS, Deployment diskalakan menjadi 5 replika sehingga setiap replika idealnya menerima 6 RPS traffic, yang akan menunjukkan pemanfaatan sebesar 60% per Pod. Jumlah ini berada di bawah target pemanfaatan 70% sehingga Pod diskalakan dengan tepat. Bergantung pada fluktuasi traffic, jumlah replika yang diskalakan otomatis juga mungkin berfluktuasi. Untuk mengetahui deskripsi yang lebih mendetail tentang penghitungan jumlah replika, lihat Perilaku penskalaan otomatis.
Penskalaan otomatis berdasarkan metrik kustom atau eksternal
Guna membuat Horizontal Pod Autoscaler untuk metrik kustom dan metrik eksternal, lihat Mengoptimalkan penskalaan otomatis Pod berdasarkan metrik.
Penskalaan otomatis berdasarkan beberapa metrik
Contoh ini membuat Horizontal Pod Autoscaler yang melakukan penskalaan otomatis berdasarkan penggunaan CPU dan metrik kustom bernama packets_per_second
.
Jika Anda telah mengikuti contoh sebelumnya dan masih memiliki Horizontal Pod Autoscaler bernama nginx
,
hapus sebelum mengikuti contoh ini.
Contoh ini memerlukan apiVersion: autoscaling/v2
. Untuk mengetahui informasi selengkapnya
tentang API yang tersedia, lihat Versi API untuk objek HorizontalPodAutoscaler
.
Simpan manifes YAML ini sebagai file bernama nginx-multiple.yaml
:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 100Mi
# Uncomment these lines if you create the custom packets_per_second metric and
# configure your app to export the metric.
# - type: Pods
# pods:
# metric:
# name: packets_per_second
# target:
# type: AverageValue
# averageValue: 100
Terapkan manifes YAML:
kubectl apply -f nginx-multiple.yaml
Saat dibuat, Horizontal Pod Autoscaler memantau Deployment nginx
untuk mengetahui pemakaian CPU rata-rata,
penggunaan memori rata-rata, dan (jika Anda membatalkan komentar)
metrik packets_per_second
kustom. Horizontal Pod Autoscaler menskalakan Deployment secara otomatis berdasarkan
metrik yang nilainya akan membuat peristiwa penskalaan otomatis yang lebih besar.
Melihat detail tentang Horizontal Pod Autoscaler
Untuk melihat konfigurasi dan statistik Horizontal Pod Autoscaler, gunakan perintah berikut:
kubectl describe hpa HPA_NAME
Ganti HPA_NAME
dengan nama objek HorizontalPodAutoscaler
Anda.
Jika Horizontal Pod Autoscaler menggunakan apiVersion: autoscaling/v2
dan didasarkan pada beberapa
metrik, perintah kubectl describe hpa
hanya menampilkan metrik CPU. Untuk melihat semua metrik, gunakan perintah berikut:
kubectl describe hpa.v2.autoscaling HPA_NAME
Ganti HPA_NAME
dengan nama objek HorizontalPodAutoscaler
Anda.
Setiap status Horizontal Pod Autoscaler saat ini ditampilkan di kolom Conditions
, dan peristiwa penskalaan otomatis
dicantumkan di kolom Events
.
Outputnya mirip dengan hal berikut ini:
Name: nginx
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"autoscaling/v2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp: Tue, 05 May 2020 20:07:11 +0000
Reference: Deployment/nginx
Metrics: ( current / target )
resource memory on pods: 2220032 / 100Mi
resource cpu on pods (as a percentage of request): 0% (0) / 50%
Min replicas: 1
Max replicas: 10
Deployment pods: 1 current / 1 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource
ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
Events: <none>
Menghapus Horizontal Pod Autoscaler
Anda dapat menghapus Horizontal Pod Autoscaler menggunakan Konsol Google Cloud atau perintah kubectl delete
.
Konsol
Untuk menghapus Horizontal Pod Autoscaler nginx
:
Buka halaman Workload di Konsol Google Cloud.
Klik nama Deployment
nginx
.Klik list Tindakan > Skalakan otomatis.
Klik Hapus.
kubectl delete
Untuk menghapus nginx
Horizontal Pod Autoscaler, gunakan perintah berikut:
kubectl delete hpa nginx
Saat Anda menghapus Horizontal Pod Autoscaler, Deployment atau (atau objek deployment lainnya) akan tetap berada dalam skala yang ada, dan tidak kembali ke jumlah replika dalam manifes asli Deployment. Untuk menskalakan Deployment kembali secara manual ke
tiga Pod, Anda dapat menggunakan perintah kubectl scale
:
kubectl scale deployment nginx --replicas=3
Pembersihan
Hapus Horizontal Pod Autoscaler, jika Anda belum melakukannya:
kubectl delete hpa nginx
Hapus Deployment
nginx
:kubectl delete deployment nginx
Jika ingin, hapus cluster.
Pemecahan masalah
Saat menyiapkan Horizontal Pod Autoscaler, Anda mungkin melihat pesan peringatan seperti berikut:
unable to fetch pod metrics for pod
Wajar jika Anda melihat pesan ini saat server metrik mulai dijalankan. Namun, jika Anda terus melihat peringatan dan melihat bahwa Pod tidak diskalakan untuk workload, pastikan Anda telah menentukan permintaan resource untuk setiap container dalam workload. Untuk menggunakan target persentase penggunaan resource dengan penskalaan otomatis Pod horizontal, Anda harus mengonfigurasi permintaan untuk resource tersebut bagi setiap container yang berjalan di setiap Pod dalam workload. Jika tidak, Horizontal Pod Autoscaler tidak dapat melakukan penghitungan yang diperlukan, dan tidak mengambil tindakan terkait metrik tersebut.
Langkah selanjutnya
- Pelajari Penskalaan Otomatis Pod Horizontal lebih lanjut.
- Pelajari Penskalaan Otomatis Pod Vertikal lebih lanjut.
- Pelajari Penskalaan Otomatis Pod Multidimensi lebih lanjut.
- Pelajari penskalaan otomatis Deployment dengan Metrik Kustom lebih lanjut.
- Pelajari cara Menetapkan Resource CPU ke Container dan Pod.
- Pelajari cara Menetapkan Resource Memori ke Container dan Pod.