← Về danh sách bài học
Bài 8/25
🔐 Bài 8: Secret - Quản Lý Mật Khẩu
🎯 Sau bài học này, bạn sẽ:
- Hiểu Secret là gì và khác ConfigMap thế nào
- Các loại Secret trong K8s
- Tạo và sử dụng Secret trong Pod
- Best practices bảo mật Secret
1. Secret vs ConfigMap
| Tiêu chí | ConfigMap | Secret |
|---|---|---|
| Mục đích | Config thông thường | Dữ liệu nhạy cảm |
| Encoding | Plain text | Base64 |
| Ví dụ | App settings, URLs | Passwords, API keys, TLS certs |
⚠️ Quan trọng: Base64 KHÔNG phải mã hóa! Ai có quyền truy cập cluster đều decode được.
Cần thêm các biện pháp bảo mật khác (RBAC, encryption at rest).
2. Các Loại Secret
| Type | Mô tả |
|---|---|
Opaque |
Generic (mặc định) |
kubernetes.io/dockerconfigjson |
Docker registry credentials |
kubernetes.io/tls |
TLS certificate + private key |
kubernetes.io/basic-auth |
Username + password |
kubernetes.io/ssh-auth |
SSH private key |
3. Tạo Secret
Cách 1: Command line (generic)
# Từ literal
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=S3cr3tP@ssw0rd
# Từ file
echo -n "admin" > username.txt
echo -n "S3cr3tP@ssw0rd" > password.txt
kubectl create secret generic db-secret \
--from-file=username=username.txt \
--from-file=password=password.txt
# Xem (sẽ thấy base64)
kubectl get secret db-secret -o yaml
Cách 2: YAML với base64
# Encode base64
echo -n "admin" | base64
# YWRtaW4=
echo -n "S3cr3tP@ssw0rd" | base64
# UzNjcjN0UEBzc3cwcmQ=
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64 của "admin"
password: UzNjcjN0UEBzc3cwcmQ= # base64 của "S3cr3tP@ssw0rd"
Cách 3: YAML với stringData (không cần base64)
# secret-stringdata.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
stringData: # K8s tự encode base64
username: admin
password: S3cr3tP@ssw0rd
💡 Khuyên dùng:
stringData dễ đọc hơn, K8s tự động convert sang base64 khi
apply.
4. Sử Dụng Secret Trong Pod
Cách 1: Environment Variables
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: myapp:1.0
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
Cách 2: Mount làm Volume
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: myapp:1.0
volumeMounts:
- name: secret-volume
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: db-secret
# Tạo files: /etc/secrets/username, /etc/secrets/password
5. Docker Registry Secret
Để pull images từ private registry:
# Tạo docker registry secret
kubectl create secret docker-registry my-registry-secret \
--docker-server=ghcr.io \
--docker-username=myuser \
--docker-password=mytoken \
[email protected]
# Sử dụng trong Pod
apiVersion: v1
kind: Pod
metadata:
name: private-app
spec:
containers:
- name: app
image: ghcr.io/myuser/private-app:latest
imagePullSecrets:
- name: my-registry-secret
6. TLS Secret
# Tạo TLS secret từ cert và key
kubectl create secret tls tls-secret \
--cert=path/to/tls.crt \
--key=path/to/tls.key
# Hoặc YAML
apiVersion: v1
kind: Secret
metadata:
name: tls-secret
type: kubernetes.io/tls
data:
tls.crt: <base64-encoded-cert>
tls.key: <base64-encoded-key>
7. Best Practices
🔒 Bảo mật Secret:
• KHÔNG commit secrets vào Git
• Enable encryption at rest trong etcd
• Dùng RBAC giới hạn ai được xem secrets
• Cân nhắc external solutions: HashiCorp Vault, AWS Secrets Manager
• Rotate secrets định kỳ
• KHÔNG commit secrets vào Git
• Enable encryption at rest trong etcd
• Dùng RBAC giới hạn ai được xem secrets
• Cân nhắc external solutions: HashiCorp Vault, AWS Secrets Manager
• Rotate secrets định kỳ
💡 .gitignore:
*-secret.yamlsecrets/
📝 Tóm Tắt Bài Học
- Secret lưu dữ liệu nhạy cảm (passwords, tokens)
- Dữ liệu được encode base64 (không phải encrypt!)
- Dùng
stringDatađể tránh phải encode thủ công - Inject qua env hoặc volume
- Các loại: Opaque, TLS, docker-registry...