iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 29
1
DevOps

就是「懶」才更需要重視DevOps系列 第 29

Day29 Drone 結合 Kubernetes

第18天 介紹過該如何透過 Drone 自動 Build Image 並推上 Harbor 私有庫,那麼今天介紹該如何透過Drone 更新線上環境的 Image 版本號。

首先在操作 Drone 更新 K8SImage 版號前,必需先了解使用 K8S 達到滾動升級的三種方式

  • set image
## kubectl set image <deployment name> <container>=<image> --record
$ kubectl set image nginx-deploy nginx=nginx:v0.0.2 --record
  • replace
    修改 deployment.yaml 的容器版本號後,執行 kubectl replace -f <filename>

  • edit
    透過編輯視窗直接更改 yaml 檔案內容,存檔後立即生效。

## kubectl edit deployment <deployment name> --record
$ kubectl edit deployment nginx-deploy --record

注意: --record 參數通知 k8s 把指令記錄起來以方便之後檢查
執行 kubectl rollout history deployment <deployment name> 可以查看更新狀況[color=red]

以上這三種方式,第二種與第三種都是手動更改檔案,再透過指令的方式進行升版,且文件有可能發生更改錯誤,例如排版錯誤多了一個空白鍵,而第一種方式則是透過指令的方式進行升版,相對地比較單純,那麼了解了三種升版方式,看似第一種kubectl set 是最適合做為準動升級,只是每次更新程式都必需打指令更新蠻擾人的,那...不如交給 Drone 處理吧!


進入重頭戲,介紹一個 Drone Plugin: Kubernetes Deployments,這一個 Plugin 就是負責協助維運人員執行 kubectl set image 的指令,只需要提供對應的 namespacedeploymentcontainer name以及相關驗證等資訊,接下來就交由自動化協助升級線上服務版本啦。

那們今天的目標就是除了讓 Drone 代替維運人員自動 Build Image 也需要協助維運人員自動更新線上程式本版,目標如以下流程圖。

先來複習一下第18天的 .drone.yaml 內容

## Drone 1.0 版本寫法
kind: pipeline
type: docker      # 在 Docker 內部執行管道命令
name: clone       # 可自行定義的名稱

steps:
  - name: build-golang                                                # 事件一:可自行定義的名稱
    image: neil605164/plugin-govendor                                 # 使用 neil605164/plugin-govendor  容器
    commands:                                                         # 需執行的指令
      - mkdir -p /usr/local/go/src/${DRONE_REPO_NAME}                 # 於 goroot 建立專案名稱的空資料夾
      - ls -al vendor                                                 # 查看當前 vendor 資料夾(尚未編譯完成的 code)
      - rsync -r  /drone/src/* /usr/local/go/src/${DRONE_REPO_NAME}   # 將 clone 的專案複製到 goroot 底下
      - cd /usr/local/go/src/${DRONE_REPO_NAME}                       # 移動至 goroot 專案底下
      - govendor sync                                                 # 編譯 golang 程式碼
      - rsync -r /usr/local/go/src/${DRONE_REPO_NAME}/* /drone/src    # 將編譯後的程式在複製回 drone 預設 path
      - ls -al vendor                                                 # 查看當前 vendor 資料夾(已經編譯完成的 code)
  - name: build-image-push-harbor                                     # 事件二:可自行定義的名稱
    image: plugins/docker                                             # 使用 plugins/docker  容器
    settings:
      username:                                                       # harbor 私有庫帳號
        from_secret: docker_username
      password:                                                       # harbor 私有庫密碼
        from_secret: docker_password
      repo: <harbor url>/library/golang-hello                         # harbor 私有庫存放位置
      tags: latest                                                    # harbor image tag( 也可以利用 ${DRONE_TAG} 自動取得 push 到 gitlab 的版號)
      registry: <harbor url>                                          # harbor 私有庫網址

從上面的 yaml 檔案可以看到有兩個事件需要執行:

  • build-golang: 編譯 golang 程式
  • build-image-push-harbor: build image + push to harbor

接著如果需要自動更新線上版本,只需要再增加一個事件,如以下 yaml 內容:

  - name: k8s-deploy                                                  # 事件三:可自行定義的名稱
    image: quay.io/honestbee/drone-kubernetes                         # 使用 quay.io/honestbee/drone-kubernetes  容器
    settings:
      kubernetes_server: <K8S server url>                             # K8S master url
      namespace: <namespace name>                                     # 服務所屬的 namespace
      deployment: <deployment name>                                   # 服務所屬的 deployment
      repo: <inmage repo path>                                        # 服務所用的 image 來源
      container:  <container name>                                    # 服務的 container 名稱
      tag: latest-dev                                                 # 服務的新版板號,可替換成變數,ex: ${DRONE_TAG}
      kubernetes_token:                                               # K8S 驗證 token
        from_secret: kubernetes_token
    debug: true                              

以上就是今天的內容,開發人員只需要簡單的 git push 指令,就可以達到後續自動佈署,若需要區分環境,也可以加上 Drone 內鍵功能的 when.branch: master 等其他分支或者 tag 作為條件,過濾何時該執行特定事件。

  • 完整版 yaml 檔案
## Drone 1.0 版本寫法
kind: pipeline
type: docker      # 在 Docker 內部執行管道命令
name: clone       # 可自行定義的名稱

steps:
  - name: build-golang                                                # 事件一:可自行定義的名稱
    image: neil605164/plugin-govendor                                 # 使用 neil605164/plugin-govendor  容器
    commands:                                                         # 需執行的指令
      - mkdir -p /usr/local/go/src/${DRONE_REPO_NAME}                 # 於 goroot 建立專案名稱的空資料夾
      - ls -al vendor                                                 # 查看當前 vendor 資料夾(尚未編譯完成的 code)
      - rsync -r  /drone/src/* /usr/local/go/src/${DRONE_REPO_NAME}   # 將 clone 的專案複製到 goroot 底下
      - cd /usr/local/go/src/${DRONE_REPO_NAME}                       # 移動至 goroot 專案底下
      - govendor sync                                                 # 編譯 golang 程式碼
      - rsync -r /usr/local/go/src/${DRONE_REPO_NAME}/* /drone/src    # 將編譯後的程式在複製回 drone 預設 path
      - ls -al vendor                                                 # 查看當前 vendor 資料夾(已經編譯完成的 code)

  - name: build-image-push-harbor                                     # 事件二:可自行定義的名稱
    image: plugins/docker                                             # 使用 plugins/docker  容器
    settings:
      username:                                                       # harbor 私有庫帳號
        from_secret: docker_username
      password:                                                       # harbor 私有庫密碼
        from_secret: docker_password
      repo: <harbor url>/library/golang-hello                         # harbor 私有庫存放位置
      tags: latest                                                    # harbor image tag( 也可以利用 ${DRONE_TAG} 自動取得 push 到 gitlab 的版號)
      registry: <harbor url>  
      
  - name: k8s-deploy                                                  # 事件三:可自行定義的名稱
    image: quay.io/honestbee/drone-kubernetes                         # 使用 quay.io/honestbee/drone-kubernetes  容器
    settings:
      kubernetes_server: <K8S server url>                             # K8S master url
      namespace: <namespace name>                                     # 服務所屬的 namespace
      deployment: <deployment name>                                   # 服務所屬的 deployment
      repo: <inmage repo path>                                        # 服務所用的 image 來源
      container:  <container name>                                    # 服務的 container 名稱
      tag: latest-dev                                                 # 服務的新版板號,可替換成變數,ex: ${DRONE_TAG}
      kubernetes_token:                                               # K8S 驗證 token
        from_secret: kubernetes_token
    debug: true                                                       # 是否開啟 debug 模式(default is false)

注意:

  • .drone.yml 檔案內容的事件,若無指定平行處理,那麼會有順序性由上至下,在撰寫事件時需要注意
  • Drone 內鍵可以使用的全域變數 參考文件

上一篇
Day28 了解管理 K8S 工具 Helm
下一篇
Day30 總結
系列文
就是「懶」才更需要重視DevOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言