- k8s集羣環境(我這裏是三臺的K8s集羣);
- 單獨一臺docker服務器,主要用於向私有倉庫上傳鏡像,Jenkins和gitlab也部署在這臺服務器;
- 上述環境共計服務器4臺,均指向同一個私有倉庫,以便共享docker鏡像;
- 服務器IP依次爲192.168.20.二、20.三、20.四、20.5(前三個IP爲K8s集羣中的節點)
Jenkins採用war包的方式部署,須要用到tomcat環境,自行參考博文,進行部署;
其餘環境部署能夠參考如下博文:
Tomcat安裝及優化配置;
Docker的安裝詳細配置;
K8s(Kubernetes)簡介及安裝部署。html
注:如下用到的全部包文件,均可以從個人網盤連接中下載。java
任意能夠運行docker容器的節點部署便可。這裏我選擇在192.168.20.5這臺主機。node
[root@jenkins ~]# docker run -tid --name registry --restart=always -p 5000:5000 -v /data/registry:/var/lib/registry registry
#選擇任意一個節點進行如下操做 [root@jenkins ~]# vim /usr/lib/systemd/system/docker.service #修該下面的配置項,以便指定其私有倉庫的監聽地址 ExecStart=/usr/bin/dockerd -H unix:// --insecure-registry 192.168.20.5:5000 #將修改後的配置文件發送到其餘節點 [root@jenkins ~]# scp /usr/lib/systemd/system/docker.service 192.168.20.2:/usr/lib/systemd/system/ [root@jenkins ~]# scp /usr/lib/systemd/system/docker.service 192.168.20.3:/usr/lib/systemd/system/ [root@jenkins ~]# scp /usr/lib/systemd/system/docker.service 192.168.20.4:/usr/lib/systemd/system/
如下操做,須要在每一個節點依次進行配置。nginx
[root@jenkins ~]# systemctl daemon-reload [root@jenkins ~]# systemctl restart docker
在部署Jenkins以前,自行部署tomcat服務,參考博文:Tomcat安裝及優化配置。git
部署Jenkins所須要的源碼包及插件,能夠從個人網盤連接中下載。web
[root@jenkins src]# cd /usr/local/tomcat/webapps/ #刪除原來的網頁目錄下全部內容(根據實際狀況來定,最好作個備份) [root@jenkins webapps]# rm -rf * [root@jenkins webapps]# rz #上傳Jenkins的war包 [root@jenkins webapps]# ls jenkins.war #指定Jenkins的家目錄 [root@jenkins webapps]# vim ../bin/catalina.sh #編輯此文件 #!/bin/sh #在文件開頭該行下面添加便可 export CATALINA_OPTS="-DJENKINS_HOME=/data/jenkins" export JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.ClassicPluginStrategy.noBytecodeTransformer=true" #啓動tomcat [root@jenkins webapps]# cd ../bin/ [root@jenkins bin]# ./catalina.sh start #肯定端口在監聽 [root@jenkins bin]# netstat -anpt | grep 8080 tcp6 0 0 :::8080 :::* LISTEN 58560/java
要想實現Jenkins的CI/CD,必須有GitLab、GitLab HOOK、Git Lab Authentication這三個插件,國內不太好下載這幾個插件,在我上面的網盤連接中有打包好的插件,直接解壓到對應目錄便可。docker
瀏覽器訪問如下tomcat服務的IP+端口/Jenkins,如:192.168.20.5:8080/jenkins,便可看到以下界面(訪問前最好先斷掉外網,不然在輸入密碼後,會讓在線安裝插件,比較慢,並且頗有可能安裝失敗):shell
自行根據提示查看密碼並粘貼到相應位置,以下,查看密碼:vim
[root@jenkins webapps]# cat /data/jenkins/secrets/initialAdminPassword ed0a933859e0470f9095680a2059c19a
輸入密碼後,等待片刻,而後點擊以下:api
建立相應用戶:
登陸成功後,以下:
如今關閉瀏覽器頁面,對Jenkins添加插件:
[root@jenkins src]# rm -rf /data/jenkins/plugins/ #刪除原來的空目錄 [root@jenkins src]# tar zxf plugins.tar.gz -C /data/jenkins/ #重啓tomcat以便生效 [root@jenkins src]# /usr/local/tomcat/bin/catalina.sh stop [root@jenkins src]# /usr/local/tomcat/bin/catalina.sh start
再次訪問Jenkins的web界面:
能夠看到已經變成了中文頁面,說明插件配置生效,以下:
想了想,仍是懶得再截圖寫了,參考我以前的博文來部署gitlab吧,我也是看那個博文部署的(在安裝gitlab後,先別接着操做,須要看下面的注意事項,進行更改監聽端口),最後保證能夠將遠端的庫克隆到本地便可,我這裏將gitlab和Jenkins部署在同一臺服務器。參考博文:持續集成之Gitlab安裝與應用
注意事項!!!
在安裝gitlab後,須要更改其監聽端口(防止端口衝突),以下:
[root@jenkins src]# vim /etc/gitlab/gitlab.rb #更改以下 external_url 'http://192.168.20.5:90' unicorn['listen'] = '192.168.20.5' #本機IP unicorn['port'] = 3000
更改完成監聽端口後,再按照那個博文進行接下來的操做便可(可是端口和那篇博文已經不同了,好比查詢端口有沒有再監聽,應該看的是90端口而不是80端口了,訪問瀏覽器頁面也是,須要加90端口)。
最後保證本地有克隆的庫便可,以下:
[root@jenkins ~]# ls -d teset01/ teset01/
將如下shell腳本內容粘貼到web界面,腳本以下:
#腳本中的IP,192.168.20.5爲私有倉庫的IP,192.168.20.2爲k8s集羣中master的IP地址 #!/bin/bash backupcode="/data/backcode/$JOB_NAME/$BUILD_NUMBER" #這裏引用了Jenkins的默認變量 mkdir -p $backupcode chmod 644 "$JENKINS_HOME"/workspace/"$JOB_NAME"/* rsync -acP "$JENKINS_HOME"/workspace/"$JOB_NAME"/* $backupcode echo From 192.168.20.5:5000/nginx > "$JENKINS_HOME"/workspace/Dockerfile echo COPY ./"$JOB_NAME"/* /usr/share/nginx/html/ >> "$JENKINS_HOME"/workspace/Dockerfile docker rmi 192.168.20.5:5000/nginx docker build -t 192.168.20.5:5000/nginx /"$JENKINS_HOME"/workspace/. docker push 192.168.20.5:5000/nginx ssh root@192.168.20.2 kubectl delete deployment nginx ssh root@192.168.20.2 kubectl apply -f /root/nginx.yaml
腳本填寫後,以下:
腳本填寫後,先別保存,根據如下操做複製一下Jenkins的地址,以下:
如下操做,在新建的庫中進行,我忘了截切換到新建庫的那一步的圖了:
保存後,下拉頁面,便可看到新添加的web-hook,點擊以下,進行測試:
返回狀態碼200,則表示配置無誤,以下:
jenkins服務器配置以下:
[root@jenkins ~]# ssh-copy-id root@192.168.20.2 #上面的IP爲K8s羣集中master節點IP
#向私有倉庫上傳所需鏡像 [root@jenkins ~]# docker tag nginx:latest 192.168.20.5:5000/nginx:latest [root@jenkins ~]# docker push 192.168.20.5:5000/nginx:latest #在master節點上面運行nginx資源對象 [root@master ~]# vim nginx.yaml #編寫yaml文件 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx spec: replicas: 2 template: metadata: labels: name: nginx spec: containers: - name: nginx image: 192.168.20.5:5000/nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: labels: name: nginx name: nginx spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 31234 selector: name: nginx [root@master ~]# kubectl apply -f nginx.yaml #執行yaml文件 [root@master ~]# kubectl get pod | grep nginx #肯定容器運行正常 nginx-76645bc84f-rbgtl 1/1 Running 0 68s nginx-76645bc84f-s6xp6 1/1 Running 0 68s
#在克隆到本地的庫中上傳文件到gitlab [root@jenkins ~]# cd teset01/ [root@jenkins teset01]# git config --global user.name "test" [root@jenkins teset01]# git config --global user.email "test@test.com" [root@jenkins teset01]# echo "test ....." > index.html [root@jenkins teset01]# git add * [root@jenkins teset01]# git commit -m "Test CI/CD" [root@jenkins teset01]# git push origin master
在進行上述操做後,便可在Jenkins新建的任務中,看到構建成功的信息,以下:
再次訪問nginx首頁,發現已經變成了咱們在gitlab上提交的內容,以下:
測試完成。
附加:歷史版本內容存放路徑以下:
[root@jenkins data]# pwd #肯定當前路徑 /data [root@jenkins data]# tree backcode/ #這個目錄下記錄的是歷史版本的代碼 backcode/ └── test-01 ├── 1 │ └── README.md ├── 2 │ ├── a.html │ └── README.md ├── 3 │ └── README.md ├── 4 │ ├── a.html │ └── README.md ├── 5 │ └── README.md └── 6 ├── index.html └── README.md [root@jenkins workspace]# pwd #再次肯定當前路徑 /data/jenkins/workspace [root@jenkins workspace]# ls #此目錄下是將新代碼構建成鏡像的關鍵所在,Dockersfile就在這個目錄下 Dockerfile test-01