声明:说明一下文章的原创性,本公众号的所有文章都是小猿君们根据官方说明和实践的原创文章,但是因为前面几篇文章发表过程失误,没有标上原创,特此说明。
在上一期公众号中我们将.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的探索到此告一段落。如果有新的发现,会再次和大家分享。




