ยินดีต้อนรับสู่ วันที่ 8: ConfigMaps และการฉีด Environment Variables เข้าสู่ Pods!
วันนี้เราจะมาทำความเข้าใจแนวคิดการแยกข้อมูลคอนฟิกออกจากตัว Container Image โดยใช้ ConfigMaps ซึ่งช่วยให้แอปพลิเคชันของเรามีความยืดหยุ่น ย้ายไปรันในสภาพแวดล้อมต่างๆ (Dev, Staging, Prod) ได้ง่ายขึ้นโดยไม่ต้อง Rebuild Image ใหม่ครับ
ช่วงที่ 1: สรุปแนวคิดสถาปัตยกรรม
เข้าใจหลักการ 12-Factor App, การแยก Config ออกจาก Image, การส่งผ่านข้อมูลด้วย Environment Variables หรือ Mounted Volumes และการตรวจสอบบน Headlamp UI
ช่วงที่ 2: การลงมือปฏิบัติจริง (5 ขั้นตอน)
สร้าง ConfigMap จาก CLI, สำรวจ Key-Value บน Headlamp UI, ฉีดตัวแปรผ่าน envFrom, ทดสอบ printenv ภายใน Pod และแก้ไขค่าสดผ่าน UI
สรุปแนวคิดและสถาปัตยกรรม (5–10 นาที)
ทำไมต้องใช้ ConfigMaps?
ตามหลักการ 12-Factor App เราควรแยก Configuration ออกจาก Source Code เพื่อความมั่นคงปลอดภัยและความยืดหยุ่น โดย ConfigMap ทำหน้าที่เก็บข้อมูลไม่ลับแบบ Key-Value Pairs (เช่น พารามิเตอร์, URL, หรือไฟล์คอนฟิก)
วิธีส่งผ่านค่าเข้าสู่ Pod
ทำได้ 2 วิธีหลัก:
1. Environment Variables: ฉีดค่าเข้าตรงๆ ผ่าน env หรือเหมาทั้งก้อนด้วย envFrom
2. Mounted Volumes: เมานต์ค่าออกมาเป็นไฟล์ลงในโฟลเดอร์ของ Container
การบริหารผ่าน Headlamp UI
Headlamp มีเมนู Configuration > ConfigMaps ให้คุณสามารถตรวจสอบรายการ Key-Value Pairs ได้โดยตรง แก้ไขค่าสดๆ ผ่าน Inline Editor และตรวจสอบความสัมพันธ์กับ Pods ได้อย่างเป็นระเบียบ
ขั้นตอนลงมือปฏิบัติจริง (15–20 นาที)
เปิด Terminal แล้วสร้าง ConfigMap ชื่อ app-config ที่บรรจุ Key-Value Pairs สำหรับตั้งค่าสีของแอปและระดับของ Log ด้วยพารามิเตอร์ --from-literal:
kubectl create configmap app-config --from-literal=APP_COLOR=blue --from-literal=LOG_LEVEL=debug
configmap/app-config created พร้อมจัดเก็บคีย์ APP_COLOR: blue และ LOG_LEVEL: debug เข้าสู่คลัสเตอร์
เปิด Headlamp UI เพื่อตรวจสอบการจัดเก็บข้อมูลคอนฟิกแบบกราฟิก:
- เปิด Headlamp UI ขึ้นมา (ผ่าน http://localhost:8080 หรือ Headlamp Desktop)
- ไปที่เมนูด้านซ้ายในส่วน Configuration > ConfigMaps
- คลิกเลือก app-config เพื่อตรวจสอบตาราง Data (จะเห็น
APP_COLOR: blueและLOG_LEVEL: debugอย่างชัดเจน)
สร้างและปรับใช้ Pod ชื่อ config-demo ที่ดึงค่าทั้งหมดจาก app-config มาเป็น Environment Variables ภายใน Container:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: config-demo
spec:
containers:
- name: web
image: nginx:alpine
envFrom:
- configMapRef:
name: app-config
EOF
pod/config-demo created และสถานะ Pod จะเปลี่ยนเป็น Running
ทดสอบรันคำสั่งเช็กตัวแปรสภาพแวดล้อมภายในคอนเทนเนอร์ผ่าน CLI ด้วยคำสั่ง kubectl exec:
kubectl exec config-demo -- printenv | grep APP_COLOR
APP_COLOR=blue ตรงตามที่นิยามไว้ใน ConfigMap ยืนยันว่าการฉีดตัวแปรผ่าน configMapRef สำเร็จสมบูรณ์
ทดลองปรับเปลี่ยนค่าคอนฟิกสดๆ ผ่านตัวแก้ไขบนหน้าจอเว็บของ Headlamp:
- กลับมาที่หน้าต่าง Headlamp ในส่วน Configuration > ConfigMaps > app-config
- คลิกปุ่ม Edit (ไอคอนดินสอ) บริเวณมุมบนขวา
- แก้ไขค่าของคีย์
APP_COLORจากblueเป็นgreen - คลิกปุ่ม Save & Apply เพื่อบันทึกการเปลี่ยนแปลงเข้าสู่คลัสเตอร์
เมื่อแก้ไข ConfigMap แล้ว ตัวแปร Environment Variables ใน Pod เดิมจะไม่ถูกอัปเดตโดยอัตโนมัติ (เพราะกระบวนการ Process ภายในคอนเทนเนอร์รับค่า env ตั้งแต่ตอน Start เครื่อง) หากต้องการให้ Pod ใช้งานคอนฟิกใหม่ จำเป็นต้องรีสตาร์ต Pod หรือสั่ง rollout restart แต่หากใช้วิธี Mounted Volume ระบบจะอัปเดตไฟล์ให้แบบเรียลไทม์
ลองสร้างและฉีด ConfigMap เข้าสู่ Pod ดูนะครับ หากตรวจสอบค่า Environment Variable บน CLI และแก้ไขผ่าน Headlamp UI เรียบร้อยแล้ว แจ้งได้เลยครับ!