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 đã nắm vững cách sử dụng ConfigMap và Secret để quản lý cấu hình trong Bài 4, chúng ta tiếp tục với domain Configuration (chiếm 20% trọng số trong kỳ thi CKAD). Bài này tập trung vào việc quản lý environment variables (env vars) và command/args trong spec của containers. Đây là các kỹ năng thiết yếu để tùy chỉnh ứng dụng hoạt động mà không cần thay đổi container image, giúp ứng dụng linh hoạt hơn trong môi trường Kubernetes.
Trong CKAD, domain Configuration thường yêu cầu bạn inject env vars từ nhiều nguồn (hardcode, ConfigMap/Secret, hoặc downward API) và override command/args để điều chỉnh runtime. Bạn có thể gặp phần như thiết lập env vars cho một Pod để kết nối database, hoặc thay đổi args để chạy script cụ thể.
Environment Variables Là Gì Và Tại Sao Quan Trọng?
Environment variables là các biến hệ thống được inject vào process của container tại runtime, giúp truyền thông tin động như credentials, config values, hoặc metadata cluster mà không hardcode vào code ứng dụng. Trong Kubernetes, env vars được định nghĩa trong spec.containers[].env của Pod, và chúng override bất kỳ env vars nào trong container image.
Lợi ích chính:
- Tách biệt config khỏi code: Dễ thay đổi mà không rebuild image (12-factor app principle).
- Dynamic values: Sử dụng downward API để lấy metadata như Pod name, IP, hoặc node info.
- Integration: Kết hợp với ConfigMap/Secret để inject data an toàn.
- Portability: Ứng dụng có thể chạy ở nhiều môi trường (dev, prod) với env vars khác nhau.
Nguồn env vars trong Kubernetes:
- Hardcoded values: Giá trị tĩnh trong YAML.
- ConfigMap/Secret: Tham chiếu key từ objects này.
- Downward API: Metadata từ Pod/fieldRef hoặc resourceFieldRef (ví dụ: CPU limits).
- Container image: Env vars mặc định từ Dockerfile, nhưng có thể override.
Nếu có xung đột, env vars từ Pod spec ưu tiên cao nhất. Env vars là string, nhưng ứng dụng có thể parse chúng thành number/boolean.
Dưới đây là diagram minh họa cách env vars được inject vào Pod và containers, từ nguồn tham khảo, giúp bạn hình dung luồng dữ liệu.

Command Và Args Là Gì?
Command và args dùng để override entrypoint (command) và arguments (args) mặc định của container image. Trong Dockerfile, entrypoint là lệnh chính (ví dụ: /bin/app), args là tham số truyền vào (ví dụ: --port=80).
Trong Kubernetes:
- Command: Mảng string thay thế ENTRYPOINT của image.
- Args: Mảng string thay thế CMD của image.
- Nếu không định nghĩa, dùng mặc định từ image.
Lợi ích:
- Tùy chỉnh runtime: Chạy script cụ thể hoặc thay đổi behavior mà không rebuild.
- Debug: Chạy shell thay vì app chính để troubleshoot.
- Best practice: Sử dụng cho Jobs hoặc Pods one-off.
Ví dụ: Image có ENTRYPOINT [“/bin/echo”, “hello”], bạn có thể override command thành [“sleep”] và args thành [“infinity”] để giữ Pod chạy.
Định Nghĩa Environment Variables Và Command/Args Trong YAML
Chúng ta ưu tiên declarative YAML cho CKAD. Dưới đây là cấu trúc chi tiết.
Environment Variables Trong YAML
Cấu trúc cơ bản trong Pod spec:
apiVersion: v1
kind: Pod
metadata:
name: env-pod
spec:
containers:
- name: my-container
image: busybox
env: # Mảng các env var
- name: STATIC_VAR # Tên biến (uppercase convention)
value: "hello world" # Giá trị tĩnh
- name: CONFIG_VAR
valueFrom:
configMapKeyRef: # Từ ConfigMap
name: my-configmap
key: app.key
optional: false # Default false, error nếu không tồn tại
- name: SECRET_VAR
valueFrom:
secretKeyRef: # Từ Secret
name: my-secret
key: password
- name: POD_NAME # Downward API
valueFrom:
fieldRef:
fieldPath: metadata.name # Các field: metadata.name, status.podIP, spec.nodeName, etc.
- name: CPU_LIMIT # Resource field
valueFrom:
resourceFieldRef:
containerName: my-container # Optional
resource: limits.cpu
envFrom: # Inject toàn bộ ConfigMap/Secret làm env vars (prefix optional)
- configMapRef:
name: my-configmap
- secretRef:
name: my-secret
prefix: DB_ # Optional, prefix keys
Lưu ý: envFrom inject tất cả keys làm env vars (key thành uppercase, thay – bằng _). Sử dụng cho nhiều vars.
Command Và Args Trong YAML
Trong container spec:
spec:
containers:
- name: my-container
image: alpine
command: ["/bin/sh"] # Override ENTRYPOINT
args: ["-c", "echo $MY_VAR && sleep 60"] # Override CMD, có thể dùng env vars
Command và args là mảng string để tránh shell parsing issues.
Bảng Tóm Tắt Các Nguồn Env Vars
| Nguồn | Mô tả | Ví dụ YAML | Ưu điểm |
|---|---|---|---|
| Value tĩnh | Giá trị hardcode trực tiếp | value: “value” | Đơn giản, nhanh |
| ConfigMapKeyRef | Tham chiếu key từ ConfigMap | configMapKeyRef: {name: cm, key: k} | Non-sensitive config, dễ update |
| SecretKeyRef | Tham chiếu key từ Secret | secretKeyRef: {name: sec, key: pass} | Sensitive data, base64-protected |
| FieldRef (Downward API) | Metadata từ Pod | fieldRef: {fieldPath: metadata.name} | Dynamic info như Pod IP, name |
| ResourceFieldRef | Resource requests/limits | resourceFieldRef: {resource: limits.cpu} | Tối ưu scaling dựa trên resources |
| EnvFrom | Inject toàn bộ từ ConfigMap/Secret | envFrom: [{configMapRef: {name: cm}}] | Bulk import, prefix để tránh conflict |
Các Lệnh Kubectl Liên Quan
- Tạo Pod với env vars (imperative):
kubectl run env-pod --image=busybox --env="KEY=value" --command -- sleep infinity. - Xem env vars trong Pod:
kubectl exec env-pod -- env(liệt kê tất cả env). - Describe Pod:
kubectl describe pod env-pod(xem env trong spec). - Edit Pod:
kubectl edit pod env-pod(sửa env, nhưng Pod immutable nên thường recreate). - Generate YAML:
kubectl run --dry-run=client -o yaml --env="KEY=val" --command -- echo hello > pod.yaml.
Liên Hệ Với Chứng Chỉ CKAD
Domain Configuration (20%) thường có task về env vars và command/args, như:
- Định nghĩa env vars từ Downward API để Pod tự nhận biết name/IP.
- Override command/args để chạy custom script trong container.
- Kết hợp với ConfigMap/Secret để inject credentials.
Mẹo thi:
- Nhớ fieldPath phổ biến: metadata.name, status.podIP, spec.serviceAccountName, metadata.labels[‘key’].
- Dùng
kubectl explain pod.spec.containers.envđể xem docs nhanh. - Debug: Exec vào Pod và
envđể verify. - Thời gian: 4-6 phút/task ưu tiên YAML declarative.
- Luyện: Tạo Pod với env từ nhiều nguồn, check bằng logs/exec.
Thực Hành Thực Tế Trên Minikube
-
Tạo ConfigMap/Secret cho env (từ Bài 4):
kubectl create configmap app-config --from-literal=APP_MODE=prod kubectl create secret generic app-secret --from-literal=API_KEY=secret123 -
Tạo Pod YAML với env và command/args: Tạo file
env-command-pod.yaml:apiVersion: v1 kind: Pod metadata: name: env-command-pod spec: containers: - name: busybox image: busybox command: ["/bin/sh"] args: ["-c", "echo MODE: $APP_MODE; echo KEY: $API_KEY; echo POD: $POD_NAME; sleep 3600"] env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name envFrom: - configMapRef: name: app-config - secretRef: name: app-secretÁp dụng:
kubectl apply -f env-command-pod.yaml. -
Kiểm tra:
kubectl get pods # Chờ Running kubectl logs env-command-pod # Xem output: MODE: prod, KEY: secret123, POD: env-command-pod kubectl exec -it env-command-pod -- env | grep APP # Check env vars -
Cleanup:
kubectl delete pod env-command-pod; kubectl delete cm app-config; kubectl delete secret app-secret.
Nếu Pod crash, dùng describe check events liên quan env hoặc command.
Kết Luận
Bài này mình đã hướng dẫn chi tiết quản lý environment variables và command/args trong YAML, từ khái niệm đến thực hành. Bạn giờ có thể tùy chỉnh containers một cách linh hoạt, sẵn sàng cho các task Configuration trong CKAD. Tiếp theo, ở Bài 6: Cấu Hình Deployment Và Replica Set, bạn sẽ biết cách quản lý ứng dụng stateless với scaling (đây chính là lúc chạy dự án lên nhé).







