配置 Pod 横向自动扩缩

借助 Pod 横向自动扩缩功能,您可以根据实时需求自动调整集群中现有无状态工作负载的运行 Pod 数量。自动扩缩器会在负载增加时添加 Pod,并在需求下降时移除 Pod,这有助于您在无需人工干预的情况下保持应用可用性、高效利用资源并控制成本。您可以根据标准资源指标(例如 CPU 利用率)或 Prometheus 中的自定义应用指标(例如 HTTP 请求速率)进行扩缩。

扩缩 Deployment

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

自动扩缩 Deployment 的 Pod

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

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

  2. 在 Deployment 中设置 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:所有 Pod 的目标平均 CPU 利用率(以百分比表示)。

    • 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
    

手动扩缩 Deployment 的 Pod

如果您希望手动扩缩 Deployment,请运行以下命令:

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. 更新集群自定义资源:

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

    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. 通过创建以 ConfigMaps rules 字段中定义的自定义指标为目标的 HorizontalPodAutoscaler 资源,在 Pod 横向自动扩缩中使用自定义指标。

    前面步骤中的 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 部分。