借助 Pod 横向自动扩缩功能,您可以根据实时需求自动调整集群中现有无状态工作负载的运行 Pod 数量。自动扩缩器会在负载增加时添加 Pod,并在需求下降时移除 Pod,这有助于您在无需人工干预的情况下保持应用可用性、高效利用资源并控制成本。您可以根据标准资源指标(例如 CPU 利用率)或 Prometheus 中的自定义应用指标(例如 HTTP 请求速率)进行扩缩。
扩缩 Deployment
使用 Kubernetes 的伸缩功能适当伸缩部署中运行的 Pod 数量。
自动扩缩 Deployment 的 Pod
Kubernetes 提供自动扩缩功能,让您无需在需求发生变化时手动更新部署。完成以下步骤,以自动扩缩部署的 Pod:
为确保 Pod 横向自动扩缩器能够正确测量 CPU 百分比,请在 Deployment 中设置 CPU 资源请求。
在 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 数量上限。
查看 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
该过程涉及定义指标规则和更新集群配置:
创建一个或多个指标规则 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>>)'如果您的 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更新集群自定义资源:
将
preview.baremetal.cluster.gke.io/metrics-adapter: "true"注解添加到集群自定义资源的metadata。添加
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部分。
应用更新后的集群自定义资源。
控制器会自动将 Prometheus 适配器部署到
kube-system命名空间中。通过创建以 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 部分。