Tìm hiểu về ConfigMaps trong Kubernetes, một công cụ rất hữu ích để quản lý cấu hình ứng dụng một cách linh hoạt và dễ dàng.
1. ConfigMaps là gì?
Trong Kubernetes, ConfigMap là một tài nguyên giúp bạn lưu trữ dữ liệu cấu hình bên ngoài container.
Tức là thay vì bạn ghi cứng mấy cái config như DB_URL, API_KEY… vào trong image của container, thì bạn có thể bỏ nó ra ngoài, lưu vào ConfigMap. Nhờ vậy, khi cần chỉnh sửa gì, bạn chỉ cần đổi ở ConfigMap là xong – không phải build lại image container nữa.
Lưu ý: Khi bạn cập nhật ConfigMap, các Pod đang chạy không tự động nhận config mới đâu. Bạn phải restart Pod thì nó mới “nạp” lại config

2. Tại sao nên dùng ConfigMap?
Việc tách config ra ngoài giúp ích rất nhiều:
- Dễ cập nhật: Thay đổi cấu hình mà không cần đụng vào container.
- Quản lý rõ ràng: Dễ dàng kiểm soát và chỉnh sửa config cho ứng dụng.
- Linh hoạt giữa môi trường: Có thể tạo nhiều ConfigMap cho các môi trường khác nhau như dev, staging, production…
3. Cách tạo và sử dụng ConfigMaps
- Tạo ConfigMap với YAML: Bạn có thể tạo ConfigMap bằng cách sử dụng một file YAML mô tả các dữ liệu cần lưu trữ.Ví dụ file YAML:
apiVersion: v1 kind: ConfigMap metadata: name: example-config data: key: value - Tạo ConfigMap với kubectl: Bạn cũng có thể tạo ConfigMap bằng cách sử dụng các câu lệnh kubectl từ file, thư mục hoặc giá trị trực tiếp:
kubectl create configmap example-config --from-literal=key=value
4. Liên kết ConfigMap với Pod
Có hai cách để sử dụng ConfigMap trong Pod:
- Môi trường biến: Bạn có thể gán dữ liệu ConfigMap vào các biến môi trường trong container.
- Mount như một volume: Bạn cũng có thể mount ConfigMap vào container như một volume.
Ví dụ:
envFrom:
- configMapRef:
name: example-config
5. Các câu lệnh kubectl với ConfigMap
| Câu lệnh | Mô tả |
|---|---|
kubectl get cm |
Liệt kê các ConfigMap trong namespace hiện tại. |
kubectl get cm -o wide |
Liệt kê các ConfigMap với thông tin chi tiết hơn. |
kubectl get cm -A |
Liệt kê tất cả ConfigMap từ tất cả các namespace. |
kubectl get cm -n <namespace> |
Liệt kê ConfigMap trong một namespace cụ thể. |
kubectl create cm <config-map-name> --from-literal=<key>=<value> |
Tạo ConfigMap từ các giá trị literal. |
kubectl create cm <config-map-name> --from-file=<file-name> |
Tạo ConfigMap từ một file. |
kubectl create cm <config-map-name> --from-file=<key>=<file-name> |
Tạo ConfigMap với tên key tùy chỉnh từ một file. |
kubectl create cm <config-map-name> --from-file=<file1> --from-file=<file2> |
Tạo ConfigMap từ nhiều file. |
kubectl create cm <config-map-name> --from-file=<directory-name>/ |
Tạo ConfigMap từ một thư mục. |
kubectl create cm <config-map-name> --from-env-file=<env-file> |
Tạo ConfigMap từ file .env. |
kubectl describe cm <config-map-name> |
Xem chi tiết ConfigMap. |
kubectl get cm <config-map-name> -o yaml |
Xem ConfigMap dưới định dạng YAML. |
kubectl get cm <config-map-name> -o json |
Xem ConfigMap dưới định dạng JSON. |
kubectl delete cm <config-map-name> |
Xóa một ConfigMap. |
kubectl create cm <config-map-name> --from-literal=<key>=<value> -L <label> |
Tạo ConfigMap với nhãn (label). |
kubectl get cm -l <label>=<value> |
Lọc ConfigMap theo nhãn. |
kubectl create cm <config-map-name> --from-literal=<key>=<value> -n <namespace> |
Tạo ConfigMap trong một namespace cụ thể. |
kubectl edit cm <config-map-name> |
Chỉnh sửa ConfigMap. |
kubectl get cm <config-map-name> -o=jsonpath='{.data.<key>}' |
Trích xuất giá trị từ ConfigMap. |
kubectl patch cm <config-map-name> -p '{"data": {"<key>": "<new-value>"}}' |
Cập nhật giá trị trong ConfigMap. |
kubectl create cm <config-map-name> --from-literal=<key>=<new-value> --dry-run=client -o yaml > config-map.yaml |
Thay thế ConfigMap bằng nội dung mới. |
kubectl run <pod-name> --image=<image-name> --env-from=configmapref=<config-map-name> |
Tạo pod với ConfigMap như biến môi trường. |
kubectl get cm -o yaml |
Xuất tất cả ConfigMaps từ namespace. |
kubectl get cm --watch |
Theo dõi thay đổi của ConfigMap. |
6. Hand-On: Cách tạo ConfigMap trong Kubernetes
Cách tạo ConfigMap và sử dụng trong Deployment. Mình sẽ demo 3 cách phổ biến nhất:
- Tạo ConfigMap từ biến literal
- Tạo từ file
.env(môi trường) - Tạo từ file
.properties(kiểu file cấu hình)
Bước 1: Khởi tạo Namespace
Đầu tiên, mình tạo một namespace mới tên là config-demo để chứa các tài nguyên.
kubectl create namespace config-demo
Bước 2: Tạo ConfigMap từ Literal
Giờ mình sẽ tạo một ConfigMap bằng cách truyền trực tiếp key và value vào dòng lệnh:
kubectl create configmap cm-literal \
--from-literal=app=tickets \
--from-literal=environment=prod \
-n config-demo
Xem nội dung ConfigMap vừa tạo:
kubectl get configmap cm-literal -n config-demo -o yaml
Bước 3: Tạo ConfigMap từ File .env
Tạo một file tên là env-file.env với nội dung:
app=flights environment=qa
Sau đó, tạo ConfigMap từ file này:
kubectl create configmap cm-env \
--from-env-file=env-file.env \
-n config-demo
Xem nội dung:
kubectl get configmap cm-env -n config-demo -o yaml
Bước 4: Tạo ConfigMap từ File .properties
Giả sử bạn có một file tên là file.properties chứa:
username=admin password=secret
Tạo ConfigMap từ file đó:
kubectl create configmap cm-file \
--from-file=mydata=file.properties \
-n config-demo
Xem nội dung:
kubectl get configmap cm-file -n config-demo -o yaml
Ở đây bạn sẽ thấy dữ liệu được lưu dưới dạng multiline string.
Bước 5: Sử dụng ConfigMap trong Deployment
Bây giờ mình sẽ tạo một file YAML cho deployment và sử dụng cả 3 ConfigMap theo 3 cách khác nhau:
- Dùng biến môi trường từ ConfigMap literal
- Import toàn bộ ConfigMap từ file
.env - Mount file config vào container qua volume
Ví dụ một phần nội dung YAML như sau:
env:
- name: APP
valueFrom:
configMapKeyRef:
name: cm-literal
key: app
- name: ENVIRONMENT
valueFrom:
configMapKeyRef:
name: cm-literal
key: environment
envFrom:
- configMapRef:
name: cm-env
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: cm-file
Bước 6: Kiểm tra kết quả
Sau khi apply YAML lên, bạn có thể exec vào Pod và kiểm tra các biến môi trường:
kubectl exec -it <pod-name> -n config-demo -- env
Hoặc kiểm tra nội dung file config đã mount:
kubectl exec -it <pod-name> -n config-demo -- cat /config/mydata