Skip to content

Thực hành: ConfigMap & Secrets

🎯 Mục tiêu

🎯 Sau bài thực hành này, bạn sẽ:

  • Tạo ConfigMap từ literal values và file
  • Inject config vào Pod qua environment variables và volume mount
  • Quản lý Secrets và hiểu giới hạn bảo mật của base64 encoding

Mô tả bài tập

Ứng dụng backend cần cấu hình database connection và API keys. Bạn sẽ tách config ra khỏi code theo 12-Factor App methodology, sử dụng ConfigMap cho non-sensitive config và Secrets cho credentials.

Yêu cầu

Bài 1: ConfigMap — Environment Variables

Tạo ConfigMap chứa cấu hình ứng dụng và inject vào Pod:

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  # TODO: Thêm các key-value pairs
  # APP_ENV: "production"
  # LOG_LEVEL: "info"
  # DB_HOST: "postgres.database.svc.cluster.local"
  # DB_PORT: "5432"

Tạo Pod sử dụng ConfigMap qua envFrom:

yaml
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app
    image: busybox:1.36
    command: ["sh", "-c", "env | grep -E 'APP_|DB_|LOG_' && sleep 3600"]
    envFrom:
    # TODO: Reference ConfigMap

Kiểm tra: kubectl logs app-pod phải hiển thị các environment variables.

Bài 2: Secrets — Sensitive Data

Tạo Secret chứa database credentials:

bash
# Tạo Secret từ command line
kubectl create secret generic db-credentials \
  --from-literal=DB_USERNAME=admin \
  --from-literal=DB_PASSWORD=S3cur3P@ssw0rd

Mount Secret vào Pod dưới dạng volume tại /etc/secrets/:

yaml
apiVersion: v1
kind: Pod
metadata:
  name: secure-app
spec:
  containers:
  - name: app
    image: busybox:1.36
    command: ["sh", "-c", "cat /etc/secrets/DB_USERNAME && echo && cat /etc/secrets/DB_PASSWORD && sleep 3600"]
    volumeMounts:
    # TODO: Mount secret volume
  volumes:
  # TODO: Define secret volume

Kiểm tra: kubectl exec secure-app -- ls /etc/secrets/ phải thấy 2 files.

Bài 3: ConfigMap từ File + Hot Reload

Tạo ConfigMap từ file config:

bash
# Tạo file nginx config
cat <<EOF > custom-nginx.conf
server {
    listen 80;
    server_name localhost;
    location / {
        return 200 'Environment: production\n';
        add_header Content-Type text/plain;
    }
}
EOF

kubectl create configmap nginx-config --from-file=default.conf=custom-nginx.conf

Mount ConfigMap vào NGINX Pod tại /etc/nginx/conf.d/:

yaml
# TODO: Tạo Pod NGINX mount ConfigMap chứa custom config

Kiểm tra: kubectl exec nginx-custom -- curl -s localhost phải trả về "Environment: production".

Gợi ý

💡 Xem gợi ý
  • Bài 1: Dùng envFrom.configMapRef.name để inject tất cả keys từ ConfigMap thành env vars
  • Bài 2: Secret volume mount mỗi key thành 1 file. Dùng volumes[].secret.secretNamevolumeMounts[].mountPath
  • Bài 3: ConfigMap mount qua volume sẽ tự động update khi ConfigMap thay đổi (kubelet sync period ~1 phút)
  • Nhớ rằng Secrets chỉ base64-encoded, KHÔNG encrypted. Cần EncryptionConfiguration cho etcd trong production

Lời giải

✅ Xem lời giải

Bài 1: ConfigMap + envFrom

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: "production"
  LOG_LEVEL: "info"
  DB_HOST: "postgres.database.svc.cluster.local"
  DB_PORT: "5432"
---
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app
    image: busybox:1.36
    command: ["sh", "-c", "env | grep -E 'APP_|DB_|LOG_' && sleep 3600"]
    envFrom:
    - configMapRef:
        name: app-config

Bài 2: Secret Volume Mount

yaml
apiVersion: v1
kind: Pod
metadata:
  name: secure-app
spec:
  containers:
  - name: app
    image: busybox:1.36
    command: ["sh", "-c", "cat /etc/secrets/DB_USERNAME && echo && cat /etc/secrets/DB_PASSWORD && sleep 3600"]
    volumeMounts:
    - name: db-creds
      mountPath: /etc/secrets
      readOnly: true
  volumes:
  - name: db-creds
    secret:
      secretName: db-credentials

Bài 3: NGINX với ConfigMap Volume

yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-custom
spec:
  containers:
  - name: nginx
    image: nginx:1.24-alpine
    ports:
    - containerPort: 80
    volumeMounts:
    - name: nginx-conf
      mountPath: /etc/nginx/conf.d
  volumes:
  - name: nginx-conf
    configMap:
      name: nginx-config

Liên kết liên quan