Kubernetes與Jenkins的CI/CD

結構

  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平臺 。java

2. 部署Harbor鏡像倉庫

https://192.168.1.25/harbornode

3. 部署Git倉庫

192.168.1.25nginx

Kubernetes與Jenkins的CI/CD

4. 構建Jenkins-Slave鏡像

Jenkins-Slave:做用是緩解master上的負載壓力git

master 分派任務(job)給Jenkins-Slave 完成工做github

參考文檔:https://github.com/jenkinsci/docker-jnlp-slavedocker

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

settings.xml:maven的配置文件,獲取jar包的地址變爲阿里雲,原先的apache地址下載很慢apache

一、[root@docker jenkins-salve]# docker build -t test.com/library/jenkins-salve -f dockerfile-jenkins-slave .
二、docker push test.com/library/jenkins-salve:latestjson

Kubernetes與Jenkins的CI/CD

5. 在Kubernetes中部署Jenkins

文檔:https://github.com/jenkinsci/kubernetes-plugin/tree/fc40c869edfd9e3904a9a56b0f80c5a25e988fa1/src/main/kubernetes緩存

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

一、kubectl apply -f rbac.yaml
1)必需要讓k8s認證倉庫,即master上建立獲取鏡像的權限
Kubernetes與Jenkins的CI/CD

生成密鑰:參考 https://blog.csdn.net/xukangkang1hao/article/details/80839834

二、[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)訪問-->能夠看到這個pod分配在了哪一個node上
http://192.168.1.24:30009

Kubernetes與Jenkins的CI/CD

Kubernetes與Jenkins的CI/CD

Kubernetes與Jenkins的CI/CD

三、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

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上集成

四、設置jenkins
1)在系統管理---》插件管理--》Advanced--》更改成http
http://updates.jenkins.io/update-center.json

2)安裝插件
Kubernetes Continuous Deploy
Kubernetes

3)安裝完成後,系統管理---》系統設置---》Cloud
Kubernetes與Jenkins的CI/CD

Kubernetes 地址 :https://kubernetes.default #這個就是dns解析,根據svc匹配
Kubernetes與Jenkins的CI/CD

Kubernetes與Jenkins的CI/CD

必定要測試是否成功

4)保存

五、搭建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

3)192.168.1.24 更改git提交倉庫,再將代碼提交到這個倉庫中
Kubernetes與Jenkins的CI/CD

4)192.168.1.24 上 執行:git push origin master

5)在192.168.1.23上拉去代碼
git clone git@192.168.1.25:/home/git/java-demo

六、jenkins上建立項目--》pipeline
Kubernetes與Jenkins的CI/CD

1)準備好2個文件
deploy.yaml
Jenkinsfile

Kubernetes與Jenkins的CI/CD

2)Repository URL :git倉庫地址 git@192.168.1.25:/home/git/java-demo

3)須要在node上建立一個認證,這個只是jenkins自己鏈接倉庫獲取jenkinsfile的,只在任意一臺node上認證就能夠

ssh-keygen
ssh-copy-id git@192.168.1.25
ssh git@192.168.1.25

4)添加 Credentials
Kubernetes與Jenkins的CI/CD

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

Kubernetes與Jenkins的CI/CD

5)保存

七、更改憑據
Kubernetes與Jenkins的CI/CD

1)更改credentialsId 、url git倉庫
Kubernetes與Jenkins的CI/CD

2)添加jenkins部署發佈到k8s的憑據
Kubernetes與Jenkins的CI/CD

Kubernetes與Jenkins的CI/CD

將以上生成的id更改成pipeline上的id
Kubernetes與Jenkins的CI/CD

Kubernetes與Jenkins的CI/CD

更改下管理k8s的id:
Kubernetes與Jenkins的CI/CD

提交到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分支的

八、安裝插件
Extended Choice Parameter
Git Parameter

九、jenkins配置參數化構建
1)這個要開啓,如果禁用則連不上slave
TCP port for JNLP agents 50000 ,就是jenkins鏈接 slave的默認端口
Kubernetes與Jenkins的CI/CD

2)設置tag的變量
Kubernetes與Jenkins的CI/CD

3)構建發佈
Kubernetes與Jenkins的CI/CD

4)由於這種是每次自動啓一個slave的pod分配job,因此每次maven編譯都要下載jar包,這裏就耽誤了幾分鐘時間,建議slave用物理機單獨部署,緩存jar包,就不用每次都下載jar包

5)initialDelaySeconds 60 啓動還須要等待一分鐘,後續能夠改小一點

6)還能夠設置命名空間
Kubernetes與Jenkins的CI/CD

Kubernetes與Jenkins的CI/CD

選擇後會在(Jenkinsfile)pipeline上用到

十、回滾
#查看發佈歷史
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

十一、jenkins上建立回滾的job
一、建立
Kubernetes與Jenkins的CI/CD

二、須要將jenkins中的pod ssh 192.168.1.13上

1)ssh-keygen
2)ssh-copy-id root@192.168.1.13
3)ssh root@192.168.1.13 'kubectl get pods'
4)更改matser 192.168.1.13上的
Kubernetes與Jenkins的CI/CD

Kubernetes與Jenkins的CI/CD

Kubernetes與Jenkins的CI/CD

三、執行shell腳本
echo $project && echo $Namespace
ssh root@192.168.1.13 "kubectl rollout undo deployment $project -n $Namespace"
Kubernetes與Jenkins的CI/CD

四、回滾到上一個版本

Kubernetes與Jenkins的CI/CD

相關文章
相關標籤/搜索