Jenkins 配合 Kubernetes 实现服务持续集成的实践和建议
Kubernetes 本身是一个以服务扩容见长的容器编排系统,如果不能跟其它 CI/CD 工具结合起来,从根本上说还是不能提升开发部署效率,达到持续集成,持续交付的目的,本文以 Jenkins 配合 Kubernetes 完成 Java 服务持续集成和部署过程碰到一些问题,进行说明和总结。
是否需要把 Jenkins 集成 Kubernetes 集群中进行统一管理?
Jenkins如何搭配 Kubernetes 实现持续集成?
docker build -t docker.hub.com/dev/tomcat-webapps:$version .docker push docker.hub.om/dev/tomcat-webapps:$version
-
第一点,docker 构建镜像需要 tag ,这个 tag 可以通过 Jenkins 参数化构建,在构建之前输入版本号,如果没有输入,填写默认值即可。
第二点、历史镜像如何处理?比较建议每次镜像构建完成之后,通过 Jenkins 配置命令删除没有运行的镜像。
具体根据使用场景处理这些中间产物。
docker rm $(docker ps -a -q)
kubectl apply -f config.yamlsed -i 's/image-replace-webapps/tomcat-webapps:${version}/' tomcat_deployment.yaml;kubectl apply -f tomcat_deployment.yaml
「麻雀虽小五脏俱全」一个项目功能不多,但是少不了 configmap、deployment、甚至 service,Jenkins 在打包过程肯定要涉及到对这些文件的修改,问题来了,这些文件如何存放呢?
如果你有强大的 helm 包管理工具,当然可以解决这些问题;如果你的项目没有大到使用 helm 进行文件管理,可以考虑把 yaml 配置直接放到源代码某个目录下面,利用 SVN/GIT 进行管理,也可以直接放到服务器某个路径下面,Jenkins 每次构建时 SSH 到这台服务器进行备份、修改运行 yaml 文件。
3、在构建过程中需要注意问题
docker 镜像构建过程中通过参数化构建已经可以修改版本号,同样的,首先在 k8s 编排文件镜像部分添加能够已知占位符;
然后把这个版本号动态传递并替换到 k8s yaml 中;
sed -i 's/image-replace-webapps/tomcat-webapps:${version}/' tomcat_deployment.yaml;
在现实使用场景中,可能会存在多个Kubernetes环境,如何处理?
这时可以根据情况进行处理,比如线上环境和开发测试环境镜像仓库、集群环境、Jenkins都是严格隔离的,那就可以等到开发测试完成之后把上述流程重新走一遍。如果使用同一个 Jenkins 通过不同的用户权限构建到不同环境也是类似道理。其实看你怎么用,因为镜像已经集中存储到仓库,正式线上环境直接拿着 yaml 就可以跑起来,比以前上传 war 更清爽。
4、总结
本文主要以 Jenkins 为中心介绍了持续集成Kubernetes 过程,Jenkins本身是持续集成,持续交付工具链过程非常重要的一个部分,它是开源的并且提供了大量可用的插件,入门使用非常简单,但是真正掌握好 Jenkins 使用并不是一件轻松的事情,如何使用 Jenkins 创建出高效稳定、灵活的流水线是所有从事 DevOps 开发人员所亟待解决的问题。
推荐
docker bridge 到 k8s pod 跨节点网络通信机制演进
从Ice到Kubernetes容器技术,微服务架构经历了什么?
原创不易,随手关注或者”在看“,诚挚感谢!
本文分享自微信公众号 - 云原生技术爱好者社区(programmer_java)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
