暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Windows container 的CI/CD交付方案

深夜IT研究猿 2019-03-22
684
 

     声明:说明一下文章的原创性,本公众号的所有文章都是小猿君们根据官方说明和实践的原创文章,但是因为前面几篇文章发表过程失误,没有标上原创,特此说明。


       在上一期公众号中我们将.NET和.NET core应用的容器化过程实际操作了一下,这一期我们介绍Windows 容器和k8s结合。Windows容器的yaml文件格式和在liunx下的相同,区别就是服务的镜像需要改成Windows版本的,最后通过nodeselector参数将pod调度到Windows节点。

  上图显示了被k8s编排的Windows容器,由图可以看出,还有一个jenkins应用,所以这次不仅只是简单的将应用通过k8s部署,还通过jenkins做了CICD,进一步提高开发效率。要注意的是:Jenkins-mater要通过k8s部署,部署时要暴露访问端口(如8080)和jenkins-slave连接端口(如50000)两个端口,最开始采用二进制安装单机jenkins,导致后期部署应用时jenkins-slave无法连接jenkins-master的结果。


一、持续集成部署方案


     下图展示了本次k8s持续集成部署采用的思路:

1~3:流水线每次触发,jenkins-master都会通过k8s启动一个jenkins-容器,

4~6:slave节点和master节点连接成功之后,master节点会将流水线跑在slave容器内,在slave容器内拉取代码,编译,

7~8:在宿主机将编译产物打成镜像、推送镜像到镜像仓库,更新服务,最后slave节点被自动删除。

可以看出,jenkins slave是个运行时环境。


二、Jenkins集成K8S


     Jenkins 下载k8s相关插件,在设置最下端新增一个云,选择kubernetes,


        k8s和jenkins连接设置,连接测试是success时即可。

                               

三、Jenkins集成Gitlab


      Jenkins获取Gitlab API token,获取拉代码的权限,并在Gitlab中配置webhook,使得Git仓库每次有变化之后,都能够自动触发jenkins跑流水线。

3.1

Gitlab API token获取

3.2

Jenkins Gitlab插件设置

       选择添加jenkins,

        Kind为GitLab Api token,填入从gitlab中获得的token字段,

  

        完成后,点击Test,显示成功即可。

3.3

webhook URL获取

进入pipeline项目,勾选触发器,得到webhook URL。

3.4

用户token获取

      点击用户名->设置->showapi token,得到该用户的token。

3.5

Gitlab设置webhook

      Test返回页面,即可成功。 到此CICD配置完成。

                    


四、Jenkins-slave镜像构建


4.1

宿主机Docker设置

 基于slave的工作流程,slave镜像中要装有git、java、docker-client。往期公众号提到过,windows的镜像都比较大,每次都去拉取的话比较耗时间,这就是为什么选择使用宿主机的docker和镜像,在宿主机完成打镜像,推镜像的过程。为完成slave容器内docker-client和宿主机docker通信,选择了docker的TCP通信模式,对宿主机的docker daemon.json做如下修改,使用docker -H tcp://IP:Port[命令] 就可以实现docker的远程通信。(注:windows docker不支持unix下的socket通信技术。)


      示例:针对上面的设置,在另一台虚机与该机器的docker进行通信。

4.2

构建镜像

 前面提及要安装的软件在设置环境变量之后才能方便使用,所以先一步将docker-git-java镜像构建并进行了测试,然后基于这个镜像,再去构建我们的slave镜像。Dockerfile如下:


 Dockerfile中的Start.ps1脚本,用来获取slave容器中的环境变量(前面提到过:环境变量由jenkins-mater提交的yaml文件注入),并执行java -jar这一条命令,完成和jenkins-master的连接。脚本内容如下:


五、Jenkins设置与slave的连接


5.1

端口指定

       在jenkins中将slave要连接的端口指定。

5.2

Jenkins-slave pod模板

        填写jenkins-slave的pod模板,启动slave容器用的。


六、Jenkinsfile编写


6.1

设置k8s连接

 Jenkinsfile中根据cloud参数选择要连接的k8s,根据label参数启动对应jenkins-slave容器跑完整个流水线。


6.2

拉取代码

6.3

构建并推送镜像  

      Jenkins可以通过GIT_COMMIT和BUILD_NUMBER参数,为每次生成的镜像打上不同的标签,以示区分,防止出现因为镜像版本相同时由缓存导致服务无法更新的问题。

6.4

部署应用

部署直接用的kubernetesDeploy插件,需要提前下载。

写好jenkins file点击运行,之前在k8s插件中pod模板参数和container模板参数也会在jenkins日志中体现。

6.5

流水线跑完,访问服务

七、结束语 


      结合前几篇公众号,从windows 容器的概览,到windows下服务的容器化,再到k8s编排windows容器以及k8s集成jenkins CICD的完成,windows container的探索到此告一段落。如果有新的发现,会再次和大家分享。


文章转载自深夜IT研究猿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论