目标
- 使用 kubectl 扩展应用。
扩展应用
之前我们创建了一个 Deployment,然后通过一个 Service 将其公开。Deployment 只创建了一个 Pod 来运行我们的应用程序。当流量增加时,我们需要扩展应用程序以满足用户需求。
如果您还没有完成前面的部分,请从 使用 minikube 创建集群 开始。
扩展是通过更改 Deployment 中的副本数来实现的
总结
- 扩展 Deployment
您可以使用 kubectl create deployment 命令的 --replicas 参数,从一开始就创建一个具有多个实例的 Deployment
扩展概述
横向扩展 Deployment 将确保创建新的 Pod 并将其调度到具有可用资源的节点。扩展会将 Pod 的数量增加到新的所需状态。Kubernetes 还支持 Pod 的自动扩展,但它不在本教程的范围之内。也可以扩展到零,这将终止指定 Deployment 的所有 Pod。
运行应用程序的多个实例将需要一种方法来将流量分配给所有这些实例。服务有一个集成的负载均衡器,它会将网络流量分配给已公开的 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 副本的比率
- UP-TO-DATE 显示已更新以达到所需状态的副本数。
- AVAILABLE 显示有多少应用程序副本可供您的用户使用。
- AGE 显示应用程序已运行的时间。
要查看 Deployment 创建的 ReplicaSet,请运行
kubectl get rs
请注意,ReplicaSet 的名称始终格式化为[DEPLOYMENT-NAME]-[随机字符串]。随机字符串是随机生成的,并使用 pod-template-hash 作为种子。
此输出的两个重要列是
- 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的环境变量,其值是节点端口
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。这表明负载均衡正在工作。
输出应类似于
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
子命令列出 Deployments,以检查是否应用了更改
kubectl get deployments
副本数已减少到 2。使用 get pods
列出 Pod 的数量
kubectl get pods -o wide
这证实了 2 个 Pod 已被终止。
准备好后,请继续 执行滚动更新。