มาลอง Setup Gitops ด้วย ArgoCD + Kustomize กันเถอะ Part 3
สวัสดีครับเนื้อหาของบทความนี้จะพูดถึงการใช้ Kustomize มาช่วยในการแยก Configuration ของแต่ละ Environment ใน Gitops ของเราและเป็นภาคต่อจากบทความที่แล้ว
ถ้าพร้อมแล้วไปดูกันเลยย
Environment with Kustomize
หลังจากที่เรา deploy chula-sso-mock
เรียบร้อยจาก Part ที่แล้วแต่ว่าในตอนนี้มันยังมีแค่ Environment เดียวอยู่ในการที่เราจะแยก Environment เราจะใช้ Kustomize มาช่วยในการจัดการ Configuration ต่างๆ
ตามที่ Official Docs เขียนไว้คือ Kustomize จะแบ่ง manifest file ออกเป็น 2 ส่วน
Base
manifest ที่เป็น template หลักเอาไว้ให้ kustomize นำข้อมูลจาก Overlays มาเขียนทับในส่วนที่เราต้องการ
Overlays
configuration ของ service ในแต่ละ environment ลงไปเพื่อที่จะนำไปเขียนทับส่วนที่เราต้องการตามที่เขียน config เอาไว้
Project Structure
เพราะฉะนั้น project structure ของเราก็จะมีการแบ่งย่อย folder ภายใน Application Folder ไปอีก 2 ส่วนย่อยๆ
- Base คือ folder ที่เราจะใส่ manifest ที่เป็น base เอาไว้ในนี้
- Overlays คือ folder ที่จะแยกย่อยแต่ละ environment ออกมาอีกเพื่อเขียน configuration ไป overlay ทับ base manifest บางส่วน
เพื่อให้ง่ายต่อการแก้ไข project structure ผมจะให้ manifest ที่เราเขียนมาใน part ที่แล้วกลายเป็น base แล้วเราจะมาเขียน configuration ด้วย kustomize ใน overlays กัน
มาเริ่มกันเลยย
- สร้าง folder ชื่อว่า
base
และนำ manifest ทั้งหมดไปใส่ในนั้น - สร้าง folder ชื่อ
overlays
และสร้าง folderdev
beta
และprod
ในoverlays
ถ้าเสร็จแล้วจะได้หน้าตาแบบนี้
จากนั้นให้สร้างไฟล์ชื่อ kustomization.yaml
ใน folder base
และ environment
ต่างๆ
โดยที่ใน base
ให้ใส่ content
// kustomization.yaml in base
resources:
- config-map.yaml
- deployment.yaml
- service.yaml
ส่วนในแต่ละ environment
ให้ใส่ตามนี้
// kustomization.yaml in environment dev
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
nameSuffix: -dev
commonLabels:
app: chula-sso-mock-dev
resources:
- ../../base
จาก kustomization.yaml
ที่เราเพิ่มเข้าไปสังเกตุได้ว่าจะมีข้อแตกต่างกันอยู่คือ
- ใน base
kustomization.yaml
จะมีหน้าที่เอาไว้บอกว่าไฟล์ไหนบ้างที่เราจะเขียนทับด้วย content จาก overlays - ในแต่ละ environment จะมีหน้าที่เป็น configuration สำหรับการนำ content ไปเขียนทับ manifest ใน base เช่น commonLabels คือการสร้าง label ใหม่มาทับของเก่าใน base
เมื่อเสร็จแล้วจะได้หน้าตาประมาณนี้
เราสามารถ test ได้ว่าที่เราเขียน config ไปทั้งหมดนั้น ok ไหมด้วยการ
- cd ไปที่ folder environments ที่เราต้องการ test
- run คำสั่ง
kustomize build
ถ้าไม่มีอะไรผิดพลาด kustomize จะ generate manifest มาให้เราใน cli
และไม่เพียงเท่านี้ kustomize ยังสามารถที่จะ generate config map จากไฟล์ต่างๆได้ด้วย conifgMapGenerator
ให้เราเพิ่ม configMapGenerator เข้าไปใน kustomization.yaml
ด้วย format ตามนี้
// kustomization.yaml in environment dev
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
nameSuffix: -dev
commonLabels:
app: chula-sso-mock-dev
configMapGenerator:
- behavior: replace
envs:
- .env
name: chula-sso-mock-config
resources:
- ../../base
behavior
Action ที่จะให้ kustomize ทำเพื่อ modify configmap ใน base
- create สร้าง manifest ใหม่โดยจะใช้ชื่อตาม name (ถ้ามีอยู่แล้วจะ error)
- merge รวม data ใหม่เข้ากับอันเก่า (นำ data มา union กัน)
- replace ใช้ data จากที่ generate มาใหม่ทั้งหมด (ของเก่าที่เขียนไว้ใน base จะไม่ถูกนำมาใช้เลย)
envs
ชื่อไฟล์ .env
ที่จะนำมา generate เป็น config map (สามารถใช้ได้มากกว่า 1 ไฟล์)
name
attribute ใน metadata ของ base ที่ kustomize จะใช้เป็น reference ในการ modify data
และสร้างไฟล์ .env
เพื่อให้ kustomize นำไป generate เป็น config map
# .env in environment dev
PORT=8080
APPID=DEVAPPID
APPSECRET=DEVAPPSECRET
เมื่อเสร็จเรียบร้อยแล้วให้ลอง run kustomize build
ใน folder environment เพื่อ test ว่าที่เขียนมามันใช้ได้ไหม
สังเกตุได้ว่า data ใน config map จะถูก generate ใหม่มาจากไฟล์ .env
ที่เราเพิ่งเพิ่มเข้ามานับว่าใช้ได้แล้ว
เพียงเท่านี้เราก็สามารถแยก config map ของ chula-sso-mock
ตามแต่ละ environment ได้แล้วด้วยการแยกไฟล์ .env
ในทุก environment เพื่อให้ kustomize นำไป generate มาทับอันที่อยู่ใน base
ให้ทำเหมือนเดิมกับ beta
และ prod
(APPID กับ APPSECRET แก้ตามที่อยากให้เป็นได้เลย)
แต่เดี๋ยวก่อนเราลืมอะไรกันรึเปล่านะ
ใช่แล้ว!! ถ้ายังจำกันได้ใน part ที่แล้วเราเขียน manifest ของ Application ไว้อยู่ใน templates folder ซึ่ง path ที่ให้ Argo CD อ่าน configuration คือใน folder chula-sso-mock
แต่ตอนนี้ structure ใน folder เปลี่ยนไปแล้วเราต้องไป set ใหม่
แต่แยก environment ออกมาแบบนี้ path ที่เราจะต้องใช้คืออันไหนนะ 🤔
แก้ Application Manifest ให้ชี้ไปแต่ละ Environment
หลังจากที่เรา setup ให้ kustomize generate config map ในแต่ละ environment ได้แล้วสิ่งถัดมาที่จะต้องทำก็คือมาแก้ path ที่ Argo CD จะอ่าน configuration ของ Application ใน manifest ที่อยู่ใน templates folder
ให้ไปที่ไฟล์ apps/templates/chula-sso-mock.yaml
- แก้ path ให้เป็น
chula-sso-mock/overlays/<environment>
เช่น ถ้าจะให้ chula-sso-mock ใช้ configuration ของ dev environment path ก็จะเป็นchula-sso-mock/overlays/dev
- แก้ชื่อ Application เป็น
chula-sso-mock-dev
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: chula-sso-mock-dev
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
destination:
namespace: gitops-example
server: {{ .Values.spec.destination.server }}
project: gitops-example
source:
path: chula-sso-mock/overlays/dev
repoURL: {{ .Values.spec.source.repoURL }}
targetRevision: {{ .Values.spec.source.targetRevision }}
syncPolicy:
automated: {}
หลังจากนั้นให้เพิ่มมาอีก 2 Application สำหรับ environment beta
และ prod
โดยการใช้เครื่องหมาย ---
ในการคั่น manifest
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: chula-sso-mock-beta
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
destination:
namespace: gitops-example
server: {{ .Values.spec.destination.server }}
project: gitops-example
source:
path: chula-sso-mock/overlays/beta
repoURL: {{ .Values.spec.source.repoURL }}
targetRevision: {{ .Values.spec.source.targetRevision }}
syncPolicy:
automated: {}
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: chula-sso-mock-prod
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
destination:
namespace: gitops-example
server: {{ .Values.spec.destination.server }}
project: gitops-example
source:
path: chula-sso-mock/overlays/prod
repoURL: {{ .Values.spec.source.repoURL }}
targetRevision: {{ .Values.spec.source.targetRevision }}
syncPolicy:
automated: {}
เมื่อเสร็จแล้วจะได้หน้าตาประมาณนี้
จากนั้นให้ push ขึ้น git ได้เลยย
และเมื่อไปดูใน UI ของ Argo CD จะเจอว่า Application chula-so-mock
อันเก่าจะอยู่ใน status out of sync
เพราะว่าใน manifest เราลบอันนี้ทิ้งไปแล้วนั่นเอง!
ให้เราลบ Application อันเก่าทิ้งได้เลย
และเข้าไปที่ gitops-example-apps
ของเราจะเจอว่า Application ของเราถูก update เป็นไปตามที่เรา setup ไว้ให้มันแยกไปเป็นหลายๆ environment
และเมื่อกด sync application และไปดู content ใน config map ก็จะเจอว่ามันโหลดตามที่เรา setup ไว้!!!
จริงๆแล้ว Kustomize ยังสามารถทำอะไรมากกว่าที่ยกตัวอย่างได้อีกนะ ไม่ว่าจะเป็น
- การแก้ image tag
- secretGenearator
- แก้ metadata ที่เราต้องการในไฟล์ manifest ต่างๆ
- อีกหลายๆอย่าง
สามารถไปอ่านเพิ่มเติมได้ใน Officical Docs
Example Code
สามารถดูตัวอย่าง code ใน repository ได้ใน GitHub
ตอนต่อไป!
หลังจากที่เราสามารถแยก configuration ตามแต่ละ environment ได้แล้วใน part หน้าจะเป็นการยกตัวอย่างของ CI/CD
ที่ใช้ในการ commit แก้ image tag ด้วย kustomize เพื่อให้ Argo CD สามารถตรวจเช็คความเปลี่ยนแปลงใน Git Repository และ deploy image version ใหม่ล่าสุดได้จะเป็นอย่างไรไปลองดูกัน!
- มาลอง Setup Gitops ด้วย ArgoCD + Kustomize กันเถอะ Part 4