Kubernetes基础
Scale Your App

Running Multiple Instances of Your App

Objectives

  • Scale an app using kubectl.
  • 使用 kubectl 对应用进行扩缩容。

Scaling an application

此前,我们创建了一个部署(Deployment),然后通过一个服务(Service)将其公开暴露。该部署仅创建了一个用于运行我们应用程序的 Pod。当流量增加时,我们需要对应用程序进行扩展,以满足用户需求。

如果您尚未完成前面的部分,请从“使用 minikube 创建集群”开始。

扩展是通过更改部署中的副本数量来实现的。

⚠️

注意:

如果您在完成上一部分后尝试此操作,您可能已经删除了暴露该部署的服务。在这种情况下,请使用以下命令再次暴露该部署:

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

Scaling overview

扩容一个部署(Deployment)将确保创建新的 Pod 并将其调度到具有可用资源的节点上。扩展操作会将 Pod 的数量增加到新的期望状态。Kubernetes 还支持 Pod 的自动扩展,但这不在本教程的范围内。也可以将规模扩展到零,这将终止指定部署的所有 Pod。

运行应用程序的多个实例需要一种将流量分配到所有实例的方法。服务具有集成的负载均衡器,它会将网络流量分配到已暴露的部署的所有 Pod 中。服务将使用端点持续监控正在运行的 Pod,以确保流量仅发送到可用的 Pod。

通过更改部署中的副本数量来完成扩展。

一旦您运行了应用程序的多个实例,您就能够进行无停机的滚动更新。我们将在本教程的下一部分中介绍这一点。现在,让我们转到终端并扩展我们的应用程序。

Scaling a Deployment

要列出您的部署(Deployments),请使用 get deployments 子命令:

kubectl get deployments

输出应该类似于:

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           11m

我们应该有 1 个 Pod。如果没有,请再次运行该命令。这表明:

  • NAME 列出了集群中部署(Deployments)的名称。
  • READY 显示了当前副本数(CURRENT)与期望副本数(DESIRED)的比例。
  • UP-TO-DATE 显示了为达到期望状态而已更新的副本数量。
  • AVAILABLE 显示了您的用户可使用的应用程序副本数量。
  • AGE 显示了应用程序已运行的时间量。

要查看由部署(Deployment)创建的副本集(ReplicaSet),请运行:

kubectl get rs

请注意,副本集(ReplicaSet)的名称始终格式化为 [部署名称(DEPLOYMENT-NAME)]-[随机字符串(RANDOM-STRING)]。随机字符串是随机生成的,并使用 Pod 模板哈希(pod-template-hash)作为种子。

此输出的两个重要列是:

  • DESIRED 显示您在创建部署(Deployment)时定义的应用程序的期望副本数。这是期望状态。
  • CURRENT 显示当前正在运行的副本数。

接下来,让我们将部署(Deployment)扩展到 4 个副本。我们将使用 kubectl scale 命令,后跟部署(Deployment)类型、名称和期望的实例数:

kubectl scale deployments/kubernetes-bootcamp --replicas=4

要再次列出您的部署(Deployments),请使用 get deployments:

kubectl get deployments

更改已应用,我们现在有 4 个应用程序实例可用。接下来,让我们检查 Pod 的数量是否已更改:

kubectl get pods -o wide

现在有 4 个 Pod,具有不同的 IP 地址。更改已在部署(Deployment)事件日志中注册。要检查这一点,请使用 describe 子命令:

kubectl describe deployments/kubernetes-bootcamp

您还可以在该命令的输出中看到现在有 4 个副本。

Load Balancing

让我们检查一下服务是否正在对流量进行负载均衡。为了找出暴露的 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}}')"
export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o jsonpath='{.spec.ports[0].nodePort}')"
echo NODE_PORT=$NODE_PORT

接下来,我们将对暴露的 IP 地址和端口进行 curl 操作。多次执行该命令:

#curl http://"$(minikube ip):$NODE_PORT"
for NODE_IP in $(kubectl get node -o jsonpath='{.items[*].status.addresses[0].address}');\
do echo "----${NODE_IP}----";\
curl http://$NODE_IP:$NODE_PORT;\
done

我们每次请求都会命中不同的 Pod。这表明负载均衡正在起作用。

💡

注意:

如果您使用 Docker Desktop 作为容器驱动程序来运行 minikube,则需要一个 minikube 隧道。这是因为 Docker Desktop 内部的容器与您的主机计算机是隔离的。

在一个单独的终端窗口中,执行: minikube service kubernetes-bootcamp --url

输出看起来像这样:

http://127.0.0.1:51082 (opens in a new tab) ! 因为您在 darwin 上使用 Docker 驱动程序,所以需要打开终端才能运行它。

然后使用给定的 URL 来访问应用程序:

curl 127.0.0.1:51082

Scale Down

要将部署缩容到 2 个副本,请再次运行缩放子命令:

kubectl scale deployments/kubernetes-bootcamp --replicas=2

使用 get deployments 子命令列出部署,以检查更改是否已应用:

kubectl get deployments

副本数量减少到 2。使用 get pods 列出 Pod 的数量:

kubectl get pods -o wide

这确认了 2 个 Pod 已被终止。

Summary:

  • 扩展部署 您可以在一开始使用 kubectl create deployment 命令的 --replicas 参数创建具有多个实例的部署。

一旦您准备好了,就可以继续进行“执行滚动更新”。