首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

有赞持续集成容器化实践

2020-01-14

Jenkins Java Slave 咱们参阅的官网制造并添加了一些咱们自己包,其间 Nodejs 、Python Slave 制造和 Java Slave 相似,网上也有材料这儿就不具体介绍了。

制造完的镜像需推送到镜像库房中保存, 下面是构建和推送镜像的指令:

docker build -t [IMAGE:TAG] .
docker tag SOURCE_IMAGE[:TAG] harbor.xxx.com/xxx/IMAGE[:TAG]
docker push harbor.xxx.com/xxx/IMAGE[:TAG]

如上图所示,有需求的同学能够在有赞QA渠道建议创立事务线容器,后台会调用 Kubernetes API 创立 Jenkins 、 Sonarqube 容器,并回来拜访地址。如下图:

这儿咱们运用的 Kubernetes 客户端是 fabric8io/kubernetes-client 项目,需求在项目的 pom 文件中参与 kubernetes-client 依靠:

 dependency 
 groupId io.fabric8 /groupId 
 artifactId kubernetes-client /artifactId 
 version 4.1.0 /version 
 /dependency 

Deployment 为 Pod 和 Replica Set供给声明式更新。只需求在 Deployment 中描绘你想要的方针状况是什么,Deployment controller 就会帮你将 Pod 和 ReplicaSet 的实践状况改动到您的方针状况。

Service 经过 Label Selector 跟服务中的 Pod 绑定,为 Pod 中的服务类运用供给了一个安稳的拜访进口。经过运用 Service,咱们就能够不必关怀这个服务下面的 Pod 的添加和削减、毛病重启等,只需经过 Service 就能够拜访到对应服务的容器。

Service 尽管能够 LB,NodePort 对外供给服务,可是当集群服务许多的时分,NodePort 方法最大的缺陷是会占用许多集群机器的端口,LB 方法最大的缺陷则是每个 Service 一个 LB 又有点糟蹋和费事,而且需求 Kubernetes 之外的支撑,而 Ingress 则只需求一个 NodePort 或许一个 LB 就能够满意一切 Service 对外服务的需求。

留意点:

Kubernetes 集群中,将图片或是文件上传到文件服务器上,如文件大于 1 M会报错所以 Ingress 的 Annotations 需求装备下 nginx.ingress.kubernetes.io/proxy-body-size , 600m 。

因为 Jenkins Master 容器起来 Kubernetes 插件装备信息都需求初始化好,就需求知道起来后 Pod Node Ip,这儿能够经过 Env 来获取 Pod Node IP:

env:
 - name: MY_POD_IP
 valueFrom:
 fieldRef:
 fieldPath: status.podIP
 status.podIP :pod IP

前端拜访 Jenkins Master 时会存在跨域问题,在 Ingress 中,跨域的装备如下:

nginx.ingress.kubernetes.io/cors-allow-headers: DNT,X-
CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization
nginx.ingress.kubernetes.io/cors-allow-methods: PUT, GET, POST, OPTIONS
nginx.ingress.kubernetes.io/cors-allow-origin: '*'
nginx.ingress.kubernetes.io/enable-cors: true 
nginx.ingress.kubernetes.io/proxy-body-size: 600m

当需求进入容器内履行一些 shell 指令时,web terminal 能够让咱们更便利的拜访 container,履行 shell 指令,进步工作效率。如下图:

完成:

前端用 xterm.js 库,它是模仿一个 terminal 在浏览器中,此刻并没有通讯才能。需求在后端树立 k8s-websocket 服务。前端树立 websocket,连到后台树立的 k8s-websocket 服务端。服务端会根据 Kubernetes 的 remotecommand 包,树立与 container 的 SSH 长衔接。咱们将输入输出写入到 Websocket 流中即可,当浏览器中 terminal 巨细改动了,前端应该把最新的 terminal 巨细发给服务端,服务端模仿终端也要相应的 resize。

遇到的问题:

因为咱们运用的 kubernetes-client 其时只供给了 Pod 启动时,初始化 terminal 巨细的功用,未完成 resize 功用。当浏览器中的 terminal 的巨细改动时,因为与初始化时传递的队伍数不同,导致显现不全或显现区域过小的问题。在查阅材料的过程中发现 Kubernetes 的 remotecommand 实践上是供给了该功用的。此文件中,界说 resizeChannel 为 4,行将发送的指令 byte 数组的第一位修改为 4,就可发送 resize 的相关指令。

测验的时分发现 Kubernetes Slave 调度速度比较慢,尤其是多个同类型的 Slave 并行需求等候比较长的时刻,上网查询发下默许情况下 Jenkins 保存地生成署理。假如行列中有 2 个构建,不会当即生成 2 个履行程序。会发生一个履行器并等候一段时刻看第一个履行器有没有被开释,然后再决议发生第二个履行器。以保证发生的每个履行者都得到最大极限的使用。假如要掩盖此行为并当即为行列中的每个构建生成履行程序,能够在 Jenkins Mater 启动时参与一下参数:

总而言之 Kubernetes 博学多才,在 CI/CD 容器化的道路上还有许多知识点需求去学习。

原文链接: https://mp.weixin.qq.com/s/awPRvs_Vkj9cYSh4lsyEtQ

热门文章

随机推荐

推荐文章