Information in this document may be out of date

This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Running Multiple Instances of Your App

运行应用程序的多个实例

使用 kubectl 扩缩现有的应用程序

目标

  • 用 kubectl 扩缩应用程序

扩缩应用程序

之前我们创建了一个 Deployment, 然后通过 Service 让其可以公开访问。 Deployment 仅创建了一个 Pod 用于运行这个应用程序。当流量增加时,我们需要扩容应用程序满足用户需求。

如果你还没有学习过之前的章节, 从 使用 Minikube 创建集群 开始。

扩缩 是通过改变 Deployment 中的副本数量来实现的。

注意 如果你是在 上一节 之后尝试此操作, 你可能需要从 创建一个集群 开始, 因为 Service 可能已被删除。

小结:

  • 扩缩一个 Deployment

通过在使用 kubectl create deployment 命令时设置 --replicas 参数,你可以在启动 Deployment 时创建多个实例。


扩缩概述


对 Deployment 横向扩容将保证新的 Pod 被创建并调度到有可用资源的 Node 上,扩容会将 Pod 数量增加至新的预期状态。 Kubernetes 还支持 Pod 的自动扩缩容, 但这并不在本教程的讨论范围内。 将 Pods 数量收缩到 0 也是可以的,这会终止指定 Deployment 上所有的 Pod。

运行应用程序的多个实例,需要有方法在它们之间分配流量。Service 有一个集成的负载均衡器, 将网络流量分配到一个可公开访问的 Deployment 的所有 Pod 上。 服务将会一直通过端点来监视 Pod 的运行,保证流量只分配到可用的 Pod 上。

扩缩是通过改变 Deployment 中的副本数量来实现的。


一旦有了多个应用实例,就可以进行滚动更新而无需停机。我们将会在教程的下一节介绍这些。 现在让我们进入终端,来扩缩我们的应用程序。


扩容 Deployment

要列出你的 Deployment,使用 get deployments 子命令:

kubectl get deployments

输出应该类似于:

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           11m

我们应该有 1 个 Pod。如果没有,请再次运行该命令。结果显示:

  • NAME 列出 Deployment 在集群中的名称。
  • READY 显示当前/预期(CURRENT/DESIRED)副本数的比例/li>
  • UP-TO-DATE 显示为了达到预期状态,而被更新的副本的数量。
  • AVAILABLE 显示应用程序有多少个副本对你的用户可用。
  • AGE 显示应用程序的运行时间。

要查看由 Deployment 创建的 ReplicaSet,运行:

kubectl get rs

注意 ReplicaSet 名称总是遵循 [DEPLOYMENT-NAME]-[RANDOM-STRING] 的格式。 随机字符串是使用 pod-template-hash 作为种子随机生成的。

该输出有两个重要的列是:

  • DESIRED 显示了应用程序的预期副本数量,这是你在创建 Deployment 时定义的。这就是预期状态(desired state)。
  • CURRENT 显示了当前正在运行的副本数量。

接下来,让我们扩容 Deployment 到 4 个副本。 我们将使用 kubectl scale 命令,后面给出 Deployment 类型、名称和预期的实例数量:

kubectl scale deployments/kubernetes-bootcamp --replicas=4

要再次列举出你的 Deployment,使用 get deployments

kubectl get deployments

更改已应用,我们有 4 个应用程序实例可用。接下来,让我们检查 Pod 的数量是否发生变化:

kubectl get pods -o wide

现在有 4 个 Pod,各有不同的 IP 地址。这一变化会记录到 Deployment 的事件日志中。 要检查这一点,请使用 describe 子命令:

kubectl describe deployments/kubernetes-bootcamp

你还可以从该命令的输出中看到,现在有 4 个副本。

负载均衡

让我们来检查 Service 是否在进行流量负载均衡。要查找对外公开的 IP 和端口, 我们可以使用在教程之前部份学到的 describe services

kubectl describe services/kubernetes-bootcamp

export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"

echo NODE_PORT=$NODE_PORT

接下来,我们将使用 curl 访问对外公开的 IP 和端口。多次执行以下命令:

curl http://"$(minikube ip):$NODE_PORT"

我们每个请求都命中了不同的 Pod,这证明负载均衡正在工作。

缩容

要将 Deployment 缩容到 2 个副本,请再次运行 scale 子命令:

kubectl scale deployments/kubernetes-bootcamp --replicas=2

要列举 Deployment 以检查是否应用了更改,使用 get deployments 子命令:

kubectl get deployments

副本数量减少到了 2 个,要列出 Pod 的数量,使用 get pods

kubectl get pods -o wide

这证实了有 2 个 Pod 被终止。

准备好之后,继续学习执行滚动更新

最后修改 December 09, 2023 at 9:18 PM PST: [zh-cn] sync tutorials/* (0f9e2f2569)