持续集成之应用k8s自动部署
Intro
上次我们提到了docker容器化及自动化部署[1],这仅仅适合个人项目或者开发环境部署,如果要部署到生产环境,必然就需要考虑很多因素,比如访问量大了如何调整部署,如何更好的应对大并发的情况,如何不停机更新应用,如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理,于是 k8s 就出现了。
K8S,就是基于容器的集群管理平台,它的全称,是kubernetes。
k8s 十分强大,可以帮助我们很方便的实现应用的伸缩,也可以很轻易的实现不停机更新,更好更方便的实现服务高可用,还有很多很实用的功能,例如服务发现/负载均衡/配置中心等,更多 k8s 的介绍请参考https://www.kubernetes.org.cn/docs[2]。
k8s 自动部署介绍
这里只是我自己的一些实践,不一定是最合适的,仅供参考。
自动部署流程:
•自己在 k8s 集群上手动创建 deployment 和 service•CI 自动构建新的 docker 镜像•CI 推送新的 docker 镜像到 docker hub 或者自己的 docker registry•更新 k8s 应用对应的 deployment 的镜像
示例应用
这里有一个 示例应用[3]
•
在部署了 k8s 集群环境的服务器上部署应用
wget https://raw.githubusercontent.com/WeihanLi/AccountingApp/dev/accountingapp-k8s-deployment.yaml
kubectl apply -f accountingapp-k8s-deployment.yaml
•
配置CI,这里以 Azure Pipeline 为例
Azure pipeline 示例配置:
pool: vmImage: 'Ubuntu 16.04' variables: tagName: '$(Build.BuildNumber)' imageName: '$(dockerId)/accountingapp:$(tagName)' steps: - script: docker build -f Dockerfile -t $(imageName) . displayName: 'Docker build Script' - script: | docker login -u $(dockerId) -p $(pswd) docker push $(imageName) displayName: 'Push docker image' - task: SSH@0 displayName: 'Run shell inline on remote machine' inputs: sshEndpoint: 'weihanli-vm' runOptions: inline inline: | kubectl set image deployment/accountingapp-deployment accountingapp=$(imageName) --record=true
•
提交代码触发CI
docker build -f Dockerfile -t weihanli/accountingapp:20190407.3 . # 此处省略N行代码... deployment.extensions/accountingapp-deployment image updated
•
查看效果
访问 示例应用[4],刷新几次可以看到类似效果。
查看 pod 信息,执行 kubectl get pod
获取 pod 信息,再使用 kubectl describe pod <podName>
获取pod的信息确认是否已经成功更新镜像
Memo
希望对你有帮助,作者水平有限,如有疏漏或者错误,还望指出。
References
[1]
docker容器化及自动化部署: https://www.jianshu.com/p/ce10bb128539[2]
: https://www.kubernetes.org.cn/docs[3]
示例应用: https://github.com/WeihanLi/AccountingApp[4]
示例应用: https://accounting.weihanli.xyz/Account/Login?ReturnUrl=%2F