jinkens+gitlab針對k8s集羣實現CI/CD

1、環境準備

  • 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

2、部署registry私有倉庫

任意能夠運行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/

三、每一個節點依次重啓docker服務,使更改生效

如下操做,須要在每一個節點依次進行配置。nginx

[root@jenkins ~]# systemctl daemon-reload
[root@jenkins ~]# systemctl restart docker

3、部署Jenkins服務並啓動

在部署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

4、配置Jenkins服務

要想實現Jenkins的CI/CD,必須有GitLab、GitLab HOOK、Git Lab Authentication這三個插件,國內不太好下載這幾個插件,在我上面的網盤連接中有打包好的插件,直接解壓到對應目錄便可。docker

一、配置Jenkinsweb界面

瀏覽器訪問如下tomcat服務的IP+端口/Jenkins,如:192.168.20.5:8080/jenkins,便可看到以下界面(訪問前最好先斷掉外網,不然在輸入密碼後,會讓在線安裝插件,比較慢,並且頗有可能安裝失敗):shell

jinkens+gitlab針對k8s集羣實現CI/CD

自行根據提示查看密碼並粘貼到相應位置,以下,查看密碼:vim

[root@jenkins webapps]# cat /data/jenkins/secrets/initialAdminPassword
ed0a933859e0470f9095680a2059c19a

輸入密碼後,等待片刻,而後點擊以下:api

jinkens+gitlab針對k8s集羣實現CI/CD

建立相應用戶:

jinkens+gitlab針對k8s集羣實現CI/CD

jinkens+gitlab針對k8s集羣實現CI/CD

jinkens+gitlab針對k8s集羣實現CI/CD

登陸成功後,以下:

jinkens+gitlab針對k8s集羣實現CI/CD

如今關閉瀏覽器頁面,對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界面:

jinkens+gitlab針對k8s集羣實現CI/CD

能夠看到已經變成了中文頁面,說明插件配置生效,以下:

jinkens+gitlab針對k8s集羣實現CI/CD

5、部署gitlab服務

想了想,仍是懶得再截圖寫了,參考我以前的博文來部署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/

6、配置Jenkins建立一個任務

jinkens+gitlab針對k8s集羣實現CI/CDjinkens+gitlab針對k8s集羣實現CI/CDjinkens+gitlab針對k8s集羣實現CI/CD

jinkens+gitlab針對k8s集羣實現CI/CD

將如下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

腳本填寫後,以下:

jinkens+gitlab針對k8s集羣實現CI/CD

腳本填寫後,先別保存,根據如下操做複製一下Jenkins的地址,以下:

jinkens+gitlab針對k8s集羣實現CI/CD

7、開啓Jenkins的匿名訪問權限

jinkens+gitlab針對k8s集羣實現CI/CD

jinkens+gitlab針對k8s集羣實現CI/CD

jinkens+gitlab針對k8s集羣實現CI/CD

jinkens+gitlab針對k8s集羣實現CI/CDjinkens+gitlab針對k8s集羣實現CI/CD

8、回到gitlab上開啓容許向本身發送web hook

jinkens+gitlab針對k8s集羣實現CI/CD

jinkens+gitlab針對k8s集羣實現CI/CD

如下操做,在新建的庫中進行,我忘了截切換到新建庫的那一步的圖了:
jinkens+gitlab針對k8s集羣實現CI/CD

jinkens+gitlab針對k8s集羣實現CI/CD

保存後,下拉頁面,便可看到新添加的web-hook,點擊以下,進行測試:

jinkens+gitlab針對k8s集羣實現CI/CD

返回狀態碼200,則表示配置無誤,以下:

jinkens+gitlab針對k8s集羣實現CI/CD

9、配置Jenkins免密登陸k8s羣集的master節點

jenkins服務器配置以下:

[root@jenkins ~]# ssh-copy-id root@192.168.20.2
#上面的IP爲K8s羣集中master節點IP

9、測試持續CI/CD效果

一、k8s羣集中運行nginx資源對象

#向私有倉庫上傳所需鏡像
[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

二、客戶端訪問nginx

jinkens+gitlab針對k8s集羣實現CI/CD

三、在gitlab進行版本的更新迭代測試

#在克隆到本地的庫中上傳文件到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新建的任務中,看到構建成功的信息,以下:

jinkens+gitlab針對k8s集羣實現CI/CD

再次訪問nginx首頁,發現已經變成了咱們在gitlab上提交的內容,以下:

jinkens+gitlab針對k8s集羣實現CI/CD

測試完成。

附加:歷史版本內容存放路徑以下:

[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
相關文章
相關標籤/搜索