本文档介绍了如何为集群中运行的现有无状态工作负载设置 Pod 横向自动扩缩。Pod 横向自动扩缩功能会根据实时需求自动调整应用的运行 Pod(副本)数量,在负载降低时移除 Pod,在负载增加时添加 Pod。这种伸缩对于确保应用可用性、高效利用资源以及通过将容量精确匹配到用户流量来节省成本至关重要,而且无需人工干预。随着容器工作负载要求的变化,Pod 自动扩缩功能可让运维人员无需不断监控性能并手动调整 Pod 数量。
本页面适用于管理底层技术基础设施生命周期的管理员、架构师和运维人员。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
扩缩 Deployment
使用 Kubernetes 的伸缩功能来适当伸缩部署中运行的 pod 数量。
自动扩缩部署的 Pod
Kubernetes 提供自动扩缩功能,让您无需在需求变化时手动更新部署。完成以下步骤,以自动扩缩部署的 pod:
为确保 Pod 横向自动扩缩器能够正确衡量 CPU 百分比,请在部署中设置 CPU 资源请求。
在部署中设置 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 数量上限。
运行下面的命令,查看 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
该流程涉及定义指标规则和更新集群配置:
创建一个或多个指标规则 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更新 Cluster 自定义资源:
向 Cluster 自定义资源的
metadata添加preview.baremetal.cluster.gke.io/metrics-adapter: "true"注解。添加
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命名空间。通过创建 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 部分。