ใช้ Argo CD กับ Jsonnet สำหรับสร้าง Kubernetes Manifest แบบ Dynamic
การจัดการ Kubernetes Manifest หลายๆ แบบในสภาพแวดล้อมที่ซับซ้อนเป็นความท้าทายที่ใหญ่หลวง บทความนี้จะแนะนำวิธีการใช้ Jsonnet ร่วมกับ Argo CD เพื่อสร้าง Kubernetes Manifest แบบ Dynamic ที่มีความยืดหยุ่นและนำกลับมาใช้ได้
Jsonnet คืออะไร
Jsonnet เป็นภาษา Domain-Specific Language (DSL) ที่ออกแบบมาเพื่อสร้าง JSON ได้อย่างมีประสิทธิภาพ มันเป็นเซ็ตย่อยของ JSON ที่เพิ่มเติมฟีเจอร์เช่น
- Variables และ Functions – ใช้ตัวแปรและฟังก์ชันเพื่อลดการทำซ้ำ
- Conditionals และ Loops – สร้างไฟล์ configuration ที่ขึ้นอยู่กับเงื่อนไข
- Objects และ Arrays – จัดโครงสร้างข้อมูลที่ซับซ้อน
- Template Functions – สร้าง templates ที่นำกลับมาใช้ได้
ทำไมต้องใช้ Jsonnet กับ Argo CD
การใช้ Jsonnet กับ Argo CD มีข้อดีมากมาย
- ลดการทำซ้ำ (DRY Principle) – เขียนโค้ด Manifest เพียงครั้งเดียว แล้วนำกลับมาใช้ในหลายที่
- ความยืดหยุ่น – สร้าง Manifest ที่สามารถปรับแต่งได้ตามสภาพแวดล้อมต่างๆ (Dev, Staging, Production)
- ควบคุมเวอร์ชัน – เก็บโค้ด Jsonnet ใน Git และติดตามการเปลี่ยนแปลง
- ลดข้อผิดพลาด – ใช้ฟังก์ชันและตัวแปรแทนการคัดลอกและแก้ไขด้วยตนเอง
พื้นฐาน Jsonnet Syntax
มาดูตัวอย่างไวยากรณ์พื้นฐานของ Jsonnet
// ตัวแปร
local image = "nginx:1.19";
local replicas = 3;
local labels = {
app: "myapp",
version: "v1"
};
// Objects
{
apiVersion: "apps/v1",
kind: "Deployment",
metadata: {
name: "my-deployment",
labels: labels,
},
spec: {
replicas: replicas,
selector: { matchLabels: labels },
template: {
metadata: { labels: labels },
spec: {
containers: [{
name: "app",
image: image,
ports: [{ containerPort: 8080 }],
}],
},
},
},
}
สร้าง Kubernetes Manifest ด้วย Jsonnet
เรามาสร้าง Deployment manifest ที่เฉพาะเจาะจงมากขึ้น โดยใช้ฟังก์ชันและตัวแปร
// deployment.jsonnet
local createDeployment(name, image, replicas=3, port=8080) = {
apiVersion: "apps/v1",
kind: "Deployment",
metadata: {
name: name,
namespace: "default",
},
spec: {
replicas: replicas,
selector: {
matchLabels: { app: name }
},
template: {
metadata: {
labels: { app: name }
},
spec: {
containers: [{
name: name,
image: image,
ports: [{ containerPort: port }],
resources: {
requests: {
cpu: "100m",
memory: "128Mi"
},
limits: {
cpu: "500m",
memory: "512Mi"
}
}
}],
},
},
},
};
// ใช้งานฟังก์ชัน
createDeployment(
name="web-app",
image="myapp:1.0",
replicas=3,
port=3000
)
ตัวอย่างขั้นสูง – Deployment, Service, ConfigMap
สร้างหลาย Manifest พร้อมกันในไฟล์ Jsonnet เดียว
// app.jsonnet
local app_name = "myapp";
local image = "myapp:1.0";
local replicas = 3;
local port = 8080;
local createConfigMap = {
apiVersion: "v1",
kind: "ConfigMap",
metadata: {
name: app_name + "-config",
},
data: {
"config.env": "DEBUG=false\nLOG_LEVEL=info",
},
};
local createService = {
apiVersion: "v1",
kind: "Service",
metadata: {
name: app_name,
},
spec: {
selector: { app: app_name },
ports: [{ port: port, targetPort: port }],
type: "ClusterIP",
},
};
local createDeployment = {
apiVersion: "apps/v1",
kind: "Deployment",
metadata: {
name: app_name,
},
spec: {
replicas: replicas,
selector: { matchLabels: { app: app_name } },
template: {
metadata: { labels: { app: app_name } },
spec: {
containers: [{
name: app_name,
image: image,
ports: [{ containerPort: port }],
envFrom: [{ configMapRef: { name: app_name + "-config" } }],
}],
},
},
},
};
// แสดงผลทั้ง 3 Manifest
[createConfigMap, createService, createDeployment]
การตั้งค่า Argo CD สำหรับ Jsonnet
ในไฟล์ Application manifest ของ Argo CD ให้ระบุ generator plugin สำหรับ Jsonnet
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/yourorg/repo
targetRevision: main
path: manifests
directory:
jsonnet: {}
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
เปรียบเทียบ Jsonnet vs Helm vs Kustomize
| ลักษณะ | Jsonnet | Helm | Kustomize |
|---|---|---|---|
| ภาษา | DSL ที่คล้าย JSON | Go templates + YAML | YAML + Patching |
| ความยืดหยุ่น | สูง | สูง | กลาง |
| ความซับซ้อน | กลาง | สูง | ต่ำ |
| Reusability | ดีเยี่ยม | ดีเยี่ยม (Charts) | ดี (Overlays) |
Best Practices ในการใช้ Jsonnet
- จัดโครงสร้างโฟลเดอร์ที่ดี – แยกไฟล์ Jsonnet ตามโปรเจค และสภาพแวดล้อม (dev, staging, prod)
- ใช้ Local Functions – สร้างฟังก์ชัน reusable สำหรับตัวสร้าง Manifest
- ใช้ Variables สำหรับค่าที่เปลี่ยนแปลง – เช่น image tag, replicas, resources
- ทดสอบ Jsonnet Output – ใช้
jsonnetcommand เพื่อทดสอบก่อน commit - ใช้ Comments – อธิบายจุดประสงค์ของแต่ละส่วน
- จัดการ Library – ใช้
import "lib.jsonnet" as libสำหรับโค้ด shared
การใช้งานบน ผู้ให้บริการโฮสติ้ง Cloud VPS
เมื่อทำงานกับ Kubernetes บน ผู้ให้บริการโฮสติ้ง Cloud VPS คุณสามารถใช้ Jsonnet เพื่อจัดการ Kubernetes Manifest ได้อย่างมีประสิทธิภาพ บริการ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง มีความเสถียรและสามารถรองรับการใช้ Argo CD ร่วมกับ Jsonnet ได้เต็มที่ ทำให้คุณสามารถ
- สร้าง Manifest ที่ใช้ซ้ำได้หลายครั้ง
- ลดข้อผิดพลาดในการจัดการ Configuration
- เพิ่มความเร็วในการ Deploy Application
- จัดการหลายสภาพแวดล้อม (Dev, Staging, Production) อย่างมีระเบียบ
ระบบ Kubernetes บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง ได้รับการปรับปรุงอย่างสม่ำเสมอ เพื่อให้ support เครื่องมือและเทคโนโลยีล่าสุด รวมถึง Argo CD Plugin Architecture ที่ช่วยให้คุณสามารถใช้ Jsonnet ได้อย่างราบรื่น
สรุป
Jsonnet เป็นเครื่องมือที่ทรงพลังสำหรับการสร้าง Kubernetes Manifest แบบ Dynamic เมื่อใช้ร่วมกับ Argo CD จะช่วยให้คุณ
- เขียนโค้ด Manifest เพียงครั้งเดียว แล้วนำกลับมาใช้ในหลายที่
- ลดการทำซ้ำและข้อผิดพลาด
- สร้าง Configuration ที่ปรับแต่งได้ตามสภาพแวดล้อม
- ติดตามการเปลี่ยนแปลงผ่าน Git Version Control
หากคุณใช้งาน Kubernetes บน ผู้ให้บริการโฮสติ้ง Cloud VPS ลองประยุกต์ใช้ Jsonnet กับ Argo CD เพื่อเพิ่มประสิทธิภาพการจัดการ Cluster ของคุณ

