1 - 运行多实例的应用
教程目标
- 使用 kubectl 手动扩缩现有的应用
扩缩应用
通过在使用 kubectl create deployment
命令时设置 --replicas
参数,
你可以在启动 Deployment 时创建多个实例。
之前我们创建了一个 Deployment, 然后通过 Service 让其可以公开访问。 Deployment 仅创建了一个 Pod 用于运行这个应用。当流量增加时,我们需要扩容应用满足用户需求。
如果你还没有学习过之前的章节, 需要从使用 Minikube 创建集群开始。
扩缩是通过改变 Deployment 中的副本数量来实现的。
说明:
如果你是在上一节之后尝试此操作,
那么你可能已经删除了你创建的服务或已创建了 type: NodePort
类别的 Service。
在本节中,假设你已经为 kubernetes-bootcamp Deployment 创建了 type: LoadBalancer
类别的 Service。
如果你没有删除在前一节中创建的 Service,
请先删除该 Service,然后运行以下命令来创建一个新的 type
设置为 LoadBalancer
的 Service:
kubectl expose deployment/kubernetes-bootcamp --type="LoadBalancer" --port 8080
扩缩概述
扩缩是通过改变 Deployment 中的副本数量来实现的。
对 Deployment 横向扩容将保证新的 Pod 被创建并调度到有可用资源的 Node 上, 扩容会将 Pod 数量增加至新的预期状态。 Kubernetes 还支持 Pod 的自动扩缩容, 但这并不在本教程的讨论范围内。 将 Pods 数量收缩到 0 也是可以的,这会终止指定 Deployment 上所有的 Pod。
运行多实例的应用,需要有方法在多个实例之间分配流量。Service 有一个集成的负载均衡器, 将网络流量分配到一个可公开访问的 Deployment 的所有 Pod 上。 Service 将会通过 Endpoints 来持续监视运行中的 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 显示当前副本数与期望副本数的比例。
- UP-TO-DATE 显示已更新至期望状态的副本数。
- AVAILABLE 显示可用的 Pod 的数量。
- AGE 显示应用已运行的时间。
kubectl get rs
注意 ReplicaSet 名称总是遵循 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 services
:
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
接下来,我们将使用 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
缩容
kubectl scale deployments/kubernetes-bootcamp --replicas=2
要检查更改是否已应用,可使用 get deployments
子命令
kubectl get deployments
副本数量减少到了 2 个,要列出 Pod 的数量,使用 get pods
列举 Pod:
kubectl get pods -o wide
这证实了有 2 个 Pod 被终止。
接下来
- 滚动更新教程。
- 了解更多关于ReplicaSet。
- 了解更多关于自动伸缩。