运行应用程序的多个实例
目标
- 使用 kubectl 手动扩展现有应用程序。
扩展应用程序
之前我们创建了一个 Deployment,然后通过 Service 将其公开。该 Deployment 只为运行我们的应用程序创建了一个 Pod。当流量增加时,我们需要扩展应用程序以满足用户需求。
如果您还没有完成前面的部分,请从使用 minikube 创建集群开始。
通过更改 Deployment 中副本的数量来实现**扩缩**。
注意
如果您在上一节之后尝试此操作,则您可能已删除创建的服务,或者创建了一个 `type: NodePort` 的服务。在本节中,假设为 kubernetes-bootcamp Deployment 创建了一个 `type: LoadBalancer` 的服务。
如果您**尚未**删除在上一节中创建的服务,请首先删除该服务,然后运行以下命令创建一个新的 `type` 设置为 `LoadBalancer` 的服务
kubectl expose deployment/kubernetes-bootcamp --type="LoadBalancer" --port 8080
扩缩概览
扩展 Deployment 将确保创建新的 Pod 并将其调度到具有可用资源的节点上。扩展会将 Pod 数量增加到新的期望状态。Kubernetes 还支持 Pod 的自动扩缩,但这超出了本教程的范围。扩展到零也是可能的,它将终止指定 Deployment 的所有 Pod。
运行应用程序的多个实例将需要一种方法来将流量分发给所有这些实例。Service 具有集成的负载均衡器,可将网络流量分发给所有公开的 Deployment 的 Pod。Service 将使用端点持续监控正在运行的 Pod,以确保流量仅发送到可用的 Pod。
一旦应用程序运行了多个实例,您就可以在不中断服务的情况下执行滚动更新。我们将在教程的下一节中介绍这一点。现在,让我们转到终端并扩展我们的应用程序。
扩展 Deployment
要列出您的 Deployment,请使用 `get deployments` 子命令
kubectl get deployments
输出应类似于
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1/1 1 1 11m
我们应该有一个 Pod。如果不是,请再次运行该命令。这表明
- **NAME** 列出集群中 Deployment 的名称。
- **READY** 显示 CURRENT/DESIRED 副本的比例
- **UP-TO-DATE** 显示已更新以达到期望状态的副本数量。
- **AVAILABLE** 显示有多少应用程序副本可供您的用户使用。
- **AGE** 显示应用程序已运行的时间量。
要查看 Deployment 创建的 ReplicaSet,请运行
kubectl get rs
请注意,ReplicaSet 的名称始终格式化为
此输出的两个重要列是
- **DESIRED** 显示应用程序的期望副本数量,这是您创建 Deployment 时定义的。这是期望状态。
- **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 service`
kubectl describe services/kubernetes-bootcamp
创建一个名为 NODE_PORT 的环境变量,其值为 Node 端口
export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo NODE_PORT=$NODE_PORT
接下来,我们将对公开的 IP 地址和端口执行 `curl` 命令。多次执行该命令
curl http://"$(minikube ip):$NODE_PORT"
我们每次请求都会访问一个不同的 Pod。这表明负载均衡正在工作。
输出应类似于
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-wp67j | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-hs9dj | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-4hjvf | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-wp67j | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-4hjvf | v=1
注意
如果您正在使用 Docker Desktop 作为容器驱动程序运行 minikube,则需要 minikube 隧道。这是因为 Docker Desktop 中的容器与您的主机计算机是隔离的。
在另一个终端窗口中,执行
minikube service kubernetes-bootcamp --url
输出如下:
http://127.0.0.1:51082
! Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
然后使用给定的 URL 访问应用程序
curl 127.0.0.1:51082
缩减
要将 Deployment 缩减到 2 个副本,请再次运行 `scale` 子命令
kubectl scale deployments/kubernetes-bootcamp --replicas=2
使用 `get deployments` 子命令列出 Deployment 以检查更改是否已应用
kubectl get deployments
副本数量减少到 2。使用 `get pods` 列出 Pod 的数量
kubectl get pods -o wide
这确认有 2 个 Pod 被终止。
下一步
- 教程 执行滚动更新。
- 了解有关 ReplicaSet 的更多信息。
- 了解有关 自动扩缩 的更多信息。