结构

  1. 发布流程设计
  2. 部署Harbor镜像仓库
  3. 部署Git仓库
  4. 构建Jenkins-Slave镜像
  5. 在Kubernetes中部署Jenkins
  6. Jenkins与Kubernetes集成
  7. 流水线发布Java项目
  8. 回滚

1.发布流程设计

软件环境: Jenkins + Kubernetes + Git + Maven + Harbor
工作流程:手动/自动构建 -> Jenkins 调度 K8S API ->动态生成 Jenkins Slave pod -> Slave pod 拉取 Git 代码/编译/打包镜像 ->推送到镜像仓库 Harbor -> Slave
工作完成,Pod 自动销毁 ->部署到测试或生产 Kubernetes平台 。

2. 部署Harbor镜像仓库

https://192.168.1.25/harbor

3. 部署Git仓库

192.168.1.25

Kubernetes与Jenkins的CI/CD

4. 构建Jenkins-Slave镜像

Jenkins-Slave:作用是缓解master上的负载压力

master 分派任务(job)给Jenkins-Slave 完成工作

参考文档:https://github.com/jenkinsci/docker-jnlp-slave

[root@docker jenkins-salve]# ls
dockerfile-jenkins-slave jenkins-slave settings.xml slave.jar

settings.xml:maven的配置文件,获取jar包的地址变为阿里云,原先的apache地址下载很慢

1、[root@docker jenkins-salve]# docker build -t test.com/library/jenkins-salve -f dockerfile-jenkins-slave .
2、docker push test.com/library/jenkins-salve:latest

Kubernetes与Jenkins的CI/CD_第1张图片

5. 在Kubernetes中部署Jenkins

文档:https://github.com/jenkinsci/kubernetes-plugin/tree/fc40c869edfd9e3904a9a56b0f80c5a25e988fa1/src/main/kubernetes

首先要创建pv --》managed-nfs-storage

1、kubectl apply -f rbac.yaml
1)必须要让k8s认证仓库,即master上创建获取镜像的权限
Kubernetes与Jenkins的CI/CD_第2张图片

生成密钥:参考 https://blog.csdn.net/xukangkang1hao/article/details/80839834

2、[root@docker jenkins]# kubectl apply -f jenkins.yml

端口:30009 是node的端口
50000 是slave用到的端口

initialDelaySeconds 60 可以设置为系统完全启动起来所需的最少时间,这里是1分钟,60秒
1)查看下pvc有无创建
Kubernetes与Jenkins的CI/CD

2)查看下pod有无启动
Kubernetes与Jenkins的CI/CD_第3张图片

3)访问-->可以看到这个pod分配在了哪个node上
http://192.168.1.24:30009

Kubernetes与Jenkins的CI/CD_第4张图片

Kubernetes与Jenkins的CI/CD

Kubernetes与Jenkins的CI/CD_第5张图片

3、slave需要凭据来管理Kubernetes,因为slave来进行部署上线的,这样就会分配pod

而slave是分配在了node上,这就需要node管理Kubernetes

参考以下生成的admin证书
http://blog.itpub.net/28624388/viewspace-2151773/

1)[root@docker master-ca]# pwd
/data/k8s/master-ca

2)[root@docker master-ca]# cat admin-csr.json
{
"CN": "admin",
"hosts": [],
"key": {
"algo":"rsa",
"size":2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}

3)生成 admin 证书和私钥
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin

4)拷贝admin.pem admin-key.pem 到/root/k8s-cert 下
Kubernetes与Jenkins的CI/CD_第6张图片

5)[root@docker k8s-cert]# sh kubeconfig.sh

6)将以下拷贝到任意一个主机node上
scp /opt/kubernetes/bin/kubectl config 192.168.1.23:~

7)登录到192.1681.23上
[root@docker ~]# ./kubectl get nodes --kubeconfig=config ;./kubectl get pods --kubeconfig=config
Kubernetes与Jenkins的CI/CD

8)授权成功

9)这个配置文件要放到jenkins上集成

4、设置jenkins
1)在系统管理---》插件管理--》Advanced--》更改为http
http://updates.jenkins.io/update-center.json

2)安装插件
Kubernetes Continuous Deploy
Kubernetes

3)安装完成后,系统管理---》系统设置---》Cloud
Kubernetes与Jenkins的CI/CD_第7张图片

Kubernetes 地址 :https://kubernetes.default #这个就是dns解析,根据svc匹配
Kubernetes与Jenkins的CI/CD_第8张图片

Kubernetes与Jenkins的CI/CD_第9张图片

一定要测试是否成功

4)保存

5、搭建git仓库
1)先登录到192.168.1.24 下载源码
[root@docker ~]# git clone https://github.com/lizhenliang/tomcat-java-demo.git

2)登录到192.168.1.25创建git仓库
Kubernetes与Jenkins的CI/CD_第10张图片

3)192.168.1.24 更改git提交仓库,再将代码提交到这个仓库中
Kubernetes与Jenkins的CI/CD_第11张图片

4)192.168.1.24 上 执行:git push origin master

5)在192.168.1.23上拉去代码
git clone [email protected]:/home/git/java-demo

6、jenkins上创建项目--》pipeline
Kubernetes与Jenkins的CI/CD_第12张图片

1)准备好2个文件
deploy.yaml
Jenkinsfile

Kubernetes与Jenkins的CI/CD_第13张图片

2)Repository URL :git仓库地址 [email protected]:/home/git/java-demo

3)需要在node上创建一个认证,这个只是jenkins本身连接仓库获取jenkinsfile的,只在任意一台node上认证就可以

ssh-keygen
ssh-copy-id [email protected]
ssh [email protected]

4)添加 Credentials
Kubernetes与Jenkins的CI/CD_第14张图片

cat /root/.ssh/id_rsa --》私钥

Kubernetes与Jenkins的CI/CD_第15张图片

5)保存

7、更改凭据
Kubernetes与Jenkins的CI/CD_第16张图片

1)更改credentialsId 、url git仓库
Kubernetes与Jenkins的CI/CD

2)添加jenkins部署发布到k8s的凭据
Kubernetes与Jenkins的CI/CD_第17张图片

Kubernetes与Jenkins的CI/CD_第18张图片

将以上生成的id更改为pipeline上的id
Kubernetes与Jenkins的CI/CD_第19张图片

Kubernetes与Jenkins的CI/CD_第20张图片

更改下管理k8s的id:
Kubernetes与Jenkins的CI/CD_第21张图片

提交到git仓库,并打Tag
[root@docker java-demo]# git add .
[root@docker java-demo]# git commit -m 'deploy'
[root@docker java-demo]# git tag 1.0
[root@docker java-demo]# git push origin 1.0
[root@docker java-demo]# git push origin master #必须要推送到master上,因为在jenkins上定义的是master分支的

8、安装插件
Extended Choice Parameter
Git Parameter

9、jenkins配置参数化构建
1)这个要开启,若是禁用则连不上slave
TCP port for JNLP agents 50000 ,就是jenkins连接 slave的默认端口
Kubernetes与Jenkins的CI/CD_第22张图片

2)设置tag的变量
Kubernetes与Jenkins的CI/CD_第23张图片

3)构建发布
Kubernetes与Jenkins的CI/CD_第24张图片

4)因为这种是每次自动启一个slave的pod分配job,所以每次maven编译都要下载jar包,这里就耽误了几分钟时间,建议slave用物理机单独部署,缓存jar包,就不用每次都下载jar包

5)initialDelaySeconds 60 启动还需要等待一分钟,后续可以改小一点

6)还可以设置命名空间
Kubernetes与Jenkins的CI/CD_第25张图片

Kubernetes与Jenkins的CI/CD_第26张图片

选择后会在(Jenkinsfile)pipeline上用到

10、回滚
#查看发布历史
kubectl rollout history deployment/nginx

#查看指定版本对应的Deployment的API对象细节
kubectl rollout history deployment/nginx --to-revision=3

#回滚到上一个版本
kubectl rollout undo deployment/nginx

#回滚到指定版本号
kubectl rollout undo deployment/nginx --to-revision=3

#查看部署状态
kubectl rollout status deployment/nginx

11、jenkins上创建回滚的job
1、创建
Kubernetes与Jenkins的CI/CD_第27张图片

2、需要将jenkins中的pod ssh 192.168.1.13上

1)ssh-keygen
2)ssh-copy-id [email protected]
3)ssh [email protected] 'kubectl get pods'
4)更改matser 192.168.1.13上的
Kubernetes与Jenkins的CI/CD_第28张图片

Kubernetes与Jenkins的CI/CD_第29张图片

Kubernetes与Jenkins的CI/CD_第30张图片

3、执行shell脚本
echo $project && echo $Namespace
ssh [email protected] "kubectl rollout undo deployment $project -n $Namespace"
Kubernetes与Jenkins的CI/CD_第31张图片

4、回滚到上一个版本

Kubernetes与Jenkins的CI/CD_第32张图片