Bài 10. Đừng hard-code cấu hình nữa – Hãy dùng ConfigMap
Ở bài trước, chúng ta đã biết cách đưa ứng dụng lên Kubernetes. Nhưng bây giờ lại xuất hiện một vấn đề mới.
Làm sao đổi cấu hình mà không phải build lại Docker Image?
Một câu chuyện quen thuộc
Giả sử bạn có một ứng dụng Node.js.
DATABASE_HOST=db.prod.company.com
DATABASE_PORT=5432
LOG_LEVEL=INFO
Lúc phát triển, bạn kết nối đến database local.
Đến môi trường staging, bạn phải đổi sang database staging.
Lên production, lại phải đổi sang database production.
Nếu các giá trị này được ghi thẳng trong source code hoặc Docker Image, mỗi lần thay đổi bạn sẽ phải:
- Sửa code
- Build lại Image
- Push Image
- Deploy lại
Chỉ để đổi... một dòng cấu hình.
Rõ ràng đây không phải là cách làm tốt.
1. ConfigMap là gì?
ConfigMap là nơi Kubernetes lưu các cấu hình không nhạy cảm của ứng dụng.
Ví dụ:
- URL API
- Tên database
- Port
- Chế độ chạy (dev, staging, production)
- Log level
Thay vì ghi chúng vào code, ta đưa chúng ra ngoài.
Application
│
▼
ConfigMap
│
▼
Database Host
API URL
Log Level
Ứng dụng chỉ việc đọc các giá trị này khi khởi động.
2. Tạo một ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: INFO
APP_NAME: demo-app
Áp dụng vào cluster:
kubectl apply -f configmap.yaml
3. Sử dụng ConfigMap trong Pod
Ta có thể truyền giá trị vào biến môi trường.
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL
Khi Pod chạy:
LOG_LEVEL=INFO
Ứng dụng có thể đọc giống như một biến môi trường bình thường.
4. Lợi ích của ConfigMap
✅ Không cần build lại Docker Image khi đổi cấu hình.
✅ Một Docker Image có thể dùng cho nhiều môi trường.
✅ Dễ quản lý và cập nhật.
✅ Tách biệt code và configuration, đúng với nguyên tắc của ứng dụng cloud-native.
5. Khi nào không nên dùng ConfigMap?
ConfigMap không dùng để lưu thông tin nhạy cảm.
Ví dụ:
- Mật khẩu database
- API Key
- Access Token
- Secret Key
Những dữ liệu này nên được lưu trong Secret, chủ đề của bài tiếp theo.
Tổng kết
ConfigMap giúp ứng dụng trở nên linh hoạt hơn bằng cách tách cấu hình ra khỏi source code và Docker Image. Nhờ vậy, cùng một Image có thể chạy ở nhiều môi trường khác nhau mà chỉ cần thay đổi giá trị trong ConfigMap.
Code là code. Cấu hình là cấu hình. Đừng trộn chúng vào với nhau.
Bài tiếp theo
ConfigMap rất hữu ích, nhưng có một vấn đề lớn:
Nếu ConfigMap lưu được mật khẩu Database thì sao? Có an toàn không?
Đó chính là lý do Kubernetes tạo ra Secret. Chúng ta sẽ khám phá ở bài tiếp theo.
All rights reserved