BHOL403 - k8s应用开发部署 - 使用deployment进行部署

在这几节实验中,我们将完成我们的 Hello Boathouse 应用的k8s部署过程,其中会涉及到一下k8s中的对象

  • Pod
    • Deployment
  • Service
  • Secret
  • Namespace

这些内容基本上覆盖了我们k8s集群进行应用开发部署的主要对象。

05 - 使用 Deployment 进行部署

使用pod部署每次只能部署一个pod,无法对我们的应用进行阔缩容设置。使用 Deployment,我们不仅可以同时启动多个pod,还可以管理应用的升级,回滚和阔缩容设置。

首先清理我们刚才用pod方式进行的部署

  1. kubectl delete service hello-boathouse-service
  2. kubectl delete pod hello-boathouse-pod

部署 hello-boathouse v1 版本

注意:为了简化大家的操作,下面我们都统一使用讲师提供的公开镜像,如果需要更换成自己的镜像,注意替换一下 boathouse216 为你自己的命名空间即可。

使用vscode创建 hello-boathouse-deployment.yaml 文件,内容如下

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: hello-boathouse-deployment
  5. spec:
  6. replicas: 3
  7. selector:
  8. matchLabels:
  9. app: hello-boathouse
  10. template:
  11. metadata:
  12. labels:
  13. app: hello-boathouse
  14. spec:
  15. containers:
  16. - name: hello-boathouse
  17. image: registry.cn-hangzhou.aliyuncs.com/boathouse216/hello-boathouse:v1
  18. ports:
  19. - name: nodejs-port
  20. containerPort: 3000

使用以下命令完成部署

  1. ## 进行部署
  2. kubectl apply -f kube-deploy/hello-boathouse-deployment.yaml
  3. ## 获取 部署deployment 状态
  4. kubectl get deployments
  5. NAME READY UP-TO-DATE AVAILABLE AGE
  6. hello-boathouse-deployment 3/3 3 3 6m49s
  7. ## 获取 扩容集Replica Sets 状态
  8. kubectl get rs
  9. NAME DESIRED CURRENT READY AGE
  10. hello-boathouse-deployment-8b74f8846 3 3 3 6m52s
  11. ## 获取 pod 状态
  12. kubectl get pods --show-labels
  13. NAME READY STATUS RESTARTS AGE LABELS
  14. hello-boathouse-deployment-8b74f8846-4ds5x 1/1 Running 0 7m8s app=hello-boathouse,pod-template-hash=8b74f8846
  15. hello-boathouse-deployment-8b74f8846-5tgqn 1/1 Running 0 7m8s app=hello-boathouse,pod-template-hash=8b74f8846
  16. hello-boathouse-deployment-8b74f8846-bt9dv 1/1 Running 0 7m8s app=hello-boathouse,pod-template-hash=8b74f8846
  17. ## 获取 发布rollout 状态
  18. kubectl rollout status deployment/hello-boathouse-deployment
  19. deployment "hello-boathouse-deployment" successfully rolled out

我们也可以通过k9s实时监控集群状态

BHOL403 - k8s应用开发部署 - 使用deployment进行部署 - 图1

对外暴露服务以便可以测试

  1. kubectl expose deployment hello-boathouse-deployment --name hello-boathouse-service --type=NodePort
  2. minikube service hello-boathouse-service --url

这时我们就可以通过NodePort访问我们的应用了,注意现在应用显示v1版本

BHOL403 - k8s应用开发部署 - 使用deployment进行部署 - 图2

升级到 hello-boathouse v2 版本

现在我们对 hello-boathouse-deployment.yaml 做一个修改,将镜像版本修改为 v2

  1. ## 修改第17行为
  2. image: registry.cn-hangzhou.aliyuncs.com/boathouse216/hello-boathouse:v2

再次提交部署

  1. ## 进行部署
  2. kubectl apply -f kube-deploy/hello-boathouse-deployment.yaml
  3. ## 检查部署状态
  4. kubectl get deployments
  5. ## 检查 rollout 状态
  6. kubectl rollout status deployment/hello-boathouse-deployment
  7. ## 检查 pod 状态
  8. kubectl get pods

我们可以看到部署的完成进展情况,k8s使用了滚动部署机制完成我们的版本升级,此时打开浏览器访问服务地址,会发现服务已经升级到v2版本,如果多次刷新,你会发现每次的hostname会发生变化,这时因为现在我们有3个pod在为这个站点提供服务。

BHOL403 - k8s应用开发部署 - 使用deployment进行部署 - 图3

版本回滚

使用以下命令获取部署历史记录,并进行回滚

  1. ## 获取部署历史记录
  2. kubectl rollout history deployment/hello-boathouse-deployment
  3. deployment.apps/hello-boathouse-deployment
  4. REVISION CHANGE-CAUSE
  5. 3 <none>
  6. 5 <none>
  7. 6 <none>
  8. ## 回滚到上一个版本
  9. kubectl rollout undo deployment/hello-boathouse-deployment
  10. ## 查看回滚状态
  11. kubectl rollout status deployment/hello-boathouse-deployment
  12. ## 回滚到特定版本
  13. kubectl rollout undo deployment/hello-boathouse-deployment --to-revision=3

pod扩容

现在我们对 hello-boathouse-deployment.yaml 做一个修改,将副本数量修改为10

  1. ## 修改第6行
  2. replicas: 10

提交部署

  1. ## 进行部署
  2. kubectl apply -f kube-deploy/hello-boathouse-deployment.yaml
  3. ## 检查部署状态
  4. kubectl get deployments
  5. ## 检查 rollout 状态
  6. kubectl rollout status deployment/hello-boathouse-deployment
  7. ## 检查 pod 状态
  8. kubectl get pods

使用k9s监控部署状态

BHOL403 - k8s应用开发部署 - 使用deployment进行部署 - 图4