ข้ามไปเนื้อหาหลัก
คอนเทนเนอร์· ~13 นาที· อัปเดตล่าสุด

ConfigMap — แยกค่าตั้งค่าออกจาก image

เปลี่ยน config โดยไม่ต้อง build image ใหม่

พื้นฐานที่ควรรู้: ในการสร้างแอปพลิเคชันที่ดี เราควรแยก "โค้ด" ออกจาก "ค่าตั้งค่า" (Configuration) เพื่อให้โค้ดชุดเดียวกันสามารถนำไปรันในสภาพแวดล้อมที่ต่างกันได้ (เช่น Dev, Staging, Prod) โดยไม่ต้องแก้ไขตัวโค้ดเลย

ConfigMap เหมือนป้ายตั้งค่า

ConfigMap เหมือนป้ายตั้งค่าที่แปะข้างเครื่อง แทนที่จะสลักค่าลงในตัวเครื่อง (image) เลย · อยากเปลี่ยน "URL ของฐานข้อมูล" หรือ "โหมด debug" ก็แก้ที่ป้าย ไม่ต้องหล่อเครื่องใหม่

หลักการสำคัญ (จาก 12-factor app): แยก config ออกจากโค้ด · image เดียวกันควรรันได้ทั้ง dev/staging/prod โดยเปลี่ยนแค่ค่าตั้งค่า · ConfigMap เก็บค่าที่ไม่เป็นความลับ (URL, ชื่อ, flag) แล้วป้อนให้ container

ค่าตั้งค่า/ความลับป้อนเข้า Pod เป็น env var หรือไฟล์

ConfigMapค่าทั่วไป (plain)
Secretค่าลับ (base64)
env / volume
Pod
containerอ่านค่าจาก env/ไฟล์

image เดียวกันรันได้ทุก environment เพราะค่าอยู่ข้างนอก

ConfigMap (ค่าทั่วไป) และ Secret (ค่าลับ) ป้อนเข้า Pod ได้ทั้งเป็น env var หรือไฟล์
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_MODE: "production"
  DB_HOST: "db.production.svc.cluster.local"
---
# ในสเปกของ container:
envFrom:
  - configMapRef:
      name: app-config
สร้าง ConfigMap แล้วป้อนเป็น env var
kubectl describe configmap app-config
kubectl rollout restart deployment <deployment-name>
💻 Hands-on: ตรวจสอบค่าใน ConfigMap และ Restart Deployment

สรุป 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

อ่านจบแล้วอย่าลืมทำเครื่องหมาย