扩缩应用

本页面介绍如何扩缩在 Google Kubernetes Engine (GKE) 中部署的应用。

概览

在 GKE 中部署应用时,您可以定义想要运行的应用的副本数您可以通过增加或减少副本数来扩缩应用。

应用的每个副本代表一个 Kubernetes Pod,用于封装应用的容器。

准备工作

在开始之前,请确保您已执行以下任务:

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

  1. 运行 gcloud init 并按照说明操作:

    gcloud init

    如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

    gcloud init --console-only
  2. 按照说明授权 gcloud 使用您的 Google Cloud 帐号。
  3. 创建新配置或选择现有配置。
  4. 选择 Google Cloud 项目。
  5. 为可用区级集群选择默认 Compute Engine 可用区,或为区域级集群或 Autopilot 集群选择区域。

使用 gcloud config

  • 设置默认项目 ID
    gcloud config set project PROJECT_ID
  • 如果您使用的是可用区级集群,请设置默认计算可用区
    gcloud config set compute/zone COMPUTE_ZONE
  • 如果您使用的是 Autopilot 集群或区域级集群,请设置默认计算区域
    gcloud config set compute/region COMPUTE_REGION
  • gcloud 更新到最新版本:
    gcloud components update

检查应用

在扩缩您的应用之前,建议先对应用进行检查并确保其运行状况良好。

如需查看已部署到集群的所有应用,请运行以下命令:

kubectl get CONTROLLER

CONTROLLER 替换为 deploymentsstatefulsets 或其他控制器对象类型。

例如,如果运行 kubectl get deployments 并且只创建了一个 Deployment,那么命令的输出应如下所示:

NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-app                1         1         1            1           10m

对于所有对象,此命令的输出都是类似的,但显示方式可能会略有不同。对于 Deployment,输出将包含六列:

  • NAME 用于列出集群中各 Deployment 的名称。
  • DESIRED 用于显示您在创建 Deployment 时为应用定义的所需副本数或状态
  • CURRENT 用于显示当前正在运行的副本数。
  • UP-TO-DATE 用于显示为实现所需状态而更新的副本数。
  • AVAILABLE 用于显示您的用户可以使用的应用副本数。
  • AGE 用于显示应用已在集群中运行的时间量。

在此示例中,只有一个 Deployment (my-app),并且该部署只有一个副本,因为所需状态是一个副本。您可以在创建时定义所需状态,并且可以随时通过扩缩应用来更改此状态。

检查 StatefulSet

在扩缩 StatefulSet 之前,您应该通过运行以下命令对其进行检查:

kubectl describe statefulset my-app

在此命令的输出中,检查 Pods Status 字段。如果 Failed 值大于 0,则扩缩操作可能会失败。

如果 StatefulSet 看似运行状况不佳,请执行以下操作:

  1. 获取 Pod 列表,看看哪些 Pod 运行状况不佳:

    kubectl get pods
    
  2. 移除运行状况不佳的 Pod:

    kubectl delete POD_NAME
    

如果尝试对运行状况不佳的 StatefulSet 进行扩缩,可能会导致该资源变为不可用。

扩缩应用

以下部分介绍您可以采用的各种应用扩缩方法。kubectl scale 是最快的扩缩方法。但在某些情况下,您可能需要使用其他方法,例如,在更新配置文件或执行就地修改时。

kubectl scale

借助 kubectl scale 命令,您可以立即更改要运行应用的副本数量。

如需使用 kubectl scale,请设置 --replicas 标志以指定新的副本数。例如,如需将 my-app 扩容到四个副本,请运行以下命令,将 CONTROLLER 替换为 deploymentstatefulset 或其他控制器对象类型:

kubectl scale CONTROLLER my-app --replicas 4

如果此命令成功执行,其输出应类似于 deployment "my-app" scaled

然后运行:

kubectl get CONTROLLER my-app

输出应类似如下所示:

NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-app                4         4         4            4           15m

kubectl apply

您可以使用 kubectl apply 将新配置文件应用到现有控制器对象。kubectl apply 有助于对资源进行多项更改,并且有助于用户在配置文件中管理其资源。

要使用 kubectl apply 实现扩缩,所提供配置文件应在对象规范的 replicas 字段中添加新的副本数。

以下是示例 my-app 对象的配置文件的更新版本。该示例显示了一个 Deployment,因此,如果您使用其他类型的控制器(例如 StatefulSet),请相应地更改 kind。此示例最适用于至少具有三个节点的集群。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
      - name: my-container
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0

在此文件中,replicas 字段的值为 3。应用此配置文件时,对象 my-app 会扩展到三个副本。

要应用更新的配置文件,请运行以下命令:

kubectl apply -f config.yaml

然后运行:

kubectl get CONTROLLER my-app

输出应类似如下所示:

NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-app                3         3         3            3           15m

控制台

如需在 Google Cloud Console 中扩缩工作负载,请按以下步骤操作:

  1. 转到 Cloud Console 中的工作负载页面。

    转到“工作负载”

  2. 在工作负载列表中,点击要扩缩的工作负载的名称。

  3. 点击 扩缩,或点击 操作 > 扩缩

  4. 输入工作负载的新副本数量。

  5. 点击扩缩

自动扩缩 Deployment

使用 kubectl autoscale 或 Cloud Console 中的 GKE“工作负载”菜单,您可以根据 Pod 的 CPU 利用率自动扩缩 Deployment。

kubectl autoscale

kubectl autoscale 会创建一个 HorizontalPodAutoscaler(或 HPA)对象,该对象以指定资源为目标(称为扩缩目标)并根据需要进行扩缩。HPA 会定期调整扩缩目标的副本数,以匹配您指定的平均 CPU 利用率。

使用 kubectl autoscale 时,您可以为应用指定最大和最小副本数,以及 CPU 利用率目标。例如,要将最大副本数设置为 6,将最小副本数设置为 4,并将 CPU 利用率目标设置为 50%,请运行以下命令:

kubectl autoscale deployment my-app --max 6 --min 4 --cpu-percent 50

在此命令中,必须使用 --max 标志。--cpu-percent 标志是所有 Pod 的目标 CPU 利用率。除非系统要求,否则此命令不会立即将 Deployment 扩展到六个副本。

运行 kubectl autoscale 之后,系统将创建 HorizontalPodAutoscaler 对象并将应用设为目标。当负载发生变化时,该对象会增加或减少应用的副本。

如需获取集群中 HorizontalPodAutoscaler 对象的列表,请运行以下命令:

kubectl get hpa

要查看集群中的特定 HorizontalPodAutoscaler 对象,请运行以下命令:

kubectl get hpa HPA_NAME

HPA_NAME 替换为您的 HorizontalPodAutoscaler 对象的名称。

要查看 HorizontalPodAutoscaler 配置,请运行以下命令:

kubectl get hpa HPA_NAME -o yaml

此命令的输出类似如下所示:

apiVersion: v1
items:
- apiVersion: autoscaling/v1
  kind: HorizontalPodAutoscaler
  metadata:
    creationTimestamp: ...
    name: HPA_NAME
    namespace: default
    resourceVersion: "664"
    selfLink: ...
    uid: ...
  spec:
    maxReplicas: 10
    minReplicas: 1
    scaleTargetRef:
      apiVersion: apps/v1
      kind: Deployment
      name: HPA_NAME
    targetCPUUtilizationPercentage: 50
  status:
    currentReplicas: 0
    desiredReplicas: 0
kind: List
metadata: {}
resourceVersion: ""
selfLink: ""

在此示例输出中,targetCPUUtilizationPercentage 字段包含从 kubectl autoscale 示例传入的 50 百分比值。

要查看集群中特定 HorizontalPodAutoscaler 对象的详细说明,请运行以下命令:

kubectl describe hpa HPA_NAME

您可以通过使用 kubectl apply 应用新配置文件、使用 kubectl editkubectl patch 修改 HorizontalPodAutoscaler

如需删除 HorizontalPodAutoscaler 对象,请执行以下操作:

kubectl delete hpa HPA_NAME

控制台

要自动扩缩 Deployment,请按以下步骤操作:

  1. 转到 Cloud Console 中的工作负载页面。

    转到“工作负载”

  2. 在工作负载列表中,点击要自动扩缩的 Deployment 的名称。

  3. 点击 操作 > 自动扩缩

  4. 输入 Deployment 的最大副本数以及可选的最小副本数

  5. 自动扩缩指标下,根据需要选择并配置指标。

  6. 点击自动调节

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

您可以根据从 Cloud Monitoring 导出的自定义指标扩缩您的 Deployment。

如需了解如何使用自定义指标自动扩缩 Deployment,请参阅使用自定义指标自动扩缩 Deployment 教程。

后续步骤