任务5 部署应用
任务目的
参考Kubernetes官网示例,此任务将会在任务2搭建的集群中对一个应用进行部署、展示、扩展、更新和回滚,通过此任务,学员将掌握kubectl
对Deployment的基本操作。
官方提供的用于创建Deployment的YAML示例文件,对于Deployment,学员可以将它看做Pod副本控制器RC的升级版。也就是说,通过Deployment部署应用,可以自动管理应用Pod的副本数、滚动更新、版本回滚等。
此任务的应用使用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
这时我们可以登录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去描述。
此时可以通过<任意节点内网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
- 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
此时更新镜像到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。这样可以保证出现问题可以及时停止更新。
更新结果。
此时查看服务,并通过NodePort提供的端口号继续访问应用,一般来说,更新后的端口不变化。
kubectl describe services/kubernetes-bootcamp
curl <任意节点内网IP>:<NodePort暴露的端口号>
如果更新出现问题,我们也可以回滚上次更新。
kubectl rollout undo deployments/kubernetes-bootcamp
查看Pod状态。
kubectl get pods
回滚后访问应用,可以看到,版本已经回滚完毕。
curl <任意节点内网IP>:<NodePort暴露的端口号>
学员评价