Jenkins連接k8s的多種姿勢

2022-01-25 仙人技術

目錄

1、概述

2、同集群

3、跨集群

3.1 埠有什麼

3.2 網絡策略打通

3.3 證書的生成和配置

3.4 配置連接外部的 k8s 集群

4、測試驗證

4.1 配置 pod template

4.2 自由風格構建測試

4.3 流水線構建測試


1、概述

本文分享的是基於k8s環境與jenkins實現CI/CD其中的一個配置具體實現

即:不同環境下 jenkins 與 k8s 集群連接的問題

為什麼會有不同的環境?我總結的原因如下:

a、在實際生產環境中,由於某些歷史原因我們或許不能完美的實現所謂的一切皆「雲原生」,例如有傳統的jenkins和執行專有任務的slave節點

b、存在多集群共一個jenkins服務端的情況,例如k8s中集群A用作基礎設施集群(包含日誌、存儲、devops平臺),集群B、C、D用作不同業務線集群

因此,我們可以將不同環境定義為如下兩種情況:

同集群:指k8s集群內部的jenkins連接本集群

跨集群:指外部的jenkins連接k8s集群,或者是jenkins連接外部的k8s集群

2、同集群

同集群下,k8s集群內部的jenkins連接所在的k8s集群。這是原生的方式:我們的環境都是全新的,全新的機器、全新安裝的集群、全新的jenkins,總之一切都是新的,沒有任何歷史問題

由於在k8s集群內部部署jenkins時,已經對jenkins做了以下相關的角色授權綁定

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
  namespace: kube-system

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: jenkins
  namespace: kube-system
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
  resources: ["pods/exec"]
  verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
  resources: ["pods/log"]
  verbs: ["get","list","watch"]
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get"]

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: jenkins
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: jenkins
subjects:
- kind: ServiceAccount
  name: jenkins
  namespace: kube-system

因此只需要在jenkins中配置相應的連接地址就可以了

在jenkins中安裝好k8s插件後,打開jenkins——>系統管理——>系統配置——>新增一個kubernetes雲

配置名稱,即這個雲的別名

Kubernetes地址,即在集群內部暴露的k8s service名稱

Kubernetes命名空間,這個配置就填寫jenkins所屬的namespace

Jenkins地址,填寫jenkins svc的名稱

配置完成後點擊測試連接成功

後面配置pod template這裡不做介紹,這裡配置的pod template是默認情況下jenkins slave的pod模板,當然也可以在每個流水線中單獨指定

配置完成後的動態創建jenkins slave pod測試在本文後面一併給出

3、跨集群

一個實際場景:jenkins部署在A集群或部署在傳統VM的環境下,想通過jenkins連接B集群,動態創建pod用以執行構建任務

3.1 埠有什麼

既然是跨集群,那麼首先需要考慮的就是網絡問題,網絡是否可達?需要開通哪些埠的安全組策略?

在這之前,就需要先了解一下jenkins的運行機制及埠有哪些?

http 埠:默認8080,如果在jenkins前面做了反向代理並配置了域名,那麼可能是常見的80/443埠,我這裡通過域名+https的方式訪問jenkins

Agent Port:基於JNLP的Jenkins代理通過TCP默認埠50000與Jenkins進行通信

SSH port:jenkins作為ssh伺服器,這個一般不會使用,具體使用可參考我之前的文章Jenkins workflowLibs 庫的使(妙)用

3.2 網絡策略打通

由上面知道了有哪些埠之後,因此需要打通的網絡策略包括

B 集群節點連接jenkins暴露的http port和Agent portA 集群節點(即jenkins server)連接B集群kube-apiserver暴露的埠

除網絡策略之外,如果jenkins UI的地址,例如通過ingress設置了白名單限制訪問,還需要將B集群的相關源ip設置為白名單

3.3 證書的生成和配置3.3.1 kubeconfig 文件

由於這裡A集群中的jenkins並沒有對B集群的操作權限,因此需要配置授權,即發起對B集群的kube apiserver的請求,和kubectl一樣利用config文件用作請求的鑑權,默認在~/.kube/config下,當然我們也可以單獨嚴格指定權限細節,生成一個jenkins專用的config文件,這裡就不再延伸了,kubeconfig文件的組成如下

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: xxx
    server: https://<master-ip>:6443
  name: cluster1
contexts:
- context:
    cluster: cluster1
    user: admin
  name: context-cluster1-admin
current-context: context-cluster1-admin
kind: Config
preferences: {}
users:
- name: admin
  user:
    client-certificate-data: xxx
    client-key-data: xxx

其中包含了3段證書相關的內容,也就是我們常見的證書組成格式:ca.crt、client.crt、client.key

3.3.2 生成證書

在jenkins中能夠識別的證書文件為PKCS#12 certificate,因此需要先將kubeconfig文件中的證書轉換生成PKCS#12格式的pfx證書文件

首先,使用yq命令行工具來解析yaml並通過base 64解碼生成各個證書文件

服務端證書:

certificate-authority-data——>base 64解碼——>ca.crt

yq e '.clusters[0].cluster.certificate-authority-data' .kube/config | base64 -d > ca.crt

客戶端證書

client-certificate-data——>base 64解碼——>client.crt

yq e '.users[0].user.client-certificate-data' .kube/config | base64 -d > client.crt

client-key-data——>base 64解碼——>client.key

yq e '.users[0].user.client-key-data' .kube/config | base64 -d > client.key

然後,通過openssl進行證書格式的轉換,生成Client P12認證文件cert.pfx

openssl pkcs12 -export -out cert.pfx -inkey client.key -in client.crt -certfile ca.crt
Enter Export Password:  # 輸入密碼加密
Verifying - Enter Export Password:

通過踩坑證明,這裡必須輸入密碼,不然在後面添加jenkins相關配置後驗證會報錯

3.3.3 導入證書

生成文件後,打開jenkins的web界面

添加全局憑據,憑據的類型選擇Certificate,選擇Upload PKCS#12 certificate

上傳剛才生成的cert.pfx證書文件

輸入通過openssl生成證書文件時輸入的密碼

檢查上傳的證書文件,此時可以查看到,jenkins已經成功加載了證書文件並讀取了證書文件的相關信息

3.4 配置連接外部的 k8s 集群

在jenkins中新增kubernetes雲配置

同樣的,打開jenkins——>系統管理——>系統配置——>新增一個kubernetes雲

配置名稱,即這個雲的別名,為外部的 k8s 集群起一個別名

Kubernetes地址,這裡需要填寫的是外部集群的kube-apiserver地址,即https://<master ip>:6443

Kubernetes服務證書key,填寫上面服務端證書base64解碼後的內容

Kubernetes命名空間,填寫jenkins所屬的namespace

憑據選擇上面導入的證書文件作為憑據

Jenkins地址,填寫A集群現有jenkins UI域名(訪問地址和埠)

配置完成後點擊測試連接成功,到這裡跨集群的jenkins連接k8s就成功了

4、測試驗證4.1 配置 pod template

這裡以跨集群的環境下進行測試驗證A集群的jenkins執行構建任務,在B集群中動態創建slave的預期結果

在jenkins系統配置中,除了配置關聯外部集群外,這裡再配置一下相應的pod template,以便於在B集群中創建默認的slave pod,如圖

4.2 自由風格構建測試

在自由風格中限制項目的運行節點,標籤為上面配置的pod template標籤即k8s-test-cluster,執行shell命令進行測試,查看控制臺輸出

4.3 流水線構建測試

編寫測試的pipeline流水線,同樣指定標籤為上面配置的pod template標籤即k8s-test-cluster

pipeline{
    agent{
        node {
            label 'k8s-test-cluster-jnlp-slave'
        }
    }
    stages{
        stage('Deploy to Kubernetes'){
            steps{
                script{
                  sh """
                      kubectl version
                      kubectl get cs
                  """
                }
            }
        }
    }
}

構建後查看控制臺輸出

到這裡,基於不同基礎環境下jenkins與k8s連接配置的相關操作就分享完啦

See you ~

相關焦點

  • 基於k8s部署cicd之新建jenkins任務、編寫shell命令(5)
    收錄於話題 #k8s2、對k8s有較熟練的認識3、對rancher 有過使用經驗,基礎操作要懂4、對ci/cd 的概念不陌生5、對golang的基礎有較熟悉6、知道jenkins的最基本使用7、知道git的基本使用,對gitlab、gitea 有基本了解在 基於k8s部署cicd之利用rancher快速部署jenkins
  • 基於 Kubernetes 構建企業 Jenkins 持續集成平臺
    : jenkins2 namespace: kube-ops---kind: RoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata: name: jenkins2 namespace: kube-opsrules: - apiGroups: ["extensions", "apps"] resources:
  • Docker+Jenkins+Github實現Golang項目自動部署
    服務拉取github上的項目構建golang項目並生成docker鏡像[jenkins調用的是宿主機上的docker環境,如何調用的,後面會說明]啟動golang項目的docker鏡像docker的安裝這裡就不說了
  • Jenkins詳細教程
    比如,我們完成單元測試後,可以把代碼部署到連接資料庫的Staging環境中更多的測試。如果代碼沒有問題,可以繼續手動部署到生產環境。下圖反應的是CI/CD 的大概工作模式。https://pkg.jenkins.io/redhat-stable/jenkins.reposudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.keyyum install jenkins配置文件配置文件在
  • Jenkins插件-常用
    A、通用插件1、Embeddable Build Status Icon 連結:https://ci.jenkins-ci.org/job/lib-jira-api/badge/ | https://wiki.jenkins-ci.org/display/JENKINS/Embeddable
  • 一個本地快速搭建 Jenkins 的方法
    這個插件通過旋轉和拆卸新代理,使 Jenkins 集群更容易擴展,使團隊成員能夠向構建農場貢獻計算資源,或者附加 Jenkins 控制器無法發起連接的代理。工具打包首先需要基於官方 LTS 鏡像製作包含上面插件的鏡像FROM jenkins/jenkins:2.319.1-ltsENV JENKINS_SLAVE_AGENT_PORT 50000RUN jenkins-plugin-cli --verbose
  • jenkins詳細介紹
    一、jenkins是什麼?  Jenkins是一個開源的、提供友好操作界面的持續集成(CI)工具,起源於Hudson(Hudson是商用的),主要用於持續、自動的構建/測試軟體項目、監控外部任務的運行。Jenkins用Java語言編寫,可在Tomcat等流行的servlet容器中運行,也可獨立運行。通常與版本管理工具(SCM)、構建工具結合使用。
  • 初識K8S之理論和搭建
    一、什麼是k8sk8s是分布式系統集中式管理。它可以看作是一個分布式系統支撐平臺。二、為什麼要用k8s,它有什麼好處1、 開發人員發布的是鏡像,鏡像裡面是包括環境和包括代碼。所以說本地和線上的運行環境是一樣的。不會存在本地可以。
  • Jenkins Kubernetes操作器成為Jenkins官方子項目!
    https://github.com/SylwiaBrant參考資料[1]Jenkins 操作器: https://www.jenkins.io/projects/jenkins-operator/[2]VirtusLab: http://virtuslab.com/[3]雲原生 SIG 會議: https://www.jenkins.io/sigs/cloud-native
  • 乾貨 | Jenkins使用簡易教程
    Jenkins可以很好的支持各種語言(比如:Java,C#,PHP等)的項目構建,也完全兼容ant、maven、gradle等多種第三方構建工具,同時跟SVN、Git能無縫集成。也支持直接與知名原始碼託管網站,比如GitHub、Bitbucket直接集成。
  • Jenkins持續集成體系 | 最完整的介紹及資料
    jenkins可以很好的支持各種語言(比如:java, c#, php等)的項目構建,也完全兼容ant、maven、gradle等多種第三方構建工具,同時跟svn、git能無縫集成,也支持直接與知名原始碼託管網站,比如github、bitbucket直接集成。簡單點說,Jenkins其實就是大的框架集,可以整個任何你想整合的內容,實現公司的整個持續集成體系!
  • Docker+jenkins小知識,講解通俗易懂,有必要收藏
    有些人可能會想,持續構建很熟悉基本上也就是基於jenkins,沒錯jenkins確實是目前持續集成中最為流程也比較常見的一種解決方案,不過我們今天並不是僅僅單純地講jenkins,而是想再引入另外一個比較新穎也比較火的概念,也就是docker,對於熱點概念比較熟悉的朋友對docker並不陌生,這幾乎是近期最熱點的一門技術之一。
  • k8s之nginx-Ingress-controller如何做高可用應對大並發請求?
    非KeepAlive模式時,每個請求/應答客戶和伺服器都要新建一個連接,完成之後立即斷開連接(HTTP協議為無連接的協議);當使用Keep-Alive模式(又稱持久連接、連接重用)時,Keep-Alive功能使客戶端到服 務器端的連接持續有效,當出現對伺服器的後繼請求時,Keep-Alive功能避免了建立或者重新建立連接。
  • 一篇通俗易通的 Jenkins 入門指南
    安裝Jenkins安裝非常簡單,以CentOS為例,執行以下命令即可sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.reposudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
  • Jenkins 憑證管理 - 看這一篇就夠了~
    在Jenkins中添加/配置credentials,Pipeline項目就可以使用 credentials 與三方應用交互Credential 類型參考: https://jenkins.io/zh/doc/book/using/using-credentials/Jenkins可以存儲以下類型的
  • 陽明k8s視頻課程
    陽明k8s視頻課程我剛好有這方面的學習資料,如果你也有需要,歡迎聯繫微信: pdd1310一起學習,一起進步,更有海量學習資源與你分享
  • 手把手教你利用Docker+jenkins部署你的網站
    中文版docker pull jenkinszh/jenkins-zh這裡選擇的是中文的鏡像創建存儲目錄並授權(很重要)mkdir /home/jenkins_homechown -R 1000 /home/jenkins_homechmod 777 /var/run/docker.sock參考連結:https://www.jianshu.com/p/db58d1cfd01b
  • 使用Kubernetes-Jenkins實現CI/CD
    在接下來的步驟中,我們將從Docker Hub上獲取此鏡像,並創建一個卷/var/jenkins/_home用於存儲Jenkins的數據。存在一個問題雖然我們正在做我們計劃做的一切,我們仍然會遇到一個問題。 你會注意到,每當你要關閉它後,重新啟動你的Jenkins容器,所有的數據都會丟失。 無論你做了什麼,例如創建作業,安裝插件等等,都會丟失。
  • 這麼笨的史丹利,是怎麼學會這該死的k8s容器化的?
    運維就要無所不知,無所不會不會k8s是真的不行!2、 為什麼有人很快就學會了`k8s`。這麼笨的史丹利,是怎麼學會這該死的k8s容器化的?今天和大家聊一聊k8s到底該怎麼學。其實,遇到這個問題的朋友是真的不少。有剛入行的新手朋友,也有已經在行業裡摸爬滾打了小10年的朋友。不管原因幾何,但總歸能側面看出k8s 確實有一些難度。
  • 如何基於k8s快速搭建TeamCity(YAML分享)
    這裡分享下基於本地k8s集群(雲端k8s服務注意使用雲盤或者其他存儲)搭建TeamCity的相關Yaml的配置文件,注意使用「kubectl apply -f <路徑>」命令執行。memory: 2092Mi #預分配內存 volumeMounts: - mountPath: /data/teamcity_server/datadir name: data-vol - mountPath: /opt/teamcity/logs name: log-vol nodeName: k