30分钟

任务5 部署应用

任务目的

参考Kubernetes官网示例,此任务将会在任务2搭建的集群中对一个应用进行部署、展示、扩展、更新和回滚,通过此任务,学员将掌握kubectl对Deployment的基本操作。

官方提供的用于创建Deployment的YAML示例文件,对于Deployment,学员可以将它看做Pod副本控制器RC的升级版。也就是说,通过Deployment部署应用,可以自动管理应用Pod的副本数、滚动更新、版本回滚等。

nginx-deployment.yaml

此任务的应用使用default命名空间,所以使用Kubernetes Dashboard的时候选择default命名空间。

选择命名空间

本实验部署的示例应用为Kubernetes官方提供,该容器镜像提供了一个web应用,访问时会返回如下信息:

Hello Kubernetes bootcamp! | Running on: <访问服务的Pod名> | <镜像版本>

任务步骤

1.部署一个应用

除了YAML创建方式之外,也可以使用kubectl create deployment命令在Kubernetes上部署一个Deployment。我们需要提供部署名称和应用程序镜像位置(包括Docker hub外部托管镜像的完整存储库url)。

由于官方示例的仓库我们访问不到,所以这里使用国内可以访问到的镜像。

kubectl create deployment kubernetes-bootcamp --image=gcr.azk8s.cn/google-samples/kubernetes-bootcamp:v1
创建Deployment

这时我们可以登录Dashboard查看【部署】,可以看到,Deployment已经成功被创建。在【容器组】页面中,可以看到相应的Pod情况。还可以通过【副本集】查看构建的Pod副本情况。

如果学员未保存任务4中获取的Token值,可以通过kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')命令再次获取,访问时建议通过浏览器保存该Token值。

查看部署情况
查看容器组
查看副本集

2.展示应用

除了使用YAML文件,也可以通过kubectl expose命令创建Service对象以将应用程序暴露于外部网络中,暴露方式我们还是选择NodePort方式。

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
暴露服务

查看服务映射端口,此时,我们可以通过映射的端口访问到应用。

kubectl get services
获取映射端口

也可以在Dashboard的【服务发现与负载均衡】中的【服务】查看,详细信息可点击右边【3个小点】,选择【查看/编辑YAML】。

即使使用命令创建的资源,Kubernetes也会使用YAML去描述。

仪表盘——服务
YAML文件

此时可以通过<任意节点内网IP>:<刚才查看的端口号>访问到应用中。

访问应用

删除服务。

kubectl delete service kubernetes-bootcamp
删除服务

这时直接使用curl命令再次访问服务。

curl <任意节点内网IP>:<刚才查看的端口号>
访问服务失败

说明此时无法在集群外访问到应用。此时可以在pod内部执行命令来确认应用存活情况,不过首先得查看Pod名。

kubectl get pods --all-namespaces |grep bootcamp
kubectl exec -ti <查看到的Pod名> curl localhost:8080
内部访问应用

说明应用是正常运行的。

3.扩展应用

前面创建了一个部署,然后通过Service公开地将其暴露。部署仅创建了一个Pod来运行我们的应用程序。真实情况下,如果访问量增加时,我们将需要扩展应用程序以适应用户需求。

可以查看Deployments。

kubectl get deployments
查看Deployments
  • READY:显示当前/所需副本的比率。
  • UP-TO-DATE:显示已更新以达到所需状态的副本数。
  • AVAILABLE:显示应用程序有多少副本可供用户使用。
  • AGE:显示应用程序运行的时间量。

通过更改部署中的副本数来完成扩展,现在我们查看副本数。

kubectl get rs
查看副本数
  • DESIRED:显示期望的副本数量。
  • CURRENT:显示当前副本数。
  • READY:显示当前运行中副本。
  • AGE:显示应用程序运行的时间量。

假如应用访问量增大,我们暂定将部署扩展到4个副本。使用kubectl scale命令,然后是部署类型、名称和所需的实例数。

kubectl scale deployments/kubernetes-bootcamp --replicas=4
扩展副本数

此时我们可以快速通过命令查看副本数,可以看到新的副本被创建。

kubectl get rs
kubectl get deployments
查看副本数

也可以通过Dashboard查看,这里可以看到新创建的三个副本Pod。

仪表盘——容器组

还可以在【副本集】中查看容器日志。

仪表盘——副本集
容器日志

再次启动服务。

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

查看端口映射,并多次访问。

kubectl get service
curl <任意节点内网IP>:<NodePort暴露的端口号>
curl <任意节点内网IP>:<NodePort暴露的端口号>
curl <任意节点内网IP>:<NodePort暴露的端口号>
curl <任意节点内网IP>:<NodePort暴露的端口号>
多次访问

这时表明负载平衡正在工作。

4.更新应用

如果想要将v1版本的镜像更新到v2,我们可以看看Kubernetes是怎么做到的。

查看Pod。

由于该Pod创建在default命名空间下,后面可以不用跟参数。

kubectl get pods
查看Pod

此时更新镜像到v2版本,并快速且多次查看Pod状态,可以看到滚动更新的过程。

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
kubectl get pods
kubectl get pods
kubectl get pods
kubectl get pods
kubectl get pods
kubectl get pods
更新

查看更新过程,可以发现,Pod的更新不是直接停止以前所有副本,再全部更新。而是滚动更新,也就是创建新Pod的时候,确认运行后,慢慢关闭之前Pod。这样可以保证出现问题可以及时停止更新。

更新过程1
更新过程2
更新过程3

更新结果。

更新结果

此时查看服务,并通过NodePort提供的端口号继续访问应用,一般来说,更新后的端口不变化。

kubectl describe services/kubernetes-bootcamp
curl <任意节点内网IP>:<NodePort暴露的端口号>
访问服务

如果更新出现问题,我们也可以回滚上次更新。

kubectl rollout undo deployments/kubernetes-bootcamp
更新回滚

查看Pod状态。

kubectl get pods
回滚过程
回滚结果

回滚后访问应用,可以看到,版本已经回滚完毕。

curl <任意节点内网IP>:<NodePort暴露的端口号>
访问应用