使用外部指标自动扩缩部署

本教程演示如何根据 Stackdriver 中提供的指标自动扩缩 GKE 工作负载。

如果要根据 Kubernetes 工作负载导出的指标或者附加到 Kubernetes 对象(如 Pod 或节点)的指标进行自动扩缩,请访问使用自定义指标自动扩缩部署

此示例演示了如何根据 Cloud Pub/Sub 订阅中未送达消息的数量进行自动扩缩,不过这些说明适用于 Stackdriver 中的任何可用指标。

目标

本教程介绍以下步骤:

  1. 如何部署自定义指标 Stackdriver 适配器。
  2. 如何部署 HorizontalPodAutoscaler (HPA) 资源,以根据另一个 Google Cloud Platform 服务的 Stackdriver 指标扩缩您的 Deployment。

准备工作

请按照以下步骤启用 Kubernetes Engine API:
  1. 访问 Google Cloud Platform Console 中的 Kubernetes Engine 页面
  2. 创建或选择项目。
  3. 稍作等待,让 API 和相关服务完成启用过程。 此过程可能耗时几分钟。
  4. 确保您的 Google Cloud Platform 项目已启用结算功能。

    了解如何启用结算功能

安装本教程中使用的以下命令行工具:

  • gcloud 用于创建和删除 Kubernetes Engine 集群。gcloud 包含在 Google Cloud SDK 中。
  • kubectl 用于管理 Kubernetes(即 Kubernetes Engine 使用的集群编排系统)。您可以使用 gcloud 安装 kubectl
    gcloud components install kubectl

gcloud 命令行工具设置默认值

如需节省您在 gcloud 命令行工具中输入项目 IDCompute Engine 地区选项的时间,您可以设置默认值:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone [COMPUTE_ENGINE_ZONE]

创建集群

创建 GKE 集群,该集群运行 Kubernetes 1.10 或更高版本

部署 Pub/Sub 订阅者应用

如需使用 Cloud Pub/Sub 运行应用,您需要创建 Google Cloud 服务帐号并向应用提供凭据。如需了解详情,请参阅使用服务帐号向 Cloud Platform 验证身份教程。

以下步骤将演示如何自动扩缩在使用服务帐号向 Cloud Platform 验证身份中创建的部署。您应该先完成该教程的第 1 步到第 6 步,然后再继续操作。

第 1 步:部署自定义指标 Stackdriver 适配器

如需向 GKE 对象授予对 Stackdriver 中存储的指标的访问权限,您需要部署自定义指标 Stackdriver 适配器。要运行自定义指标适配器,您必须通过运行以下 Kubernetes 命令向用户授权,使其能够创建所需授权角色:

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

要在集群中部署适配器,请运行以下命令:

kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml

第 2 步:创建 HorizontalPodAutoscaler 对象

部署自定义指标 Stackdriver 适配器后,您可以部署 HorizontalPodAutoscaler 以自动扩缩您的 Deployment。

以下清单文件描述了一个 HorizontalPodAutoscaler 对象,该对象根据 Pub/Sub 订阅中未确认消息的目标数量来扩缩 Deployment。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: pubsub
spec:
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - external:
      metricName: pubsub.googleapis.com|subscription|num_undelivered_messages
      metricSelector:
        matchLabels:
          resource.labels.subscription_id: echo-read
      targetAverageValue: "2"
    type: External
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: pubsub

如需部署此清单,请将它以 hpa.yaml 的形式下载到您的机器上,然后运行以下命令:

kubectl apply -f hpa.yaml

第 3 步:生成负载

本示例中部署的示例应用每隔几秒钟处理一条消息。您可以通过不断发布使消息排队,从而触发自动扩缩。您可以使用以下命令将 200 条消息发布到 Pub/Sub 主题:

for i in {1..200}; do gcloud pubsub topics publish echo --message="Autoscaling #${i}"; done

第 4 步:观察 HPA 如何创建应用的其他副本

您可以通过运行以下命令检查部署的当前副本数:

kubectl get deployment pubsub

您还可以通过运行以下命令检查 HPA 的状态和近期活动:

kubectl describe hpa pubsub
输出:
Name:                                                                                    pubsub
...
Metrics:                                                                                 ( current / target )
"pubsub.googleapis.com|subscription|num_undelivered_messages" (target average value):  2250m / 2
Min replicas:                                                                            1
Max replicas:                                                                            4
Conditions:
Type            Status  Reason            Message
----            ------  ------            -------
AbleToScale     True    SucceededRescale  the HPA controller was able to update the target scale to 4
ScalingActive   True    ValidMetricFound  the HPA was able to successfully calculate a replica count from external metric pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id: echo-read,},MatchExpressions:[],})
ScalingLimited  True    TooManyReplicas   the desired replica count is more than the maximum replica count
Events:
Type    Reason             Age   From                       Message
----    ------             ----  ----                       -------
Normal  SuccessfulRescale  7s    horizontal-pod-autoscaler  New size: 4; reason:
external metric
pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id:
echo-read,},MatchExpressions:[],}) above target

“Metrics”部分提供了 HPA 观察到的指标的最后一个值。分数值用毫单位来表示。例如,在上面的输出中有 4 个应用副本,并且 Pub/Sub 订阅中当前未确认消息的数量是 9。因此,每个副本的平均消息数为 2.25,即 2250m。

“Conditions”部分说明了 HorizontalPodAutoscaler 是否能够执行扩缩。在上面的示例中,ScalingLimited 条件显示副本的数量已达到允许的最大值,HPA 不会再增加该值。

最后,HPA 每次更改应用副本数时都会创建一个事件(请参阅上面输出中的“Events”部分)。在上面的示例中,副本数已更改为 4,因为未确认消息的数量已高于目标值。

使用其他指标

只要 metricTypeINT64DOUBLE,则 Stackdriver 中的任何可用指标都可用于自动扩缩。如需浏览可用指标,您可以使用 Metrics ExplorerGCP 指标列表。对于 GAUGE 种类的指标,使用当前指标值进行自动扩缩。对于 DELTACUMULATIVE 指标,则使用指标率(每秒的指标变化)进行自动扩缩。如需详细了解如何计算指标率,请参阅自定义指标适配器文档

编写外部指标规范

选择要自动扩缩的指标后,您需要为 HorizontalPodAutoscaler 编写外部指标规范。为此,您需要指定三个字段:

  • metricName 是指标的名称。Kubernetes API 不允许在指标名称中使用斜杠,您必须将它们替换为竖线 (|)。请注意本教程是如何将 pubsub.googleapis.com/subscription/num_undelivered_messages 指定为 pubsub.googleapis.com|subscription|num_undelivered_messages 的。
  • metricSelector 是可选字段,用于选择指标的特定时间序列。如果 metricSelector 与多个时间序列匹配,则使用它们的值之和进行自动扩缩。在本教程中,metricSelector 用于限制 HPA 仅将 echo-read 订阅中的消息计算在内。详细了解 Stackdriver 时间序列和标签以及 Kubernetes LabelSelector
  • targetAverageValue 指定每个副本可以处理的指标总值的数量。当使用的指标描述可以在副本之间划分的某些工作或资源(例如,Pub/Sub 消息或 QPS)时,这非常有用。对于其他指标,例如平均请求延迟时间,指定全局目标值更合适。您可以通过指定 targetValue 而不是 targetAverageValue 来实现此目的。

根据多个指标进行自动扩缩

您可以对单个 HorizontalPodAutoscaler 使用多个指标,即将外部指标与 [使用自定义指标自动扩缩部署] 中描述的其他指标类型相结合。 为此,请指定您希望在 HPA 对象规范的 metrics 列表中用作单独条目的每个指标。HPA 将根据每个指标计算副本数量并选择最多的一个。

清理

为避免因本教程中使用的资源导致您的 Google Cloud Platform 帐号产生费用,请执行以下操作:

  1. 清理 Pub/Sub 订阅和主题:

    gcloud pubsub subscriptions delete echo-read
    gcloud pubsub topics delete echo
  2. 通过运行以下命令删除 GKE 集群:

    gcloud container clusters delete [CLUSTER_NAME]

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Kubernetes Engine 教程