Mengoptimalkan penskalaan otomatis Pod berdasarkan metrik

Tutorial ini menunjukkan cara menskalakan workload Google Kubernetes Engine (GKE) secara otomatis berdasarkan metrik yang tersedia di Cloud Monitoring.

Dalam tutorial ini, Anda dapat menyiapkan penskalaan otomatis berdasarkan salah satu metrik berikut ini:

Pub/Sub

Backlog Pub/Sub

Skala didasarkan pada metrik eksternal yang melaporkan jumlah pesan yang tidak dikonfirmasi yang tersisa dalam langganan Pub/Sub. Hal ini dapat mengurangi latensi secara efektif sebelum menjadi masalah, tetapi mungkin akan menggunakan resource relatif lebih banyak daripada penskalaan otomatis berdasarkan pemakaian CPU.

Metrik Kustom

Metrik Prometheus Kustom

Skalakan berdasarkan metrik kustom yang ditentukan pengguna dan diekspor dalam format Prometheus melalui Google Managed Prometheus. Metrik Prometheus Anda harus berjenis Gauge.

Pada dasarnya, penskalaan otomatis adalah menemukan keseimbangan yang dapat diterima antara biaya dan latensi. Anda dapat bereksperimen dengan kombinasi metrik ini dan lainnya untuk menemukan kebijakan yang cocok bagi Anda.

Men-deploy Adaptor Metrik Kustom

Dengan Adaptor Metrik Kustom, cluster Anda dapat mengirim dan menerima metrik dengan Cloud Monitoring.

Pub/Sub

Prosedur untuk menginstal Adaptor Metrik Kustom berbeda untuk cluster dengan Workload Identity Federation untuk GKE diaktifkan atau tidak diaktifkan. Pilih opsi yang cocok dengan penyiapan yang Anda pilih saat membuat cluster.

Workload Identity

Beri pengguna kemampuan untuk membuat peran otorisasi yang diperlukan:

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

Deploy adaptor metrik kustom di cluster Anda:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml

Adaptor menggunakan akun layanan Kubernetes custom-metrics-stackdriver-adapter di namespace custom-metrics. Izinkan akun layanan ini untuk membaca metrik Cloud Monitoring dengan menetapkan peran Monitoring Viewer:

gcloud projects add-iam-policy-binding projects/$PROJECT_ID \
  --role roles/monitoring.viewer \
  --member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/custom-metrics/sa/custom-metrics-stackdriver-adapter

Autentikasi Lama

Beri pengguna kemampuan untuk membuat peran otorisasi yang diperlukan:

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

Deploy adaptor metrik kustom di cluster Anda:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml

Metrik Kustom

Prosedur untuk menginstal Adaptor Metrik Kustom berbeda untuk cluster dengan Workload Identity Federation untuk GKE diaktifkan atau tidak diaktifkan. Pilih opsi yang cocok dengan penyiapan yang Anda pilih saat membuat cluster.

Workload Identity

Beri pengguna kemampuan untuk membuat peran otorisasi yang diperlukan:

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

Deploy adaptor metrik kustom di cluster Anda:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml

Adaptor menggunakan akun layanan Kubernetes custom-metrics-stackdriver-adapter di namespace custom-metrics. Izinkan akun layanan ini untuk membaca metrik Cloud Monitoring dengan menetapkan peran Monitoring Viewer:

gcloud projects add-iam-policy-binding projects/$PROJECT_ID \
  --role roles/monitoring.viewer \
  --member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/custom-metrics/sa/custom-metrics-stackdriver-adapter

Autentikasi Lama

Beri pengguna kemampuan untuk membuat peran otorisasi yang diperlukan:

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

Deploy adaptor metrik kustom di cluster Anda:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml

Men-deploy aplikasi dengan metrik

Download repositori yang berisi kode aplikasi untuk tutorial ini:

Pub/Sub

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/databases/cloud-pubsub

Metrik Kustom

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/observability/custom-metrics-autoscaling/google-managed-prometheus

Repositori berisi kode yang mengekspor metrik ke Cloud Monitoring:

Pub/Sub

Aplikasi ini melakukan polling langganan Pub/Sub untuk menemukan pesan baru, yang mengonfirmasi saat pesan tersebut masuk. Metrik langganan Pub/Sub dikumpulkan secara otomatis oleh Cloud Monitoring.

from google import auth
from google.cloud import pubsub_v1


def main():
    """Continuously pull messages from subsciption"""

    # read default project ID
    _, project_id = auth.default()
    subscription_id = 'echo-read'

    subscriber = pubsub_v1.SubscriberClient()
    subscription_path = subscriber.subscription_path(
        project_id, subscription_id)

    def callback(message: pubsub_v1.subscriber.message.Message) -> None:
        """Process received message"""
        print(f"Received message: ID={message.message_id} Data={message.data}")
        print(f"[{datetime.datetime.now()}] Processing: {message.message_id}")
        time.sleep(3)
        print(f"[{datetime.datetime.now()}] Processed: {message.message_id}")
        message.ack()

    streaming_pull_future = subscriber.subscribe(
        subscription_path, callback=callback)
    print(f"Pulling messages from {subscription_path}...")

    with subscriber:
        try:
            streaming_pull_future.result()
        except Exception as e:
            print(e)

Metrik Kustom

Aplikasi ini merespons permintaan web apa pun ke jalur /metrics dengan metrik nilai konstanta menggunakan format Prometheus.

metric := prometheus.NewGauge(
	prometheus.GaugeOpts{
		Name: *metricName,
		Help: "Custom metric",
	},
)
prometheus.MustRegister(metric)
metric.Set(float64(*metricValue))

http.Handle("/metrics", promhttp.Handler())
log.Printf("Starting to listen on :%d", *port)
err := http.ListenAndServe(fmt.Sprintf(":%d", *port), nil)

Repositori ini juga berisi manifes Kubernetes untuk men-deploy aplikasi ke cluster Anda. Deployment adalah objek Kubernetes API yang memungkinkan Anda menjalankan beberapa replika Pod yang didistribusikan di antara node dalam cluster.:

Pub/Sub

Manifes berbeda untuk cluster dengan Workload Identity Federation untuk GKE diaktifkan atau tidak diaktifkan. Pilih opsi yang cocok dengan penyiapan yang dipilih saat Anda membuat cluster.

Workload Identity

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub
spec:
  selector:
    matchLabels:
      app: pubsub
  template:
    metadata:
      labels:
        app: pubsub
    spec:
      serviceAccountName: pubsub-sa
      containers:
      - name: subscriber
        image: us-docker.pkg.dev/google-samples/containers/gke/pubsub-sample:v2

Autentikasi lama

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub
spec:
  selector:
    matchLabels:
      app: pubsub
  template:
    metadata:
      labels:
        app: pubsub
    spec:
      volumes:
      - name: google-cloud-key
        secret:
          secretName: pubsub-key
      containers:
      - name: subscriber
        image: us-docker.pkg.dev/google-samples/containers/gke/pubsub-sample:v2
        volumeMounts:
        - name: google-cloud-key
          mountPath: /var/secrets/google
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/secrets/google/key.json

Metrik Kustom

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: custom-metrics-gmp
  name: custom-metrics-gmp
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: custom-metrics-gmp
  template:
    metadata:
      labels:
        run: custom-metrics-gmp
    spec:
      containers:
      # sample container generating custom metrics
      - name: prometheus-dummy-exporter
        image: us-docker.pkg.dev/google-samples/containers/gke/prometheus-dummy-exporter:v0.2.0
        command: ["./prometheus-dummy-exporter"]
        args:
        - --metric-name=custom_prometheus
        - --metric-value=40
        - --port=8080

Dengan resource PodMonitoring, Google Cloud Managed Service for Prometheus mengekspor metrik Prometheus ke Cloud Monitoring:

apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
  name: "custom-metrics-exporter"
spec:
  selector:
    matchLabels:
      run: custom-metrics-gmp
  endpoints:
  - port: 8080
    path: /metrics
    interval: 15s

Mulai dari GKE Standard versi 1.27 atau GKE Autopilot versi 1.25, Google Cloud Managed Service for Prometheus diaktifkan. Untuk mengaktifkan Google Cloud Managed Service for Prometheus di cluster pada versi sebelumnya, lihat Mengaktifkan pengumpulan terkelola.

Deploy aplikasi ke cluster Anda:

Pub/Sub

Prosedur untuk men-deploy aplikasi berbeda untuk cluster dengan Workload Identity Federation untuk GKE diaktifkan atau tidak diaktifkan. Pilih opsi yang cocok dengan penyiapan yang Anda pilih saat membuat cluster.

Workload Identity

  1. Aktifkan Pub/Sub API di project Anda:

    gcloud services enable cloudresourcemanager.googleapis.com pubsub.googleapis.com
    
  2. Buat topik dan langganan Pub/Sub:

    gcloud pubsub topics create echo
    gcloud pubsub subscriptions create echo-read --topic=echo
    
  3. Deploy aplikasi ke cluster Anda:

    kubectl apply -f deployment/pubsub-with-workload-identity.yaml
    
  4. Aplikasi ini menentukan akun layanan Kubernetes pubsub-sa. Tetapkan peran pelanggan Pub/Sub sehingga aplikasi dapat memublikasikan pesan ke topik Pub/Sub.

    gcloud projects add-iam-policy-binding projects/$PROJECT_ID \
      --role=roles/pubsub.subscriber \
      --member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/default/sa/pubsub-sa
    

    Perintah sebelumnya menggunakan Principal Identifier, yang memungkinkan IAM merujuk langsung ke akun layanan Kubernetes.

    Praktik terbaik:

    Gunakan Principal identifier, tetapi pertimbangkan batasan dalam deskripsi metode alternatif.

Autentikasi lama

  1. Aktifkan Pub/Sub API di project Anda:

    gcloud services enable cloudresourcemanager.googleapis.com pubsub.googleapis.com
    
  2. Buat topik dan langganan Pub/Sub:

    gcloud pubsub topics create echo
    gcloud pubsub subscriptions create echo-read --topic=echo
    
  3. Buat akun layanan dengan akses ke Pub/Sub:

    gcloud iam service-accounts create autoscaling-pubsub-sa
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member "serviceAccount:autoscaling-pubsub-sa@$PROJECT_ID.iam.gserviceaccount.com" \
      --role "roles/pubsub.subscriber"
    
  4. Download file kunci akun layanan:

    gcloud iam service-accounts keys create key.json \
      --iam-account autoscaling-pubsub-sa@$PROJECT_ID.iam.gserviceaccount.com
    
  5. Impor kunci akun layanan ke cluster Anda sebagai Secret:

    kubectl create secret generic pubsub-key --from-file=key.json=./key.json
    
  6. Deploy aplikasi ke cluster Anda:

    kubectl apply -f deployment/pubsub-with-secret.yaml
    

Metrik Kustom

kubectl apply -f custom-metrics-gmp.yaml

Setelah menunggu beberapa saat hingga aplikasi di-deploy, semua Pod mencapai status Ready:

Pub/Sub

kubectl get pods

Output:

NAME                     READY   STATUS    RESTARTS   AGE
pubsub-8cd995d7c-bdhqz   1/1     Running   0          58s

Metrik Kustom

kubectl get pods

Output:

NAME                                  READY   STATUS    RESTARTS   AGE
custom-metrics-gmp-865dffdff9-x2cg9   1/1     Running   0          49s

Melihat metrik di Cloud Monitoring

Saat berjalan, aplikasi Anda akan menulis metrik ke Cloud Monitoring.

Untuk melihat metrik untuk resource yang dimonitor menggunakan Metrics Explorer, lakukan langkah berikut:

  1. Di konsol Google Cloud , buka halaman  Metrics explorer:

    Buka Metrics explorer

    Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Monitoring.

  2. Pada elemen Metric, luaskan menu Select a metric, lalu pilih jenis resource dan jenis metrik. Misalnya, untuk membuat diagram penggunaan CPU virtual machine, lakukan tindakan berikut:
    1. (Opsional) Untuk mengurangi opsi menu, masukkan bagian nama metrik dalam Filter bar. Untuk contoh ini, masukkan utilization.
    2. Di menu Active resources, pilih VM instance.
    3. Di menu Active metric category, pilih Instance.
    4. Di menu Active metrics, pilih CPU utilization, lalu klik Apply.
  3. Untuk memfilter deret waktu yang ditampilkan, gunakan elemen Filter.

  4. Untuk menggabungkan deret waktu, gunakan menu pada elemen Aggregation. Misalnya, untuk menampilkan pemakaian CPU untuk VM Anda, berdasarkan zonanya, tetapkan menu pertama ke Mean dan menu kedua ke zone.

    Semua deret waktu akan ditampilkan saat menu pertama elemen Aggregation ditetapkan ke Unaggregated. Setelan default untuk elemen Aggregation ditentukan oleh jenis metrik yang Anda pilih.

Jenis dan metrik resource adalah sebagai berikut:

Pub/Sub

Metrics Explorer

Jenis resource: pubsub_subscription

Metrik: pubsub.googleapis.com/subscription/num_undelivered_messages

Metrik Kustom

Metrics Explorer

Jenis resource: prometheus_target

Metrik: prometheus.googleapis.com/custom_prometheus/gauge

Bergantung pada metriknya, Anda mungkin belum melihat banyak aktivitas di Metrics Explorer Cloud Monitoring. Jangan heran jika metrik Anda tidak diperbarui.

Membuat objek HorizontalPodAutoscaler

Saat melihat metrik di Cloud Monitoring, Anda dapat men-deploy HorizontalPodAutoscaler untuk mengubah ukuran Deployment berdasarkan metrik.

Pub/Sub

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: pubsub
spec:
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - external:
      metric:
       name: pubsub.googleapis.com|subscription|num_undelivered_messages
       selector:
         matchLabels:
           resource.labels.subscription_id: echo-read
      target:
        type: AverageValue
        averageValue: 2
    type: External
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: pubsub

Metrik Kustom

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: custom-metrics-gmp-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: custom-metrics-gmp
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Pods
    pods:
      metric:
        name: prometheus.googleapis.com|custom_prometheus|gauge
      target:
        type: AverageValue
        averageValue: 20

Deploy HorizontalPodAutoscaler ke cluster Anda:

Pub/Sub

kubectl apply -f deployment/pubsub-hpa.yaml

Metrik Kustom

kubectl apply -f custom-metrics-gmp-hpa.yaml

Membuat beban

Untuk beberapa metrik, Anda mungkin perlu membuat beban agar dapat melihat penskalaan otomatis:

Pub/Sub

Publikasikan 200 pesan ke topik Pub/Sub:

for i in {1..200}; do gcloud pubsub topics publish echo --message="Autoscaling #${i}"; done

Metrik Kustom

Tidak Berlaku: Kode yang digunakan dalam contoh ini mengekspor nilai konstanta 40 untuk metrik kustom. HorizontalPodAutoscaler disetel dengan nilai target 20 sehingga akan mencoba meningkatkan skala Deployment secara otomatis.

Anda mungkin perlu menunggu beberapa menit hingga HorizontalPodAutoscaler merespons perubahan metrik.

Mengamati peningkatan skala HorizontalPodAutoscaler

Anda dapat memeriksa jumlah replika Deployment saat ini dengan menjalankan:

kubectl get deployments

Setelah memberikan beberapa waktu agar metrik menyebar, Deployment akan membuat lima Pod untuk menangani backlog.

Anda juga dapat memeriksa status dan aktivitas terbaru HorizontalPodAutoscaler dengan menjalankan:

kubectl describe hpa