运行应用程序的多个实例

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

目标

  • 用 kubectl 扩缩应用程序

扩缩应用程序

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

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

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

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

小结:

  • 扩缩一个 Deployment

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

扩缩概述

运行应用程序的多个实例 - 图1

运行应用程序的多个实例 - 图2

Previous Next

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

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

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

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

扩容 Deployment

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

**kubectl get deployments**

输出应该类似于:

  1. NAME READY UP-TO-DATE AVAILABLE AGE
  2. 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,这证明负载均衡正在工作。

说明:

  1. <p>如果你使用 Docker Desktop 作为容器驱动程序运行 minikube,则需要 minikube 隧道。
  2. 这是因为 Docker Desktop 内的容器与主机隔离。<br>
  3. <p>在单独的终端窗口中,执行:<br>
  4. <code><b>minikube service kubernetes-bootcamp --url</b></code></p>
  5. <!--
  6. <p>The output looks like this:
  7. <pre><b>http://127.0.0.1:51082<br>! Because you are using a Docker driver on darwin, the terminal needs to be open to run it.</b></pre></p>
  8. <p>Then use the given URL to access the app:<br>
  9. <code><b>curl 127.0.0.1:51082</b></code></p>
  10. -->
  11. <p>输出看起来像这样:
  12. <pre><b>http://127.0.0.1:51082<br>! Because you are using a Docker driver on darwin, the terminal needs to be open to run it.</b></pre></p>
  13. <p>然后使用给定的 URL 访问应用程序:
  14. <code><b>curl 127.0.0.1:51082</b></code></p>

缩容

要将 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 被终止。

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