02.26 「Kubernetes系列」第8篇 CI

前言

  1. 本實踐中已經的示例代碼及jenkins-agent鏡像已經推送歸檔至github,-->傳送門
  2. 注意本實踐中均為內網數據,你測試時一定要改為自己的環境的有效數據。
  3. 由於本實踐涉及組件較多,若有操作不明確的話,你可以後臺留言,我們一起完善。
  4. 具體操作時若有不清楚,或是錯誤可以留言,大家一起解決。

1. 準備基礎數據

  1. 配置gitlab
  • 創建項目
  • 上傳示例代碼

_注_: 本次示例使用的gitlab項目地址為:http://gitlab.hanker.com/colynn/hanker-hello.git

  1. 配置harbor
  • 創建項目, 用於存儲構建的鏡像
    _注_: 本次示例使用的harbor地址為 10.0.0.185:5000/hanker/hanker-hello:v1
  1. jenkins 驗證信息
  • 添加 gitlab 帳號信息

_操作指引_:【Credentials】-> 【System】-> 【Global credentials】-> 【Add Credentials】

「Kubernetes系列」第8篇 CI/CD之全流程實踐

  • harbor 信息

_操作指引_:【Credentials】-> 【System】-> 【Global credentials】-> 【Add Credentials】

「Kubernetes系列」第8篇 CI/CD之全流程實踐

  • k8s namespace驗證信息

在你的k8s master節點上執行如下操作:

1.創建serviceaccount

<code>$ kubectl -n devops create serviceaccount jenkins-robot/<code>

命令輸出:

<code>serviceaccount/jenkins-robot created/<code>

2.角色綁定

<code>$ kubectl -n devops create rolebinding jenkins-robot-binding --clusterrole=cluster-admin --serviceaccount=devops:jenkins-robot/<code>

命令輸出:

<code>rolebinding.rbac.authorization.k8s.io/jenkins-robot-binding created/<code>

3.獲取 ServiceAccount

<code>$ kubectl -n devops get serviceaccount jenkins-robot -o go-template --template='{{range .secrets}}{{.name}}{{"\\n"}}{{end}}'/<code>

jenkins-robot-token-n8w6b

4.基於base64解碼 ServiceToken

<code>$ kubectl -n devops get secrets jenkins-robot-token-n8w6b -o go-template --template '{{index .data "token"}}' | base64 --decode/<code>

命令輸出:

<code>eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZXZvcHMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiamVua2lucy1yb2JvdC10b2tlbi1uOHc2YiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJqZW5raW5zLXJvYm90Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOTcyZTY0OGYtMTYxZC00NmM5LWI0ZjgtYjFkNTdlOWY4NTBjIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRldm9wczpqZW5raW5zLXJvYm90In0.ArQvcaEqCaeU1ZcJ6nOC5rLaTZr_vLDrpLCt87asltMUWj2gSli_mXUTrl09hBnBDXI3A1D4rJXHKLHjIAA4nN8qRIRGbpqSNzDwmqJr-jmmmWWZFrZ3n3Al9-13KJnNOK8pcWr70rt3Rsigt4B6CIQ0-ZLK8BZhvROJSifeOfJ6xe2KBqdXBv1ccZZZfEhPLgGbaR5yWm5jLvOMr2MQiPDrZoHOEkcMt-C0xipytOp4sJCJ4bQhb-UoMu1owYydxbd6O7xO71fvqP_bMDpZXC601nA2ggK7h-vi6CJffHv5MM59q8X_DWe1NnZS6KXiMmkXqAmBn10Yu20PNj-kjg/<code>

5.添加 Secret text驗證信息

_操作指引_:【首頁】->【Credentials】-> 【System】-> 【Global credentials】-> 【Add Credentials】-> 選擇【Secret text】類型

然後將上一步 解碼的結果 更新至 Secret, Pipeline 中

「Kubernetes系列」第8篇 CI/CD之全流程實踐

2. 如何創建 jenkins pipeline

1. 創建jenkins pipeline item

_操作指引_:【首頁】->【New Item】

「Kubernetes系列」第8篇 CI/CD之全流程實踐

2. pipeline>

_注_: pipeline主要包含三個階段(檢出代碼、製作鏡像、部署服務),下面跟大家解釋下,如何編寫pipeline, 藉助Pipeline Syntax生成的只是部分代碼,你可以根據語言規範將其完善。

1.階段1,檢出代碼

_操作指引_:【首頁】->【hanker-hello-demo】-> 【Pipeline Syntax】

「Kubernetes系列」第8篇 CI/CD之全流程實踐

_注_: 本實踐中選取的 git: Git 類型,當然你也可以選擇 checkout: Check out from version control

獲取到該步驟的腳本

<code>git credentialsId: 'gitlab-project-auth', url: 'http://gitlab.hanker.com/colynn/hanker-hello.git'/<code>

2.階段2,構建鏡像_操作指引_:類似於 階段1,

「Kubernetes系列」第8篇 CI/CD之全流程實踐

完善獲取該步驟腳本

<code>script {    withDockerRegistry(credentialsId: 'harbor-auth', url: 'http://10.0.0.185:5000') {        def customImage =  docker.build("10.0.0.185:5000/devops/hanker-hello:v1")        customImage.push()    }}/<code>

_注_: 支持本階段需要jenkins-agent鏡像裡包含docker命令。

3.階段3. 部署服務

_參考_: jenkins kubernetes cli plugin

_注_: 支持本階段需要jenkins-agent鏡像裡包含kubectl命令。

3. 設置 pipeline

_注_:

  • General/ Build Triggers/ Advanced Project Options 這三塊你可以根據自己需要設置,將各階段的腳本合併,更新至 Pipline -> Script內。

合併後的pipeline腳本內容如下:

<code>pipeline {    agent any    stages {        stage('checkout') {            steps {                git credentialsId: 'gitlab-project-auth', url: 'http://gitlab.hanker.com/colynn/hanker-hello.git'                }        }                stage('docker-publish') {            steps{               >
「Kubernetes系列」第8篇 CI/CD之全流程實踐

3. 觸發構建

「Kubernetes系列」第8篇 CI/CD之全流程實踐

4. 結果確認

1.確認 jenkina-agent 啟動狀態;

<code>$ kubectl -n devops get pods |grep jnlpjnlp-sh8zl                                 1/1     Running   0          14s// 查看jenkins-agent pod日誌$ kubectl -n devops logs -f [jenkins-agent-pod-name]/<code>

_注_: 如果長時間沒有啟動jenkins-agent, 可以確認下集群內是否有足夠的資源。

2.確認pipeline 執行狀態;

「Kubernetes系列」第8篇 CI/CD之全流程實踐

3.確認harbor鏡像倉庫裡是否已經有新推送的鏡像

「Kubernetes系列」第8篇 CI/CD之全流程實踐

_注_: harbor裡的項目是需要你先創建好的,不然推送時會報錯。

4.確認部署的服務狀態

k8s master節點上執行如下操作:

<code>$ kubectl -n devops get pod,deployment,svc,ingress |grep hanker-hello pod/hanker-hello-5b7586f86d-5j7kk              1/1     Running   0          173mdeployment.extensions/hanker-hello              1/1     1            1           3h8mservice/hanker-hello-svc          ClusterIP   10.233.22.19    <none>        8080/TCP             3h8mingress.extensions/hanker-hello-ingress              hanker-hello-demo.dev.hanker.net                   80      3h8m/<none>/<code>
「Kubernetes系列」第8篇 CI/CD之全流程實踐

附錄

自定義jenkins-agent鏡像

<code>## 基於 https://github.com/Kubernetes-Best-Pratice/jenkins-jnlp-agent.git$ git checkout  https://github.com/Kubernetes-Best-Pratice/jenkins-jnlp-agent.git$ cd jenkins-jnlp-agent$ docker build .$ docker tag tag-name custom-private-repository-addr/<code>

_注_: 你也可以基於基礎鏡像創建自定義的鏡像

可以做的更完善

  1. 配置webhook, 自動觸發jenkins job;
  2. 當前我們實踐時構建的鏡像版本使用的是固定的, 你是否可以將其替換為依賴pipeline環境變量或是傳參的形式,將其變是更有意義;
  3. 上一篇文章中在設置【配置Kubernetes Pod Template】時,我們提到可以掛載主機或是網絡共享存儲,你是否可以通過這個將你的構建快起來;
  4. 我們的示例代碼使用的go, 直接是鏡像內打包,如何更好的就好的其他語言的構建,你可以參考Using Docker with Pipeline;
  5. 你想過如何下載構建過程中的產物嗎,等等。


分享到:


相關文章: