Wednesday, September 23, 2026

[Kubernetes] วิธีบริหารจัดการคอนฟิกฉบับมือโปร: แยก Code และ Configuration บน Kubernetes ด้วย Deployment, ConfigMap และ Secret

หลังจากที่เราเรียนรู้วิธีเปิดใช้งาน Kubernetes บน Docker Desktop ไปแล้ว ในบทเรียนนี้เราจะมาดูวิธีการปรับแต่งและควบคุมแอปพลิเคชันอย่างเป็นระบบด้วย Deployment (YAML) ร่วมกับการจัดการคอนฟิกผ่าน ConfigMap และข้อมูลลับด้วย Secret ผ่านการ Mount Volume แบบไม่ต้องพึ่งพา Environment Variables ครับ


ทำความรู้จัก ConfigMap และ Secret

เพื่อแยกส่วนประกอบของการตั้งค่าออกจากตัว Container Image เราจึงใช้วัตถุ 2 ตัวนี้เข้ามาช่วยบริหารจัดการข้อมูล:

  • ConfigMap: สำหรับเก็บข้อมูลการตั้งค่าทั่วไป เช่น ไฟล์ Config, พอร์ต หรือ URL ระบบ
  • Secret: สำหรับเก็บข้อมูลสำคัญ เช่น Password, API Tokens หรือข้อมูลฐานข้อมูล

ขั้นตอนที่ 1: เตรียมไฟล์ ConfigMap และ Secret (config.yaml)

เราจะนิยามค่าคอนฟิกและรหัสผ่านไว้ในไฟล์ config.yaml เดียวกัน ดังนี้:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  app.conf: "mode=development\nport=8080"
---
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
stringData:
  db-password.txt: "SuperSecretPassword123"

รันคำสั่งเพื่อสร้าง Object เข้าสู่ Cluster:

kubectl apply -f config.yaml

ขั้นตอนที่ 2: สร้างไฟล์ Deployment พร้อมสั่ง Mount Volume (deployment.yaml)

การ Mount แบบ Volume จะทำให้ Key กลายเป็น ชื่อไฟล์ และ Value กลายเป็น เนื้อหาในไฟล์ โดยอัตโนมัติ ช่วยลดความซับซ้อนของการตั้งค่า System Environment Variables ใน Container

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-web-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx-app
        image: nginx:latest
        ports:
        - containerPort: 80
        # กำหนดจุดที่ต้องการนำไฟล์ไปวางใน Container
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
        - name: secret-volume
          mountPath: /etc/secrets
          readOnly: true
      # ระบุแหล่งที่มาของข้อมูลจาก ConfigMap และ Secret
      volumes:
      - name: config-volume
        configMap:
          name: app-config
      - name: secret-volume
        secret:
          secretName: app-secret

รันคำสั่งปรับใช้ Deployment:

kubectl apply -f deployment.yaml

ขั้นตอนที่ 3: ตรวจสอบผลลัพธ์ภายใน Container

เมื่อ Pod ทำงานแล้ว เราสามารถเข้าไปเช็กไฟล์การตั้งค่าภายใน Container ได้โดยตรง:

1. ตรวจสอบไฟล์ ConfigMap:

kubectl exec -it <ชื่อ-pod> -- cat /etc/config/app.conf

2. ตรวจสอบไฟล์ Secret:

kubectl exec -it <ชื่อ-pod> -- cat /etc/secrets/db-password.txt

ขั้นตอนที่ 4: การทำความสะอาด (Clean Up)

เมื่อทดลองเสร็จเรียบร้อยแล้ว สามารถลบ Resource ทั้งหมดได้ง่ายๆ ด้วยคำสั่ง:

kubectl delete -f deployment.yaml
kubectl delete -f config.yaml

สรุปข้อดีของการใช้งาน Mount Volume

Pro Tip: การ mount แบบ Volume มีจุดเด่นคือเมื่อมีการอัปเดตข้อมูลใน ConfigMap หรือ Secret ข้อมูลไฟล์ในโฟลเดอร์ปลายทางของ Container จะถูกอัปเดตตามแบบ Live Reload อัตโนมัติ โดยไม่จำเป็นต้องสั่ง Restart Pod ใหม่เลยครับ

No comments:

Post a Comment