Bài 5: Quản Lý Environment Variables Và Command/Args

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.

9ac625b0-d50d-4a13-90fb-9d3b26f2666f

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

  1. 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
  2. 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.

  3. 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
  4. 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é).

Điều hướng chuỗi bài viết<< Bài 4: Sử Dụng ConfigMap Và Secret Trong YAML
>> Bài 6: Cấu Hình Deployment Và Replica Set

Thông tin nổi bật

Sự kiện phát trực tiếp​

Event Thumbnail

Báo cáo quan trọng

Article Thumbnail
Article Thumbnail
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Tiêu điểm chuyên gia