Danh sách bài viết trong series Học Kubernetes Từ Cơ Bản Đến Chứng Chỉ CKAD
- Lộ Trình Học Kubernetes Từ Cơ Bản Đến Chứng Chỉ CKAD
- Bài 1: Giới Thiệu Kubernetes Và Khái Niệm Cluster Cho CKAD
- Bài 2: Cài Đặt Minikube Và sử dụng kubectl Cơ Bản
- Bài 3: Quản Lý Pod Cơ Bản (Create, Delete, Describe)
- Bài 4: Sử Dụng ConfigMap Và Secret Trong YAML
- Bài 5: Quản Lý Environment Variables Và Command/Args
- Bài 6: Cấu Hình Deployment Và Replica Set
- Bài 7: Thiết Kế Pod Với Nhiều Container
- Bài 8: Sử Dụng Sidecar Và Init Container
- Bài 9: Chia Sẻ Tài Nguyên Giữa Các Container
- Bài 10: Giám Sát Log Và Events Với kubectl logs
- Bài 11: Debug Pod Với kubectl describe Và exec
- Bài 12: Tối Ưu Pod Với Resource Limits Và Requests
- Bài 13: Sử Dụng Liveness Và Readiness Probes
- Bài 14: Tối Ưu Hóa Pod Với HPA (Horizontal Pod Autoscaler)
- Bài 15: Cấu Hình Service (ClusterIP, NodePort)
- Bài 16: Sử Dụng Ingress Và Network Policy
- Bài 17: Quản Lý DNS Và Load Balancing Trong Kubernetes
- Bài 18: Sử Dụng Volume (emptyDir, hostPath)
- Bài 19: Cấu Hình Persistent Volume Và Persistent Volume Claim
- Bài 20: Tổng Kết, Mẹo Thi CKAD, Bài Tập Thực Hành Cuối
Sau khi đã làm quen với việc quản lý Pods cơ bản ở Bài 3, chúng ta sẽ chuyển sang domain Configuration một phần quan trọng chiếm đến 20% trọng số trong kỳ thi CKAD. Bài này tập trung vào ConfigMap và Secret, hai objects chính để quản lý cấu hình và dữ liệu nhạy cảm trong Kubernetes. Bạn sẽ học cách tạo chúng qua YAML, mount vào Pods dưới dạng environment variables hoặc volumes, và áp dụng thực tế để tránh hardcode config vào container images.
Domain Configuration trong CKAD yêu cầu bạn thành thạo việc tách biệt config khỏi code, giúp ứng dụng linh hoạt hơn mà không cần rebuild image. Trong kỳ thi, bạn có thể gặp như tạo ConfigMap từ file, inject Secret vào Pod làm env var, hoặc debug config sai. Nói chung thì cũng không khó khăn bạn hiểu bài này là được ngay.
ConfigMap Là Gì Và Tại Sao Nên Sử Dụng?
ConfigMap là một object Kubernetes dùng để lưu trữ dữ liệu cấu hình không nhạy cảm dưới dạng key-value pairs hoặc toàn bộ file. Nó giúp tách biệt config khỏi container image, cho phép bạn thay đổi hành vi ứng dụng mà không rebuild (ví dụ: thay đổi URL database hoặc log level). ConfigMap được lưu trong etcd như plain text, nên chỉ dùng cho dữ liệu không bí mật.
Lợi ích chính:
- Decouple config: Ứng dụng có thể đọc config từ env vars hoặc mounted files, dễ scale và update.
- Reusability: Một ConfigMap có thể được sử dụng bởi nhiều Pods.
- Versioning: Dễ quản lý qua Git, hỗ trợ CI/CD.
- Types: Binary (cho file nhị phân) hoặc immutable (không thể chỉnh sửa sau tạo, để tránh lỗi).
Trong CKAD, ConfigMap xuất hiện thường xuyên ở các task liên quan đến configuration, như mount một file config vào Pod để ứng dụng đọc.
Dưới đây là sơ đồ minh họa cách ConfigMap được sử dụng trong Kubernetes
Secret Là Gì Và Sự Khác Biệt Với ConfigMap?
Secret tương tự ConfigMap nhưng dành cho dữ liệu nhạy cảm như passwords, API keys, certificates. Dữ liệu trong Secret được mã hóa base64 (không phải encryption thực sự, chỉ obfuscation), và Kubernetes lưu chúng an toàn hơn (không expose qua kubectl get mặc định). Secret có thể là generic (từ literals/files), docker-registry (cho pull images), hoặc tls (cho certificates).
Khác biệt chính với ConfigMap:
- Security: Secret base64-encoded, không hiển thị plain text khi describe ConfigMap là plain text.
- Size limit: Secret giới hạn 1MB (do etcd), ConfigMap cũng tương tự.
- Usage: Secret cho sensitive data ConfigMap cho non-sensitive.
- Immutable: Cả hai đều hỗ trợ, nhưng Secret thường dùng để tránh leak.
Trong Production, dùng thêm tools như SealedSecrets hoặc Vault để encrypt thực sự. Trong CKAD, bạn cần biết cách tạo Secret và mount mà không expose data.
Dưới đây là diagram về cách Secret hoạt động, minh họa luồng encrypt và consume trong cluster.
Bảng So Sánh ConfigMap Và Secret
| Tiêu chí | ConfigMap | Secret |
|---|---|---|
| Dữ liệu | Non-sensitive (e.g., app settings, URLs) | Sensitive (e.g., passwords, keys) |
| Encoding | Plain text | Base64-encoded |
| Tạo từ | Literals, files, directories, env vars | Tương tự, plus dockerconfigjson, tls |
| Mount vào Pod | Env vars, volumes (subPath cho files) | Tương tự, nhưng cẩn thận với permissions |
| Immutable | Hỗ trợ (spec.immutable: true) | Hỗ trợ |
| Lệnh tạo imperative | kubectl create configmap |
kubectl create secret generic |
| Xem dữ liệu | kubectl get cm -o yaml (plain) |
kubectl get secret -o yaml (base64) |
Cách Tạo ConfigMap Và Secret Trong YAML
Có hai cách: Imperative (nhanh cho test) và Declarative (YAML, ưu tiên cho CKAD).
Tạo ConfigMap
Imperative
- Từ literals:
kubectl create configmap my-cm --from-literal=key1=value1 --from-literal=key2=value2. - Từ file:
kubectl create configmap my-cm --from-file=config.properties. - Từ env file:
kubectl create configmap my-cm --from-env-file=env.txt.
Declarative (YAML)
Cấu trúc YAML:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-configmap
data:
key1: value1
config.properties: | # Multi-line file
property1=val1
property2=val2
binaryData: # Cho binary, base64-encoded
binary-key: <base64-data>
immutable: true # Optional
Áp dụng: kubectl apply -f cm.yaml.
Tạo Secret
Imperative
- Generic:
kubectl create secret generic my-secret --from-literal=password=supersecret --from-file=ssh-key=/path/to/key. - TLS:
kubectl create secret tls my-tls --cert=path/to/cert --key=path/to/key. - Docker registry:
kubectl create secret docker-registry my-reg --docker-server=... --docker-username=....
Declarative (YAML)
Cấu trúc YAML (data base64-encoded):
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque # Generic
data:
password: c3VwZXJzZWNyZXQ= # echo -n 'supersecret' | base64
api-key: YXBpa2V5Cg==
stringData: # Plain text, Kubernetes sẽ encode
username: admin
immutable: true
Áp dụng: kubectl apply -f secret.yaml. Lưu ý: Sử dụng stringData để tránh encode thủ công.
Mount ConfigMap/Secret Vào Pod Trong YAML
Mount dưới dạng env vars (dễ đọc) hoặc volumes (cho files phức tạp).
Mount Làm Environment Variables
YAML Pod ví dụ cho ConfigMap:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: app
image: busybox
env:
- name: KEY1
valueFrom:
configMapKeyRef:
name: my-configmap
key: key1
- name: PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
Toàn bộ ConfigMap/Secret: envFrom: [configMapRef: {name: my-cm}] hoặc secretRef.
Mount Làm Volumes
YAML Pod:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: config-vol
mountPath: /etc/config # Đường dẫn trong container
readOnly: true
- name: secret-vol
mountPath: /etc/secret
volumes:
- name: config-vol
configMap:
name: my-configmap
items: # Optional, chỉ mount key cụ thể
- key: config.properties
path: app.conf # Tên file trong volume
- name: secret-vol
secret:
secretName: my-secret
items:
- key: password
path: db-pass.txt
mode: 0400 # Permissions
Dùng subPath để mount file cụ thể mà không overwrite thư mục.
Các Lệnh Kubectl Để Quản Lý ConfigMap Và Secret
- Get:
kubectl get configmaphoặckubectl get secret. - Describe:
kubectl describe cm my-cm(hiển thị data plain)kubectl describe secret my-secret(không hiển thị data). - Edit:
kubectl edit cm my-cm(mở editor sửa YAML). - Delete:
kubectl delete cm my-cm. - Xem data:
kubectl get cm my-cm -o yaml | grep data -A 10cho Secret:kubectl get secret my-secret -o jsonpath='{.data.password}' | base64 -d.
Liên Hệ Với Chứng Chỉ CKAD
Domain Configuration (20%) tập trung vào ConfigMap/Secret, với nhiệm vụ như:
- Tạo ConfigMap từ file và mount làm volume trong Pod.
- Inject Secret làm env var cho database credentials.
- Update config mà không restart Pod (dùng immutable để tránh).
Mẹo thi:
- Nhớ encode base64 cho Secret (dùng
echo -n 'value' | base64trong thi). - Dùng
kubectl explain configmaphoặcsecretđể xem docs YAML nhanh. - Thời gian: 5-7 phút/task kiểm tra bằng
kubectl execvào Pod xem env (env | grep KEY) hoặc files (cat /etc/config/app.conf). - Luyện trên Minikube hoặc Katacoda để simulate.
Thực Hành Thực Tế Trên Minikube
-
Tạo ConfigMap:
echo -e "db_url=localhost\ndb_port=5432" > config.txt kubectl create configmap app-config --from-file=config.txt kubectl get cm app-config -o yaml -
Tạo Secret:
kubectl create secret generic db-secret --from-literal=password=pass123 kubectl get secret db-secret -o jsonpath='{.data.password}' | base64 -d # Xem plain -
Mount vào Pod: Tạo file
pod-with-config.yamlvới YAML mount trên, rồi:kubectl apply -f pod-with-config.yaml kubectl exec -it my-pod -- env | grep KEY1 # Check env kubectl exec -it my-pod -- cat /etc/config/app.conf # Check file -
Cleanup:
kubectl delete pod my-pod; kubectl delete cm app-config; kubectl delete secret db-secret.
Nếu Pod không đọc config, dùng describe pod debug volume mounts.
Kết Luận
Bài này mình đã hướng dẫn chi tiết sử dụng ConfigMap và Secret trong YAML, từ tạo đến mount. Bạn giờ có thể quản lý config an toàn, sẵn sàng cho domain Configuration trong CKAD. Tiếp theo, ở Bài 5: Quản Lý Environment Variables Và Command/Args, chúng ta sẽ khám phá cách tùy chỉnh runtime của containers.









