Giao diện
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 ConfigMapKiể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@ssw0rdMount 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 volumeKiể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.confMount ConfigMap vào NGINX Pod tại /etc/nginx/conf.d/:
yaml
# TODO: Tạo Pod NGINX mount ConfigMap chứa custom configKiể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.secretNamevàvolumeMounts[].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-configBà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-credentialsBà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