Kubernetes Configmap
ทีนี้ สมมุตินะสมมุติ เรามี Container 100 ตัว ใช้ Image ตัวเดียวกันนะ ใช้ ๆ ไปอยู่สักพัก อ้าวเฮ้ย เปลี่ยนดาต้าเบสว่ะ ต้องเปลี่ยน Connection String ใน Config ของ Application ก็มี 2 ทางเลือกครับ ทางง่ายคือ ลบ Pod 100 ตัว แก้ Config Deploy ใหม่ ทางที่ง่ายกว่าคือ ใช้ Deployment เราก็ลบทั้ง Deployment แก้ Config Deploy ใหม่ครับ ซึ้งก็ดูแปลก ๆ เนอะครับ แก้ที Deploy ที ก็เลยมีทางง่ายที่สุดในการจัดการครับนั้นคือการสร้าง Configmap
ซึ่งเจ้าตัวนี้เมื่อเราสร้างมาจะถูกเก็บไว้ใน Kubernetes Engine เราก็สร้างค่า Config ไว้เลย แล้วก็ให้ Pod หรือ Deployment มาดึงจากค่านี้ แค่นี้เมื่อเราแก้ค่า Config ให้ Restart Pod ก็จะได้ค่า Config ใหม่ครบทั้ง 1000 ตัว โดยไม่ต้องไปไล่แก้ทีละตัวเลย มาลองใช้กันดูดีกว่าเนอะ
เริ่มต้นจากการนำไฟล์ appsetting.json (ในกรณีนี้ผมใช้ .netcore) แล้วให้ก็อปปี้ไฟล์ไปไว้เครื่องที่ลง Kubernetes ไว้ แล้วรันคำสั่งนี้ (ไปที่ Directory ที่มีไฟล์นั้นไว้ด้วยนะ เพื่อความง่าย)
kubectl create configmap test-config --from-file=appsettings.json
สร้างเสร็จไปดูที่ Configmap เราจะได้หน้าตาประมาณนี้
ทีนี้วิธีเรียกใช้ก็อาจจะยุ่งยากนิหน่อย ตอนสร้าง Deployment ครับ ให้ลองเพิ่มตามนี้ดูครับ
apiVersion: v1
kind: Deployment
metadata:
name: test-deployment
spec:
containers:
- name: test-container
image: deadmandrive/servicea
volumeMounts:
- name: config-volume
mountPath: /app/appsettiings.json
subPath : appsettiings.json volumes:
- name: config-volume
configMap:
name: test-config
จากที่สังเกตดูจะมีสิ่งที่เรียกว่า volumnMounts กับ volumes ขึ้นมาตรงนี้ ก็คือเราจะสร้างหน่วยความจำเสมือนคล้าย ๆ ฮาร์ดดิสก์ เพื่อก็อปปี้ไฟล์ข้อมูล เราเลยสร้าง volumes ขึ้นมาก่อน ตั้งชื่อ config-volume และใส่ configmap เข้าไป ระบบก็จะก็อบปี้ไฟล์ Configmap มาเก็บไว้ใน config-volume จากนั้นเราก็ให้ Container ไป Mount มาใน Container ที่จะสร้างก็จะได้ config ใหม่นั้นเอง แค่นี้เมื่อเราแก้ไข Config ให้เราทำลาย Pod เก่าทิ้ง Pod ใหม่ที่ได้มาก็จะได้ Config ตัวใหม่แล้วครับ