Jenkins鏈接Kubernetes集群


Jenkins CI/CD介紹

       持續構建與發布是我們工作中必不可少的一個步驟,目前大多公司都采用Jenkins集群來搭建符合需求的CI/CD流程,然而傳統的Jenkins Slave一主多從方式會存在一些痛點,比如:主 Master 發生單點故障時,整個流程都不可用了;每個Slave的配置環境不一樣,具有比較大的差異性,這些差異化的配置導致管理起來非常不方便,維護起來也是比較費勁;資源分配不均衡,有的Slave要運行的job出現排隊等待,而有的Slave處於空閑狀態;最后資源有浪費,每台Slave可能是實體機或者V,當 Slave 處於空閑狀態時,也不會完全釋放掉資源。
       由於傳統的Jenkins具有上述痛點,因此我們希望有一種更優秀更合理的方式來完成CI/CI流程。容器化技術的產生給我們帶來了希望,Docker容器可以很好的對Slave節點的環境進行封裝,解決掉每個Slave配置差異化的問題。而Kubernetes容器管理平台又可以很好的解決資源分配不均勻的問題。示意圖如下:

        從圖中可以看到:Master節點和Slave節點都以容器的方式運行,而不是固定在某一台服務器上,大大的增加了CI/CD的健壯性。本文為了簡化Master節點的搭建難度,並沒有將Master節點部署到集群當中,而是單獨部署在另一台服務器上,以容器的方式運行。CI/CD的大致流程是:jenkins的Master節點觸發任務運行,任務觸發kubernetes創建Pod,Pod里面會運行Slave容器,Slave容器鏈接Master進行具體的處理流程。

安裝Jenkins的Master節點

# 1.拉取鏡像
docker pull jenkins/jenkins

# 2.啟動命令
docker run -itd -p 9090:8080 -p 50000:50000 --name jenkins --privileged=true --restart=always  -v /jenkins:/var/jenkins_home jenkins/jenkins:latest
#
--privileged=true 使得container內的root擁有真正的root權限
#
--restart=always 服務器重啟時會自動啟動容器
# 3.查看網頁登錄需要的Password 
docker exec jenkins
cat /var/jenkins_home/secrets/initialAdminPassword

Jenkins鏈接kubernetes集群

第一步:安裝kubernetes插件

管理員賬戶登錄Jenkins Master頁面,點擊 “系統管理” —> “插件管理” —> “可選插件” —> “Kubernetes plugin” 勾選安裝即可。

第二步:網頁配置(重點)

安裝完畢后,點擊 “系統管理” —> “系統設置” —> “新增一個雲” —> 選擇 “Kubernetes”,然后填寫Kubernetes和Jenkins配置信息。

圖中黑色部分比較簡單,紅色部分較難,需要單獨說明。名稱字段隨意填寫即可;kubernetes地址填寫的是kubernetes集群apiserver的地址,注意是https協議;證書和憑據在下面說明,可以通過點擊連接測試按鈕,查看是否連接成功;jenkins地址填寫訪問jienkins的網頁地址即可。

生成證書和憑據

# 1.在kubernetes的master節點上安裝生成證書的文件
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 && chmod +x cfssl_linux-amd64 && mv cfssl_linux-amd64 /usr/local/bin/cfssl

wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 && chmod +x cfssljson_linux-amd64 && mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 && chmod +x cfssl-certinfo_linux-amd64 && mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo

# 2. 生成json文件
cat >> admin-csr.json <<EOF
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "hangzhou",
      "L": "XS",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
EOF

# 3.生成以下三個文件:admin.csr admin-key.pem admin.pem
cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key --profile=kubernetes admin-csr.json | cfssljson -bare admin

# 4.生成pkc格式證書jenkins-admin.pfx
openssl pkcs12 -export -out ./jenkins-admin.pfx -inkey ./admin-key.pem -in ./admin.pem -passout pass:secret

# 5.查看憑證(全部復制,包括起始和結束兩行)
cat /etc/kubernetes/pki/ca.crt

添加憑據

輸入密碼 secret,后面的內容可以不填寫,點擊添加

環境搭建也可參考博客:https://www.cnblogs.com/xiao987334176/p/11338827.html

Jenkins上配置pipline任務,測試環境搭建是否成功

pipeline {
  agent any
  
  stages {
    stage("one") {
      agent {
        kubernetes {
          yaml """
            apiVersion: v1
            kind: Pod
            metadata:
              name: test1
            spec:
              containers:
                - name: busybox
                  image: 192.168.1.9:5000/busybox1:latest
                  command:
                  - cat
                  tty: true
          """
        }
      }
      
      steps{
        container("busybox") {
          sh """
            echo "first step"
            hostname
          """
        }
      
      }
    }
    
    stage("two") {
      agent {
        kubernetes {
          yaml """
            apiVersion: v1
            kind: Pod
            metadata:
              name: test1
            spec:
              containers:
                - name: busybox
                  image: 192.168.1.9:5000/busybox2:latest
                  command:
                  - cat
                  tty: true
          """
        }
      }
      
      steps{
        container("busybox") {
          sh """
            echo "two step"
            hostname
          """
        }
      
      }
    }
  }
}

如上述代碼:一共包含兩步,分別使用的是不同的鏡像,隨機運行在集群的某一個節點上,可以通過parallel實現並行,大大減少運行的時間。可以參考 https://testerhome.com/topics/22280 進行原理性理解,主要部分如下圖所示。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM