มาลอง Setup Gitops ด้วย ArgoCD + Kustomize กันเถอะ Part 3

Samithiwat
Thinc.
Published in
5 min readDec 27, 2022
Argo CD & Kustomize

สวัสดีครับเนื้อหาของบทความนี้จะพูดถึงการใช้ 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 กัน

มาเริ่มกันเลยย

  1. สร้าง folder ชื่อว่า base และนำ manifest ทั้งหมดไปใส่ในนั้น
  2. สร้าง folder ชื่อ overlays และสร้าง folder dev beta และ prod ใน overlays

ถ้าเสร็จแล้วจะได้หน้าตาแบบนี้

สร้าง folder base และ 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

เมื่อเสร็จแล้วจะได้หน้าตาประมาณนี้

สร้าง kustomization.yaml ใน base และ environments ต่างๆ

เราสามารถ test ได้ว่าที่เราเขียน config ไปทั้งหมดนั้น ok ไหมด้วยการ

  1. cd ไปที่ folder environments ที่เราต้องการ test
  2. run คำสั่ง kustomize build

ถ้าไม่มีอะไรผิดพลาด kustomize จะ generate manifest มาให้เราใน cli

kustomize build output

และไม่เพียงเท่านี้ 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 มาใหม่ด้วย kustomize

สังเกตุได้ว่า 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: {}

เมื่อเสร็จแล้วจะได้หน้าตาประมาณนี้

เพิ่ม application สำหรับ environment beta และ prod

จากนั้นให้ push ขึ้น git ได้เลยย

และเมื่อไปดูใน UI ของ Argo CD จะเจอว่า Application chula-so-mock อันเก่าจะอยู่ใน status out of sync เพราะว่าใน manifest เราลบอันนี้ทิ้งไปแล้วนั่นเอง!

Application อันเก่าอยู่ใน Status out of sync

ให้เราลบ Application อันเก่าทิ้งได้เลย

และเข้าไปที่ gitops-example-apps ของเราจะเจอว่า Application ของเราถูก update เป็นไปตามที่เรา setup ไว้ให้มันแยกไปเป็นหลายๆ environment

Application แยกออกมาเป็นหลายๆ environment ตามที่ setup เอาไว้

และเมื่อกด sync application และไปดู content ใน config map ก็จะเจอว่ามันโหลดตามที่เรา setup ไว้!!!

Config map เป็นไปตามที่ setup ไว้ในแต่ละ environment

จริงๆแล้ว 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

--

--