Jenkins 配合 Kubernetes 实现服务持续集成的实践和建议




Kubernetes 自己是一个以服务扩容见长的容器编排系统,若是不能跟其它 CI/CD 工具结合起来,从根本上说仍是不能提高开发部署效率,达到持续集成,持续交付的目的,本文以 Jenkins 配合 Kubernetes 完成 Java 服务持续集成和部署过程碰到一些问题,进行说明和总结。javascript



是否须要把 Jenkins 集成 Kubernetes 集群中进行统一管理?java

当你在网上搜索 Jenkins 持续集成 dockers/kubernetes 时,80% 答案是在Kubernetes集群中容器化 Jenkins ,在我看来,对于业务服务数量有限的互联网公司,前期的话,不是特别建议把Jenkins直接安装到kubernetes集群当中,特别是在没有使用 Kubernetes 容器云平台以前已经有了自动化构建工具,有如下缘由:

首先早阶段开发、测试、生产环境已经部署了Jenkins,已经习惯了这种使用方式,Jenkins自己呢,只是执行一些命令,自己不会耗费太多资源,不须要多个副本和横向扩展的能力,把须要持续交付的服务实现容器化再说吧。

再者若是你把 Jenkins 放到 Kubernetes 集群中执行,你须要把 Jenkins 打成镜像,放到 Pod 中执行,而通常状况下根据镜像的最小化原则,镜像里面不会包含 docker 组件,因此若是你在宿主机上打包能够正常执行,而放到Pod 中可能会出现没法 docker build ,固然这也是能够解决的,由于 docker 自己是 B/S 架构,你能够经过在镜像内部挂载 docker 命令,调用宿主机 docker socket 端口;更简单方法,直接远程到一台包含 docker 基础服务的服务器上执行,但不管如何,你可能都要折腾一下,改变现有使用方式。


Jenkins如何搭配 Kubernetes 实现持续集成?nginx


总体流程以下图所示:
简单分为五个过程
一、需求原型开发完成,开发人员介入开发;
二、开发人员将代码提交到代码仓库 git/SVN;
三、钩子触发 jenkins master 启动一次构建,或者开发人员自行点击构建,根据状况自行选择,jenkins 拉取代码、maven 编译;

这里假设你已经完成 Jenkins 安装、远程工具、java 编译环境配置等。若是没有配置,网上找找,资料特别多。这部分其实相对来讲和以前使用Jenkins 的方式区别不大,若是你使用 git,这里仍是 git 拉取代码,以前是 maven/ant 进行打包,那么这里仍是 maven/ant 进行打包。

四、docker 镜像构建、镜像提交到仓库;
docker 镜像在构建须要区别与之前的形式,若是你已经在 Jenkins 上安装了 docker 插件,直接在当前机器构建便可,若是没,也没问题,远程 SSH 到一台可以构建 docker 镜像的服务器进行镜像打包。

docker build -t docker.hub.com/dev/tomcat-webapps:$version .docker push docker.hub.om/dev/tomcat-webapps:$version

打包过程须要注意两点
  • 第一点,docker 构建镜像须要 tag ,这个 tag 能够经过 Jenkins 参数化构建,在构建以前输入版本号,若是没有输入,填写默认值便可。

  • 第二点、历史镜像如何处理?比较建议每次镜像构建完成以后,经过  Jenkins 配置命令删除没有运行的镜像。git

    具体根据使用场景处理这些中间产物。web


docker rm $(docker ps -a -q)

五、Kubernetes yaml 运行过程到仓库拉取 docker 镜像构建产物,从而启动整个服务,测试人员开始全方位功能、性能测试。
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 在打包过程确定要涉及到对这些文件的修改,问题来了,这些文件如何存放呢?docker


若是你有强大的 helm 包管理工具,固然能够解决这些问题;若是你的项目没有大到使用 helm 进行文件管理,能够考虑把 yaml 配置直接放到源代码某个目录下面,利用 SVN/GIT 进行管理,也能够直接放到服务器某个路径下面,Jenkins 每次构建时 SSH 到这台服务器进行备份、修改运行 yaml 文件。tomcat

三、在构建过程当中须要注意问题服务器

docker 每次镜像构建 tag 不同,如何传递到 k8s yaml中?

docker 镜像构建过程当中经过参数化构建已经能够修改版本号,一样的,首先在 k8s 编排文件镜像部分添加可以已知占位符;微信

而后把这个版本号动态传递并替换到 k8s yaml 中;网络

sed -i 's/image-replace-webapps/tomcat-webapps:${version}/' tomcat_deployment.yaml;

在现实使用场景中,可能会存在多个Kubernetes环境,如何处理?

这时能够根据状况进行处理,好比线上环境和开发测试环境镜像仓库、集群环境、Jenkins都是严格隔离的,那就能够等到开发测试完成以后把上述流程从新走一遍。若是使用同一个 Jenkins 经过不一样的用户权限构建到不一样环境也是相似道理。其实看你怎么用,由于镜像已经集中存储到仓库,正式线上环境直接拿着 yaml 就能够跑起来,比之前上传 war 更清爽。

四、总结

本文主要以 Jenkins 为中心介绍了持续集成Kubernetes 过程,Jenkins自己是持续集成,持续交付工具链过程很是重要的一个部分,它是开源的而且提供了大量可用的插件,入门使用很是简单,可是真正掌握好 Jenkins 使用并非一件轻松的事情,如何使用 Jenkins 建立出高效稳定、灵活的流水线是全部从事 DevOps 开发人员所亟待解决的问题。


推荐


Kubernetes排障指南

DevOps实践带来的好处和挑战

DevOps成就卓越

云计算交付模型知多少 - IaaS、PaaS、SaaS

docker bridge 到 k8s pod 跨节点网络通讯机制演进

Kubernetes入门培训(内含PPT)

从Ice到Kubernetes容器技术,微服务架构经历了什么?



原创不易,随手关注或者”在看“,诚挚感谢!

本文分享自微信公众号 - 云原生技术爱好者社区(programmer_java)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。