根据基于日志的指标自动缩放 Kubernetes

Autoscaling Kubernetes based on log based metrics

我在 GKE 上使用 Autopilot。我创建了一些基于日志的指标,我想用它们来扩大规模 pods。

首先 - 我不确定这是否是个好主意 - 指标只是数据库中要处理的记录数......我觉得使用日志来扩展应用程序可能会带来一些奇怪的无限循环或东西....

无论如何 - 我尝试输入 logging.googleapis.com|user|celery-person-count 作为外部指标并得到 HPA cannot read metric value。安装了 Stackdriver 适配器,但也不太确定如何使用它。

自定义指标

GitHub link:

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

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

使用指标部署应用程序

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/custom-metrics-autoscaling/direct-to-sd

HPA 示例

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: custom-metric-sd
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: custom-metric-sd
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Pods
    pods:
      metric:
        name: custom-metric
      target:
        type: AverageValue
        averageValue: 20

您可以查看此 link 了解更多信息。

如果您的工作负载 运行 VM 顶部或不在 K8s 上使用外部指标而不是自定义指标。

请参阅 documentation 自动缩放工作负载的自定义和外部指标。

是的,水平 Pod 自动缩放可以使用指标值来完成。如果您的应用程序在 Kubernetes 中是 运行,那么您必须使用自定义指标进行自动缩放,如果您的应用程序在 Kubernetes 中不是 运行,那么您必须使用外部指标进行自动缩放。

可以为以下任意一项选择自定义指标:

  • 特定节点、Pod 或任何类型的任何 Kubernetes 对象, 包括 CustomResourceDefinition (CRD)。

  • 部署中所有 Pods 报告的指标的平均值。

    参考这篇documentation关于使用自定义的详细解释 水平 Pod 自动缩放的指标。

GKE Autopilot 集群已 Workload Identity 启用以使用其他 GCP 服务,包括云监控。

您需要按照步骤 here 才能在 Autopilot 群集上部署自定义指标适配器。

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

kubectl create namespace custom-metrics

kubectl create serviceaccount --namespace custom-metrics \
custom-metrics-stackdriver-adapter

gcloud iam service-accounts create GSA_NAME

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
    --role "roles/monitoring.viewer"

gcloud iam service-accounts add-iam-policy-binding \
  --role roles/iam.workloadIdentityUser \
  --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]" \
  GSA_NAME@PROJECT_ID.iam.gserviceaccount.com

kubectl annotate serviceaccount \
  --namespace custom-metrics custom-metrics-stackdriver-adapter \
  iam.gke.io/gcp-service-account=GSA_NAME@PROJECT_ID.iam.gserviceaccount.com

kubectl apply -f manifests/adapter_new_resource_model.yaml

鉴于您已经部署了适配器,您需要先删除部署,尽管您可能只能运行 从 gcloud iam ... [=14= 开始的步骤]

您需要将 GSA_NAME 替换为您选择的名称,将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。