← Về danh sách bài học Bài 8/25

🔐 Bài 8: Secret - Quản Lý Mật Khẩu

⏱️ Thời gian: 20 phút | 📚 Độ khó: Trung bình

🎯 Sau bài học này, bạn sẽ:

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ỳ
💡 .gitignore:
*-secret.yaml
secrets/

📝 Tóm Tắt Bài Học