运行应用的多个实例
目标
- 使用 kubectl 手动扩缩现有应用。
扩缩应用
之前我们创建了一个 Deployment,然后通过一个 Service 公开暴露它。该 Deployment 只创建了一个 Pod 来运行我们的应用。当流量增加时,我们需要扩缩应用以满足用户需求。
如果你还没有完成前面的章节,请从 使用 minikube 创建集群 开始。
通过改变 Deployment 中的副本数量来实现扩缩。
注意
如果你在完成上一节后尝试此操作,你可能已删除了创建的服务,或创建了一个 type: NodePort
类型的 Service。本节假设已为 kubernetes-bootcamp Deployment 创建了一个 type: LoadBalancer
类型的服务。
如果你尚未删除上一节中创建的 Service,请先删除该 Service,然后运行以下命令创建一个 type
设置为 LoadBalancer
的新 Service
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
我们应该有 1 个 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 tunnel。这是因为 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 的信息。
- 了解更多关于 自动扩缩 的信息。