为 Pod 横向自动扩缩启用用户定义的自定义指标

本主题介绍如何在 Anthos clusters on VMware (GKE On-Prem) 中为 Pod 横向自动扩缩 (HPA) 配置用户定义的指标。

为用户应用启用 Logging 和 Monitoring

Logging 和 Monitoring 的配置保存在名为 stackdriver 的 Stackdriver 对象中。

  1. 打开要修改的 stackdriver 对象:

    kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace kube-system edit stackdriver stackdriver
    

    USER_CLUSTER_KUBECONFIG 替换为用户集群 kubeconfig 文件的路径。

  2. spec 下,将 enableStackdriverForApplicationsenableCustomMetricsAdapter 设置为 true

    apiVersion: addons.gke.io/v1alpha1
    kind: Stackdriver
    metadata:
    name: stackdriver
    namespace: kube-system
    spec:
    projectID: project-id
    clusterName: cluster-name
    clusterLocation: cluster-location
    proxyConfigSecretName: secret-name
    enableStackdriverForApplications: true
    enableCustomMetricsAdapter: true
    scalableMonitoring: true
    enableVPC: stackdriver-enable-VPC
    optimizedMetrics: true
    
  3. 保存并关闭修改后的文件。

完成这些步骤后,所有用户应用日志都会发送到 Cloud Logging。

下一步是为用户应用添加注解以收集指标。

为用户应用添加注解以收集指标

如需为要抓取的用户应用以及发送到 Cloud Monitoring 的日志添加注解,您必须将相应的 annotations 添加到服务、Pod 和端点的元数据中。

  metadata:
    name: "example-monitoring"
    namespace: "default"
    annotations:
      prometheus.io/scrape: "true"
      prometheus.io/path: "" - Overriding metrics path (default "/metrics")
  

部署示例用户应用

在本部分中,您将部署一个包含日志和与 Prometheus 兼容的指标的示例应用。

  1. 将以下 Service 和 Deployment 清单保存到名为 my-app.yaml 的文件中。请注意,Service 具有注释 prometheus.io/scrape: "true"
  kind: Service
  apiVersion: v1
  metadata:
    name: "example-monitoring"
    namespace: "default"
    annotations:
      prometheus.io/scrape: "true"
  spec:
    selector:
      app: "example-monitoring"
    ports:
      - name: http
        port: 9090
  ---
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: "example-monitoring"
    namespace: "default"
    labels:
      app: "example-monitoring"
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: "example-monitoring"
    template:
      metadata:
        labels:
          app: "example-monitoring"
      spec:
        containers:
        - image: gcr.io/google-samples/prometheus-example-exporter:latest
          name: prometheus-example-exporter
          imagePullPolicy: Always
          command:
          - /bin/sh
          - -c
          - ./prometheus-example-exporter --metric-name=example_monitoring_up --metric-value=1 --port=9090
          resources:
            requests:
              cpu: 100m
  1. 创建 Deployment 和 Service:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-app.yaml
    

使用 HPA 中的自定义指标

部署 HPA 对象以使用上一步中公开的指标。如需详细了解不同类型的自定义指标,请参阅针对多个指标和自定义指标的自动扩缩

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

Pod 类型指标具有针对目标 Pod 标签的默认指标选择器,这是 kube-controller-maneger 的工作原理。在此示例中,您可以使用目标 Pod 中提供的 {matchLabels: {app: example-monitoring}} 选择器查询 example_monitoring_up 指标。指定的其他任何选择器都会添加到列表中。如需避免使用默认选择器,您可以移除目标 Pod 上的所有标签或使用“对象类型”指标。

检查 HPA 是否使用了用户定义的应用指标

检查 HPA 是否使用了用户定义的应用指标:

kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG describe hpa example-monitoring-hpa

输出将如下所示:

Name:                             example-monitoring-hpa
Namespace:                        default
Labels:                           
Annotations:                      CreationTimestamp:  Mon, 19 Jul 2021 16:00:40 -0800
Reference:                        Deployment/example-monitoring
Metrics:                          ( current / target )
  "example_monitoring_up" on pods:  1 / 20
Min replicas:                     1
Max replicas:                     5
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 pods metric example_monitoring_up ScalingLimited False DesiredWithinRange the desired count is within the acceptable range

费用

使用 HPA 自定义指标不会产生任何额外费用。用户只需为应用指标和日志付费。如需了解详情,请参阅 Google Cloud 的运维套件价格。用于启用自定义指标的 Pod 会额外占用 15m CPU 和 20 MB 内存。