【问题标题】:Autoscaling Kubernetes based on log based metrics基于基于日志的指标自动缩放 Kubernetes
【发布时间】:2021-10-19 01:31:26
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以发布用于安装 Stackdriver Custom Metrics Adapter 的命令吗?
  • @GariSingh 我已经使用与below 发布的相同步骤部署了 Stackdriver Adapter
  • 我的假设将允许 GKE 从任何地方读取自定义指标,包括 logging.googleapis.com。
  • 一些教程要求执行kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1" | jq,但这只是返回空的resources数组。
  • 我在下面添加了一个答案,其中包含在 Autopilot 集群上部署 Stackdriver Custom Metrics Adapter 所需的步骤。这些步骤来自我写的类似主题的教程。

标签: kubernetes google-kubernetes-engine google-cloud-monitoring horizontal-pod-autoscaling


【解决方案1】:

GKE Autopilot 集群启用了 Workload Identity 以使用其他 GCP 服务,包括 Cloud Monitoring。

您需要按照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 ... 开始的步骤

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

【讨论】:

  • 我有点明白你来自哪里 - 在 kubectl 应用之前我确实跳过了一些步骤。最初它确实引发了一些我的 GCP 管理员能够解决的权限错误。我的假设是仅在不存在某些权限的特定情况下才需要执行步骤。
  • 那么您是说由于缺少某些权限而无法读取指标吗?有没有办法可以调试实际原因?
  • 能够使用上面的链接正确部署适配器,但是由于指标的数据类型,k8s 无法扩展。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 指标已经存在,但是在指定时我遇到了上述错误。我该如何调试它? k8s 可以从 logging.googleapis.com 读取指标吗?
  • 检查您的指标并查看该指标是否在过滤日志 转到 基于日志的指标 页面:在用户定义的指标窗格中,您会看到用户定义的当前 Cloud 项目中基于日志的指标:要查看基于日志的指标中的数据,请单击指标行中的三个点,然后选择在指标资源管理器中查看查看指标的日志.
【解决方案3】:

自定义指标

GitHublink:

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,了解自动扩展工作负载的自定义和外部指标。

【讨论】:

  • 不确定这如何回答我的问题。示例使用custom-metric,我认为这是项目唯一的指标名称?那么我应该在我的情况下使用 celery-person-count 作为指标名称(即使它的实际名称是 logging.googleapis.com/user/celery-person-count)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
相关资源
最近更新 更多