前言碎语
基于kubernetes容器化技术架构能够带来诸多好处,诸如,弹性伸缩,自动修复等,在比如蓝绿部署,灰度发布等。近几年容器化技术飞速发展,了解服务网格 的人可能会发现,新兴技术 istio 等service mesh技术没有容器化的技术环境根本就没法实践。
浅谈docker
docker可以类比为jvm,jvm也是虚拟机,然后docker的image可以类比为jar包,jar运行在jvm里面,image当然运行在docker容器里,然后jar包是通过maven 的pom.xml定义构建的产物,那docker也有一个Dockerfile来定义打包的镜像。在没有容器化之前,我们开发提供的最终产物是jar,容器化之后我们需要提供docker的镜像,docker的镜像会包含我们的jar,然后提供一个稳定的可移植的运行环境。下面是最简单的一个docker镜像构建:
通过 docker build -t kl/sales . 就可以构建一个可运行的镜像
浅谈k8s的部署脚本
其实k8s的脚本没什么可说的,本身k8s的概念非常之多,具体可参考官方的文档,下面贴出我们的部署文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
apiVersion: extensions /v1beta1 kind: Deployment metadata: name: sales-app namespace: #namespace spec: replicas: 2 minReadySeconds: 130 # 从容器启动到应用正常提供服务 strategy: # k8s更新策略 type : RollingUpdate #滚动更新 rollingUpdate: maxSurge: 2 # 更新时允许最大激增的容器数,默认 replicas 的 1/4 向上取整 maxUnavailable: 1 # 更新时允许最大 unavailable 容器数,默认 replicas 的 1/4 向下取整 template: metadata: labels: app: sales-app spec: imagePullSecrets: #镜像拉取秘钥 - name: xx-xx-xx containers: - name: sales image: xxx-vpc.cn-xx.aliyuncs.com /keking/sales : #Tag imagePullPolicy: Always env : - name: runShell value: #runShell ports: - containerPort: 6002 name: web protocol: TCP resources: limits: cpu: 600m memory: 4Gi requests: cpu: 300m memory: 100Mi livenessProbe: #检查是否存活 httpGet: path: /health port: 6002 initialDelaySeconds: 240 #首次检查在多少时间后 periodSeconds: 180 #检查周期 timeoutSeconds: 3 #超时时间 failureThreshold: 3 #失败的阈值,连续三次 readinessProbe: #检查是否成功启动 httpGet: path: /health port: 6002 initialDelaySeconds: 140 #首次检查在多少时间后 periodSeconds: 300 #检查周期 timeoutSeconds: 3 #超时时间 --- apiVersion: v1 kind: Service metadata: name: sales-app namespace: #namespace labels: app: sales-app spec: selector: app: sales-app ports: - name: web port: 80 targetPort: 6002 nodePort: 31942 type : NodePort |
最后聊聊jenkins pipeline
和一般的jenkins pipeline定义一样,容器化后就多了两个步骤,一个是在jar生成后,根据前面的讲的Dockerfile文件构建docker的镜像,这个要求jenkins所在主机必须有docker的环境。第二个步骤是发送k8s的部署脚本到k8s容器,这个是通过jenkins kuberneetes插件来完成的,详见下面的jenkins脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
podTemplate(label: 'jnlp-slave' , cloud: 'kubernetes' , containers: [ containerTemplate( name: 'jnlp' , image: 'xx-vpc.cn-xx.aliyuncs.com/keking/jenkins-slave:latest' , alwaysPullImage: true ), ], volumes: [ hostPathVolume(mountPath: '/var/run/docker.sock' , hostPath: '/var/run/docker.sock' ), hostPathVolume(mountPath: '/usr/bin/docker' , hostPath: '/usr/bin/docker' ), hostPathVolume(mountPath: '/usr/local/jdk' , hostPath: '/usr/local/jdk' ), hostPathVolume(mountPath: '/usr/local/maven' , hostPath: '/usr/local/maven' ), ], imagePullSecrets: [ 'registry-pull-secret' ], ) { node( "jnlp-slave" ) { stage( 'Git Checkout' ) { checkout([$class: 'GitSCM' , branches: [[name: "*/${branch}" ]], doGenerateSubmoduleConfigurations: false , extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xx' , url: 'http://xx.xx.xx/xx/yudian-salesplatform-boot.git' ]]]) } stage( 'Maven Build' ) { script { if ( 'true' == "${build}" ) { sh "mvn clean install -U -P${profile} -Dmaven.test.skip=true" } else { echo "跳过maven build" } } } stage( 'Docker Build ' ) { script { if ( 'true' == "${build}" ) { sh '' ' docker login -u it_sh@keking-group -p x #xxx-vpc.cn-xx.aliyuncs.com docker build -t xx-vpc.cn-xx.aliyuncs.com /keking/sales :${Tag} . docker push xx-vpc.cn-xx.aliyuncs.com /keking/sales :${Tag} '' ' } else { echo "跳过docker build" } } } stage( 'Deploy to K8s' ) { script { if ( 'true' == "${deploy}" ){ if ( 'prod' == "${profile}" ) { sh '' ' sed -i "s/#namespace/prod/g" deploy.yaml sed -i "s%#runShell%java -Xmx2G -Xms2G -Xmn960M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.log -Xloggc:/tmp/gc.log -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:MaxMetaspaceSize=128m -XX:MetaspaceSize=128m -jar -Ddev_meta=http://conf.x.ops:8801/ -Denv=DEV -Didc=prod app.jar%g" deploy.yaml '' ' } if ( 'uat' == "${profile}" ) { sh '' ' sed -i "s/#namespace/uat/g" deploy.yaml sed -i "s%#runShell%java -Xmx1536M -Xms1536M -Xmn960M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.log -Xloggc:/tmp/gc.log -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:MaxMetaspaceSize=128m -XX:MetaspaceSize=128m -jar -Ddev_meta=http://conf.keking.ops:8801/ -Denv=DEV -Didc=sales_docker app.jar%g" deploy.yaml '' ' } sh '' ' sed -i "s/#Tag/${Tag}/g" deploy.yaml '' ' kubernetesDeploy configs: 'deploy.yaml' , kubeConfig: [path: '' ], kubeconfigId: '9c1da035-60b9-4bd8-aeae-1a31666280ce' , secretName: '' , ssh : [sshCredentialsId: '*' , sshServer: '' ], textCredentials: [certificateAuthorityData: '' , clientCertificateData: '' , clientKeyData: '' , serverUrl: 'https://' ] } else { echo "跳过Deploy k8s" } } } } } |
综上,就完成了从jenkins到k8s的ci和cd过程,当然过程中还有很多细枝末节未详尽描述,比如k8s的搭建(博主使用的阿里云的容器服务)等,欢迎看到此篇有容器化此需求的同行一起探讨
以上就是jenkins docker k8s的容器化之路脚本浅析的详细内容,更多关于jenkins docker k8s的容器化脚本的资料请关注服务器之家其它相关文章!
原文链接:http://www.kailing.pub/article/index/arcid/215.html