ใช้ Argo CD กับ Jsonnet สำหรับสร้าง Kubernetes Manifest แบบ Dynamic

ใช้ 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

  1. จัดโครงสร้างโฟลเดอร์ที่ดี – แยกไฟล์ Jsonnet ตามโปรเจค และสภาพแวดล้อม (dev, staging, prod)
  2. ใช้ Local Functions – สร้างฟังก์ชัน reusable สำหรับตัวสร้าง Manifest
  3. ใช้ Variables สำหรับค่าที่เปลี่ยนแปลง – เช่น image tag, replicas, resources
  4. ทดสอบ Jsonnet Output – ใช้ jsonnet command เพื่อทดสอบก่อน commit
  5. ใช้ Comments – อธิบายจุดประสงค์ของแต่ละส่วน
  6. จัดการ 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 ของคุณ