配置 Pod 横向自动扩缩

本文档介绍了如何为集群中运行的现有无状态工作负载设置 Pod 横向自动扩缩。Pod 横向自动扩缩功能会根据实时需求自动调整应用的运行 Pod(副本)数量,在负载降低时移除 Pod,在负载增加时添加 Pod。这种伸缩对于确保应用可用性、高效利用资源以及通过将容量精确匹配到用户流量来节省成本至关重要,而且无需人工干预。随着容器工作负载要求的变化,Pod 自动扩缩功能可让运维人员无需不断监控性能并手动调整 Pod 数量。

本页面适用于管理底层技术基础设施生命周期的管理员、架构师和运维人员。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

扩缩 Deployment

使用 Kubernetes 的伸缩功能来适当伸缩部署中运行的 pod 数量。

自动扩缩部署的 Pod

Kubernetes 提供自动扩缩功能,让您无需在需求变化时手动更新部署。完成以下步骤,以自动扩缩部署的 pod:

  1. 为确保 Pod 横向自动扩缩器能够正确衡量 CPU 百分比,请在部署中设置 CPU 资源请求

  2. 在部署中设置 Pod 横向自动扩缩器:

    kubectl --kubeconfig CLUSTER_KUBECONFIG \
        -n NAMESPACE \
        autoscale deployment DEPLOYMENT_NAME \
        --cpu-percent=CPU_PERCENT \
        --min=MIN_NUMBER_REPLICAS \
        --max=MAX_NUMBER_REPLICAS
    

    替换以下内容:

    • CLUSTER_KUBECONFIG:集群的 kubeconfig 文件。

    • NAMESPACE:命名空间。对于共享集群,这必须是项目命名空间。对于标准集群,它可以是任何命名空间。

    • DEPLOYMENT_NAME:要自动扩缩的部署的名称。

    • CPU_PERCENT:要请求的目标平均 CPU 利用率,以百分比表示,适用于所有 pod。

    • MIN_NUMBER_REPLICAS:自动扩缩器可预配的 pod 数下限。

    • MAX_NUMBER_REPLICAS:自动扩缩器可预配的 Pod 数量上限。

  3. 运行下面的命令,查看 Pod 横向自动扩缩器的当前状态:

    kubectl get hpa
    

    输出类似于以下内容:

    NAME              REFERENCE                          TARGET    MINPODS   MAXPODS   REPLICAS   AGE
    DEPLOYMENT_NAME   Deployment/DEPLOYMENT_NAME/scale   0% / 50%  1         10        1          18s
    

手动扩缩部署的 Pod

如果您希望手动扩缩部署,请运行:

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    -n NAMESPACE \
    scale deployment DEPLOYMENT_NAME \
    --replicas NUMBER_OF_REPLICAS

替换以下内容:

  • CLUSTER_KUBECONFIG:集群的 kubeconfig 文件。

  • NAMESPACE:命名空间。对于共享集群,这必须是项目命名空间。对于标准集群,它可以是任何命名空间。

  • DEPLOYMENT_NAME:要自动扩缩的部署的名称。

  • DEPLOYMENT_NAME:部署中的复制 Pod 对象数。

使用 Prometheus 中的自定义指标进行自动扩缩

默认情况下,Pod 横向自动扩缩使用 CPU 和内存利用率等标准资源指标。标准指标适用于一般伸缩,但对于专门的应用负载来说并不实用。

将 Pod 横向自动扩缩与 Prometheus 中的自定义指标搭配使用时,您可以根据特定于应用的指标(例如 HTTP 请求速率、队列深度和处理延迟时间)来扩缩工作负载。通过利用 Prometheus 监控堆栈已收集的丰富数据,您的集群可以更准确地响应实际需求。

将 Prometheus 与 Pod 横向自动扩缩搭配使用的前提条件

启用此功能之前,必须满足以下条件:

  • 现有 Prometheus 服务器:必须已部署 Prometheus 服务器,并且该服务器可从集群内部通过网络访问(HPA 控制器本身不管理 Prometheus 实例)。如需了解详情,请参阅如何在 Kubernetes 中部署和配置 Prometheus Operator

  • 管理权限:您必须拥有修改集群自定义资源所需的权限。

  • 无 API 冲突:预检检查会验证是否没有其他组件已为 custom.metrics.k8s.io 注册 APIService。如果存在冲突,则无法启用适配器。

启用和配置 Prometheus

该流程涉及定义指标规则和更新集群配置:

  1. 创建一个或多个指标规则 ConfigMap。

    在目标集群命名空间内的一个或多个 ConfigMap 中,为自定义指标定义基于 PromQL 的规则。控制器会监控这些 ConfigMap,合并它们,并自动将它们应用于适配器。

    如需详细了解如何定义规则,请参阅 kubernetes-sigs/prometheus-adapter 中的指标发现和呈现配置

    以下示例展示了一个 ConfigMap,其中在 data 字段中为 http_requests_per_second 定义了规则:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-app-rules
      namespace: <cluster-namespace>
    data:
      config.yaml: |
        rules:
        - seriesQuery: 'http_requests_total'
          resources:
            overrides:
              namespace_name: {resource: "namespace"}
              pod_name: {resource: "pod"}
          name:
            matches: "^(.*)_total$"
            as: "${1}_per_second"
          metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>)'
    
  2. 如果您的 Prometheus 服务器需要身份验证(例如双向传输层安全协议 [mTLS]),请创建包含必要凭据的 kubeconfig 格式的 Kubernetes Secret。

    以下示例展示了支持基本身份验证的 Secret:

    apiVersion: v1
    kind: Secret
    metadata:
      name: prometheus-auth-secret
      namespace: <cluster-namespace>
      annotations:
        baremetal.cluster.gke.io/mark-source: "true"
    type: Opaque
    stringData:
      config: authentication-credentials
    
  3. 更新 Cluster 自定义资源:

    1. 向 Cluster 自定义资源的 metadata 添加 preview.baremetal.cluster.gke.io/metrics-adapter: "true" 注解。

    2. 添加 spec.metricsAdapter 部分以定义 Prometheus 网址并引用您的规则 ConfigMap。

      apiVersion: baremetal.cluster.gke.io/v1
      kind: Cluster
      metadata:
        name: <cluster-name>
        namespace: <cluster-namespace>
        annotations:
          preview.baremetal.cluster.gke.io/metrics-adapter: "true"
      spec:
        # ... other existing cluster configurations ...
        metricsAdapter:
          prometheus:
            url: "http://prometheus-k8s.monitoring.svc.cluster.local:9090"
            orgID: "production-environment"
            auth:
              configSecretRef:
                name: prometheus-auth-secret
                key: config # This is the key within the Secret's 'data' field
          rules:
            configMapKeyRefs:
              - name: my-app-rules
                key: config.yaml # This is the key within the ConfigMap's 'data' field
              # - name: base-system-rules
              #   key: config.yaml
      

      如果您的 Prometheus 实例不需要身份验证,则可以从集群规范中省略 metricsAdapter.prometheus.auth 部分。

  4. 应用更新后的集群自定义资源。

    控制器会自动将 Prometheus 适配器部署到 kube-system 命名空间。

  5. 通过创建 HorizontalPodAutoscaler 资源,将自定义指标用于 Pod 横向自动扩缩,该资源以 ConfigMap rules 字段中定义的自定义指标为目标。

    上一步中的 ConfigMap 示例定义了一个 http_requests_per_second 自定义指标。如需使用此指标,HorizontalPodAutoscaler 资源应类似于以下示例:

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: <name>
      namespace: <namespace>
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: <workload-name>
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Pods
        pods:
          metric:
            name: http_requests_per_second
          target:
            type: AverageValue
            averageValue: 10
    

停用 Prometheus

如需停用将 Prometheus 与 Pod 横向自动扩缩功能搭配使用,请从 Cluster 自定义资源中移除 spec.metricsAdapter 部分。