结构
- 发布流程设计
- 部署Harbor镜像仓库
- 部署Git仓库
- 构建Jenkins-Slave镜像
- 在Kubernetes中部署Jenkins
- Jenkins与Kubernetes集成
- 流水线发布Java项目
- 回滚
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
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
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上创建获取镜像的权限
生成密钥:参考 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有无创建
3)访问-->可以看到这个pod分配在了哪个node上
http://192.168.1.24:30009
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 下
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
8)授权成功
9)这个配置文件要放到jenkins上集成
4、设置jenkins
1)在系统管理---》插件管理--》Advanced--》更改为http
http://updates.jenkins.io/update-center.json
2)安装插件
Kubernetes Continuous Deploy
Kubernetes
Kubernetes 地址 :https://kubernetes.default #这个就是dns解析,根据svc匹配
一定要测试是否成功
4)保存
5、搭建git仓库
1)先登录到192.168.1.24 下载源码
[root@docker ~]# git clone https://github.com/lizhenliang/tomcat-java-demo.git
3)192.168.1.24 更改git提交仓库,再将代码提交到这个仓库中
4)192.168.1.24 上 执行:git push origin master
5)在192.168.1.23上拉去代码
git clone [email protected]:/home/git/java-demo
1)准备好2个文件
deploy.yaml
Jenkinsfile
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]
cat /root/.ssh/id_rsa --》私钥
5)保存
提交到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的默认端口
4)因为这种是每次自动启一个slave的pod分配job,所以每次maven编译都要下载jar包,这里就耽误了几分钟时间,建议slave用物理机单独部署,缓存jar包,就不用每次都下载jar包
5)initialDelaySeconds 60 启动还需要等待一分钟,后续可以改小一点
选择后会在(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
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上的
3、执行shell脚本
echo $project && echo $Namespace
ssh [email protected] "kubectl rollout undo deployment $project -n $Namespace"
4、回滚到上一个版本