在生產環境中,咱們一般會使用Jenkins流水線部署k8s羣集,這裏主要介紹使用Jenkins的pipline可選擇分支實現k8s羣集的發佈、更新、回滾功能。java
角色 | IP地址 | 部署軟件 | 硬件 | 系統 |
---|---|---|---|---|
master | 192.168.154.134 | docker 、k8s | 2C2G | CentOS 7.6 |
node02 | 192.168.154.132 | docker 、k8s | 2C2G | CentOS 7.6 |
node01 | 192.168.154.129 | docker、docker-compose、harbor 、k8s | 2C2G | CentOS 7.6 |
gitlab | 192.168.154.131 | gitlab 、git、mysql | 2C3G | CentOS 7.6 |
jenkins | 192.168.154.128 | jdk、git、jenkins、docker、maven | 2C2G | CentOS 7.6 |
有2個分支branch=(master,develop),能夠任意選擇分支構建node
爲了作實驗,修改背景圖片來作區別
master 分支:背景圖片上面版本號:v1.0
develop 分支:背景圖片上面版本號:v2.0mysql
每一個分支都有2個構建方法action=(release,rollback),能夠任意選擇方法git
方法release:正常版本發佈
方法rollback:出現問題時,緊急回滾上一個版本web
實現選擇各分支和各方法,隨意組合,構建版本sql
參考博客 http://www.javashuo.com/article/p-nubvpgfx-ve.htmldocker
pipeline { agent any // 拉取代碼 stages { stage('GetCode') { when { environment name: 'action', value: 'release' } steps { println("your choices are Branch:${branch} action:${action} version:1.0 ! ") sleep 3 } } // 代碼編譯 stage('Maven Build') { when { environment name: 'action', value: 'release' } steps { sh ''' export JAVA_HOME=/usr/local/java /usr/local/apache-maven-3.6.3/bin/mvn clean install -Ptest ''' } } // 項目打包成鏡像並推送到倉庫 stage('Build and Push Image') { when { environment name: 'action', value: 'release' } steps { sh ''' REPOSITORY=192.168.154.129/maven-test01/maven-quartz:v1 #develop是v2 docker build -t $REPOSITORY . docker login 192.168.154.129 -u admin -p Harbor12345 docker push $REPOSITORY ''' } } // 部署到K8S主機 stage('Deploy to k8s') { when { environment name: 'action', value: 'release' } steps { sh ''' scp k8s.sh root@192.168.154.134:/root/ ssh root@192.168.154.134 "chmod +x k8s.sh && sh /root/k8s.sh" '''} } // K8S緊急時回滾 stage('Rollback to k8s') { when { environment name: 'action', value: 'rollback' } steps { echo "k8s images is rolled back! " sh ''' ssh root@192.168.154.134 "kubectl rollout undo deployment/tomcat-dpm -n default" ''' } } } }
注意:使用ssh命令不能遠程使用k8s相關命令,須要修改master服務器的環境變量shell
vim /root/.bashrc
末尾添加:apache
export KUBECONFIG=/etc/kubernetes/admin.conf
source /root/.bashrc #刷新vim
#從harbor拉取鏡像 FROM 192.168.154.129/maven-test01/tomcat:v1 #鏡像構建人信息(可選) MAINTAINER zhao #刪除webapps目錄下文件 RUN rm -rf /usr/local/tomcat/webapps/* #複製打的最新war包到webapps目錄 ADD target/quartz.war /usr/local/tomcat/webapps/
#/bin/bash #定義文件數變量 value1=`ls /root/tomcat-deployment.yml |wc -l` value2=`ls /root/tomcat-service.yml |wc -l` #檢測tomcat-deployment.yml腳本是否存在 if [ "$vlaue1" == "0" ]; then scp tomcat-deployment.yml root@192.168.154.134:/root/ kubectl create -f tomcat-deployment.yml echo "tomcat-deployment.yml is created!" fi #檢測tomcat-service.yml腳本是否存在 if [ "$vlaue2" == "0" ]; then scp tomcat-service.yml root@192.168.154.134:/root/ kubectl create -f tomcat-service.yml echo "tomcat-service.yml is created!" fi #檢測2個腳本存在的狀況 if [ "$value1" == "1" ] && [ "$value2" == "1" ]; then kubectl set image deployment tomcat-dpm tomcat-cluster=192.168.154.129/maven-test01/maven-quartz:v1 #develop是v2 echo "k8s image is updated !" fi #查看pod kubectl get pod -o wide #查看service kubectl get svc
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: tomcat-dpm spec: replicas: 2 template: metadata: labels: # Pod副本擁有的標籤,對應RC的Selector app: tomcat-cluster spec: containers: - name: tomcat-cluster image: 192.168.154.129/maven-test01/maven-quartz:v1 #develop分支 是v2 imagePullPolicy: Always ports: - containerPort: 8080 # 容器應用監聽的端口號 imagePullSecrets: - name: login
apiVersion: v1 kind: Service metadata: name: tomcat-service labels: app: tomcat-service spec: type: NodePort selector: app: tomcat-cluster ports: - port: 8000 targetPort: 8080 nodePort: 32500
備註:develop分支和master內容同樣(除了背景圖)
預期效果:頁面顯示版本爲v1.0
結果:和預期同樣,成功!
預期效果: 頁面顯示版本爲v2.0
結果:和預期同樣,成功!
預期效果:頁面顯示版本爲v1.0 (上一次master構建)
結果:和預期同樣,成功!
預期效果:頁面顯示版本爲v2.0 (在master構建後回滾)
實驗結果:和預期同樣,成功!
1.在分支裏面填寫變量名字$branch
安裝 Build With Parameters 、Persistent Parameter 插件(添加構建參數過程)
安裝Git Parameter 插件(選擇分支)
必定要重啓Jenkins,才能生效
release 方法條件: when { environment name: 'action', value: 'release' }
rollback 方法條件: when { environment name: 'action', value: 'rollback' }
插入位置:在 stag和steps之間
發佈條件:沒有 tomcat-deployment.yml 和tomcat-serive.yml 腳本
更新條件:有 tomcat-deployment.yml 和tomcat-serive.yml 腳本且運行
1.已經建立pod和service
2.使用k8s更新命令後的鏡像
3.使用k8s回滾命令
1.編寫腳本,可參考博客 https://blog.51cto.com/13760351/2504882
2.儘可能將腳本寫在gitlab中,不要寫在k8s節點裏面,避免一個個建立,修改。
1.這個實驗,我花了快一週的時間去完成的,之間出現不少問題,也解決了。
2.若後續再添加其餘參數構建,部署方法相似
3.推薦作實驗的電腦內存大於16G,要否則會很卡。
4.其實也能夠只用shell腳本實現這些功能,我這裏主要是爲了學習pipline腳本編寫能力。
參考博客:http://www.javashuo.com/article/p-avfqciyb-bd.html