Oh My Iron man post - day six

Oh My Kustomize ! 部署應用的神兵利器 - 2

  • 目錄
    • Introduce Helm Chart
    • 💎 Introduce Kustomize 💎

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,所以就遇到這個問題

解決方法是直接砍掉,用kubectl command創建新的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

Reference

  1. https://github.com/kubernetes-sigs/kustomize
  2. https://kubectl.docs.kubernetes.io/pages/imperative_porcelain/editing_workloads.html
  3. https://docs.drone.io/user-guide/pipeline/steps/