好用的 Kustomize, Drone 1.0 升級以及如何使用Gradle cache server 加速部署

最近在改進專案的CI/CD流程
恰好同事有分享到一個K8s非常好用的部署工具 – Kustomize
稍加學習之後覺得還蠻好用的🏄‍
本篇中也會分享如何在Rancher建置一個Gradle cache server加速Gradle Build
(畢竟Java專案大起來那個Build時間真的不是蓋的)


# 💎 Kustomize 介紹 💎 KustomizeK8s SIGs的子項目 他的好用之處在於可以像Docker-compose一樣定義很多個Services 但是Kustomize基於K8s, 可以讓namespace下面跑的pods, ingresses都一目了然 甚至你可以使用Overlays將部署環境(alpha, beta, production..)做區隔

在Mac上面妳可以很簡單的安裝

1
brew install kustomize

至於其他的OS可以參考Kustomize的Install.md

簡單來說,就像以下這張圖
pic1
kustomization.yaml 就是在下 kustomize build指令時會根據resource去抓你的檔案
通常會有deployment & service兩種檔案
這兩種檔案就是為你起一個Workload, 再幫你Expose對其他pods的端口
也可以再加上Ingress, 但是我這邊選擇第一次apply之後手動加上去
就不用再多弄出一個ingress檔案

👉deployment的寫法可以參考這裡
👉service的寫法則可以參考這裡

而這是我的
💫deployment.yaml
pic1
💫service.yaml
pic1
💫kustomization.yaml
pic1

將它們放在你的專案根目錄底下
例如我的資料夾目錄長這樣
pic1

輸入

1
2
cd kustomize/base
kustomize build .

kustomize就會生成deployment.yaml還有service.yaml
這時候再輸入

1
kubectl apply --server=$${Your k8s cluster server}  --token=$${Your k8s apply token} --insecure-skip-tls-verify=true --namespace=$${Your k8s name space}  -f -

就可以建立workloads了
如果有使用Rancher就可以看到服務跑起來的狀況

如果你是要更新現有的workloads, 遇到🥕這款問題
這就是創建的pod template hash label跟你Deployment不符合,所以K8s不讓你更新
我之前是直接用Rancher UI去幫我創建workloads
所以就遇到這個問題
解決方法是直接砍掉創建新的Workloads比較快

💎 整合進Drone1.0 💎

因為我在專案上使用的CI/CD pipeline tool是Drone
最近剛好專案上線忙完比較有空
就順手升級了Drone file

.drone.yml寫法請參考這裡

我的做法是:

  1. build image
  2. push to remote image registry
  3. Replace image by kustomize edit
1
kustomize edit set image {{your remote image}} 

跑完這個指令就可以把docker image換成最新的
然後再利用Kustomize生成部署文件

Kustomize edit 還可以玩很多請看這裡

最後Deploy時會用到drone secret
Drone secret非常方便,能夠直接以環境變數的方式在跑Pipeline時寫進去
但是也有能夠被print出來的問題
所幸在Drone 可以限制哪個Repository, image可以存取這個Drone secret(怎麼限制)

😈同場加映: Drone 1.0要如何get secret

💎 Kustomize Overlays 💎

部署完之後,就會開始思考環境的事情
這時候就可以善用base/overlays

請看以下這兩張圖:
pic1
這是你的檔案目錄會有的樣子:
pic1
基本上我第一次看的時候也沒有看得很懂…😂

後來才知道Overlays是把裡面有的Tags附加在base上面
或是把base有的Tags換掉

這是我的檔案樹, 或許會比較清楚
pic1
根據環境的不同,Deploy的時候就要到那個環境的資料夾底下下Kustomize指令
這是production的Kustomize
pic1
可以看到我根據base資料夾的yaml file還額外requires kafka-consumer-env-prod.yaml
這是production的kafka-consumer-env-prod.yaml
pic1
可以看到我這邊把Replicas代換成3
還額外增加了兩個process enviroment variables給這個Workloads


# 💎 Gradle cache server加速部署 💎 哩哩扣扣搞了這麼多CICD玩意兒之後 我發現每次Build Jar都要等一分多鐘Gradle下載Dependencies 之前寫前端的時候公司內部有大神架了個npm registry as cache 那同理可證gradle應該也要有同樣的工具啊 於是就看到這篇教學文

因為我們已經有k8s cluster, 索性直接跑個Workloads, Rancher設定如下
pic1
跑起來的樣子
pic1

有了Cache之後直接節省一分多鐘build time, 可喜可賀

打完收工💤


# 💎 References 💎 👩‍💻https://github.com/kubernetes-sigs/kustomize 👩‍💻https://kubectl.docs.kubernetes.io/pages/imperative_porcelain/editing_workloads.html 👩‍💻https://docs.drone.io/user-guide/pipeline/steps/ 👩‍💻https://medium.com/@cesarmcferreira/using-gradle-build-cache-server-73d7680baf2a