ConfigMap — แยกค่าตั้งค่าออกจาก image
เปลี่ยน config โดยไม่ต้อง build image ใหม่
พื้นฐานที่ควรรู้: ในการสร้างแอปพลิเคชันที่ดี เราควรแยก "โค้ด" ออกจาก "ค่าตั้งค่า" (Configuration) เพื่อให้โค้ดชุดเดียวกันสามารถนำไปรันในสภาพแวดล้อมที่ต่างกันได้ (เช่น Dev, Staging, Prod) โดยไม่ต้องแก้ไขตัวโค้ดเลย
ConfigMap เหมือนป้ายตั้งค่าที่แปะข้างเครื่อง แทนที่จะสลักค่าลงในตัวเครื่อง (image) เลย · อยากเปลี่ยน "URL ของฐานข้อมูล" หรือ "โหมด debug" ก็แก้ที่ป้าย ไม่ต้องหล่อเครื่องใหม่
หลักการสำคัญ (จาก 12-factor app): แยก config ออกจากโค้ด · image เดียวกันควรรันได้ทั้ง dev/staging/prod โดยเปลี่ยนแค่ค่าตั้งค่า · ConfigMap เก็บค่าที่ไม่เป็นความลับ (URL, ชื่อ, flag) แล้วป้อนให้ container
ค่าตั้งค่า/ความลับป้อนเข้า Pod เป็น env var หรือไฟล์
image เดียวกันรันได้ทุก environment เพราะค่าอยู่ข้างนอก
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_MODE: "production"
DB_HOST: "db.production.svc.cluster.local"
---
# ในสเปกของ container:
envFrom:
- configMapRef:
name: app-configkubectl describe configmap app-config
kubectl rollout restart deployment <deployment-name>สรุป Key Takeaways
- ConfigMap = แยกค่าตั้งค่าที่ไม่ลับออกจาก image (image เดียวรันได้ทุก environment)
- ป้อนเข้า container เป็น env var หรือ mount เป็นไฟล์
- อย่าเก็บความลับใน ConfigMap (plain text) — ใช้ Secret
คำถามที่พบบ่อย
ConfigMap ใช้แบบ env กับแบบ volume mount ต่างกันยังไง
แบบ env = ค่าถูกฉีดตอน pod เกิด — แก้ ConfigMap แล้ว "ต้อง restart pod" ถึงได้ค่าใหม่ ส่วนแบบ volume = ไฟล์ใน pod ถูกอัปเดตเองภายในราวหนึ่งนาที (แต่แอปต้องอ่านไฟล์ซ้ำเองด้วย) — เข้าใจข้อนี้จะไม่งงว่าทำไมแก้ config แล้วแอปไม่เปลี่ยน
แก้ ConfigMap แล้วจะให้ Deployment รับค่าใหม่อัตโนมัติทำยังไง
K8s ไม่ restart ให้เอง — วิธีที่นิยม: ใส่ hash ของ ConfigMap เป็น annotation ใน pod template (Helm ทำให้ด้วย checksum/config) พอ config เปลี่ยน hash เปลี่ยน K8s เห็น template เปลี่ยนก็ rolling update ให้ หรือใช้เครื่องมืออย่าง Reloader

