Quản lý Secrets Kubernetes 2026: External Secrets, Vault và Câu hỏi Phỏng vấn
Hướng dẫn toàn diện về quản lý secrets Kubernetes với External Secrets Operator và HashiCorp Vault. Bao gồm cấu hình production, rotation tự động và câu hỏi phỏng vấn DevOps.

Quản lý secrets Kubernetes vẫn là một trong những thách thức bảo mật quan trọng nhất trong việc điều phối container. Native Kubernetes Secrets lưu trữ dữ liệu nhạy cảm dưới dạng giá trị base64-encoded, không cung cấp mã hóa mặc định và tạo ra rủi ro bảo mật thường được kiểm tra trong quy trình tuyển dụng DevOps.
Khi được hỏi về bảo mật secrets Kubernetes: native Secrets là base64-encoded, không phải mã hóa. Môi trường production cần external secret managers như HashiCorp Vault hoặc AWS Secrets Manager, được đồng bộ qua External Secrets Operator (ESO). Việc tách biệt này đảm bảo secrets không bao giờ tồn tại trong Git repositories.
Tại sao Native Kubernetes Secrets Không Đủ An Toàn
Resource Secret tích hợp sẵn lưu trữ dữ liệu trong etcd với encoding base64. Encoding này có thể đảo ngược chỉ với một lệnh:
# decoding-secret.sh
# Giải mã giá trị Kubernetes secret dễ dàng
kubectl get secret db-credentials -o jsonpath='{.data.password}' | base64 -dBase64 không phải là mã hóa. Bất kỳ ai có quyền truy cập cluster đều có thể đọc các giá trị secret. Tài liệu Kubernetes cảnh báo rõ ràng rằng Secrets "không được mã hóa theo mặc định" và khuyến nghị kích hoạt mã hóa at rest.
Ba hạn chế chính ảnh hưởng đến các deployment production:
- Không có audit trail: Native Secrets không cung cấp logging về ai đã truy cập giá trị nào và khi nào
- Không có cơ chế rotation: Thay đổi secret yêu cầu can thiệp thủ công và restart pod
- Không tương thích GitOps: Lưu trữ secrets đã mã hóa trong Git vẫn để lộ vấn đề quản lý encryption key
Kiến trúc External Secrets Operator
External Secrets Operator (ESO) kết nối Kubernetes với các hệ thống quản lý secrets bên ngoài. Được phát hành như một dự án CNCF Sandbox vào năm 2023 và đạt phiên bản v0.10 vào năm 2026, ESO hỗ trợ AWS Secrets Manager, HashiCorp Vault, Google Secret Manager, Azure Key Vault và 15 backend khác.
Kiến trúc bao gồm ba custom resources:
# secret-store.yaml
# ClusterSecretStore định nghĩa kết nối đến Vault
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: vault-backend
spec:
provider:
vault:
server: "https://vault.internal:8200"
path: "secret"
version: "v2"
auth:
kubernetes:
mountPath: "kubernetes"
role: "external-secrets"
serviceAccountRef:
name: "external-secrets"
namespace: "external-secrets"ClusterSecretStore này cấu hình ESO để xác thực với Vault sử dụng token service account Kubernetes. Phương thức auth kubernetes xác thực JWT service account với TokenReview API của cluster.
# external-secret.yaml
# ExternalSecret lấy và đồng bộ dữ liệu secret
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: database-credentials
namespace: production
spec:
refreshInterval: 1h
secretStoreRef:
name: vault-backend
kind: ClusterSecretStore
target:
name: db-credentials
creationPolicy: Owner
data:
- secretKey: username
remoteRef:
key: secret/data/production/database
property: username
- secretKey: password
remoteRef:
key: secret/data/production/database
property: passwordESO tạo native Kubernetes Secret từ dữ liệu Vault, tự động cập nhật dựa trên refreshInterval. Ứng dụng sử dụng Secret tiêu chuẩn mà không biết nguồn gốc của nó.
Tích hợp HashiCorp Vault với Kubernetes
HashiCorp Vault cung cấp quản lý secrets tập trung với mã hóa, kiểm soát truy cập và audit logging. Tích hợp Vault với Kubernetes yêu cầu cấu hình trên cả hai hệ thống.
Kích hoạt Kubernetes Auth trong Vault
# vault-k8s-auth.sh
# Cấu hình phương thức xác thực Kubernetes trong Vault
vault auth enable kubernetes
vault write auth/kubernetes/config \
kubernetes_host="https://kubernetes.default.svc:443" \
kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt \
token_reviewer_jwt=@/var/run/secrets/kubernetes.io/serviceaccount/tokenCấu hình này cho phép Vault xác minh token service account Kubernetes. Cluster API server xác thực token và trả về danh tính service account.
Tạo Vault Policy và Role
# vault-policy.hcl
# Policy giới hạn quyền truy cập vào đường dẫn secrets cụ thể
path "secret/data/production/*" {
capabilities = ["read"]
}
path "secret/metadata/production/*" {
capabilities = ["list"]
}# create-vault-role.sh
# Tạo role liên kết với service account Kubernetes
vault policy write production-secrets vault-policy.hcl
vault write auth/kubernetes/role/external-secrets \
bound_service_account_names=external-secrets \
bound_service_account_namespaces=external-secrets \
policies=production-secrets \
ttl=1hRole liên kết service account Kubernetes cụ thể với Vault policies, triển khai quyền truy cập least-privilege.
Rotation Secret Tự động
Rotation secret ngăn chặn việc lộ lâu dài của credentials bị xâm phạm. ESO hỗ trợ rotation tự động thông qua cài đặt refreshInterval, nhưng rotation database yêu cầu phối hợp bổ sung.
# rotating-secret.yaml
# ExternalSecret với refresh interval ngắn cho rotation
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: rotating-api-key
namespace: production
spec:
refreshInterval: 15m
secretStoreRef:
name: vault-backend
kind: ClusterSecretStore
target:
name: api-credentials
creationPolicy: Owner
template:
type: Opaque
metadata:
annotations:
reloader.stakater.com/match: "true"
data:
- secretKey: api-key
remoteRef:
key: secret/data/production/api
property: current-keyAnnotation Reloader kích hoạt restart deployment khi secret thay đổi, đảm bảo ứng dụng lấy credentials mới.
Database Dynamic Secrets với Vault
# vault-database-config.sh
# Cấu hình dynamic secrets cho PostgreSQL
vault secrets enable database
vault write database/config/production-postgres \
plugin_name=postgresql-database-plugin \
allowed_roles="app-readonly,app-readwrite" \
connection_url="postgresql://{{username}}:{{password}}@postgres.production:5432/app" \
username="vault-admin" \
password="vault-admin-password"
vault write database/roles/app-readonly \
db_name=production-postgres \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"Vault tạo credentials database tạm thời theo yêu cầu, tự động thu hồi chúng sau khi TTL hết hạn.
Triển khai Secrets Multi-Cluster
Các tổ chức chạy nhiều cluster Kubernetes cần quản lý secrets tập trung. ESO hỗ trợ cấu hình multi-tenant với namespaced SecretStores.
# multi-cluster-setup.yaml
# SecretStore cho mỗi cluster với isolation
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: cluster-a-secrets
namespace: team-alpha
spec:
provider:
vault:
server: "https://vault.internal:8200"
path: "secret"
namespace: "cluster-a"
auth:
kubernetes:
mountPath: "kubernetes-cluster-a"
role: "team-alpha"Mỗi cluster xác thực với Vault mount path riêng, cho phép policy chi tiết cho từng môi trường.
Câu hỏi Phỏng vấn DevOps Phổ biến
Các câu hỏi phỏng vấn về secrets Kubernetes kiểm tra hiểu biết thực tế về bảo mật và vận hành.
Sẵn sàng chinh phục phỏng vấn DevOps?
Luyện tập với mô phỏng tương tác, flashcards và bài kiểm tra kỹ thuật.
Câu hỏi: Làm thế nào để bảo mật Kubernetes Secrets at rest?
Kích hoạt mã hóa ở cấp etcd sử dụng EncryptionConfiguration:
# encryption-config.yaml
# Cấu hình mã hóa cho secrets trong etcd
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <BASE64_ENCODED_32_BYTE_KEY>
- identity: {}Provider aescbc mã hóa secrets trước khi ghi vào etcd. Provider identity cho phép đọc các secrets không mã hóa hiện có trong quá trình migration.
Câu hỏi: Sự khác biệt giữa SecretStore và ClusterSecretStore là gì?
SecretStore là namespaced, chỉ có thể được tham chiếu bởi ExternalSecrets trong cùng namespace. ClusterSecretStore là cluster-scoped, có thể truy cập từ bất kỳ namespace nào. Sử dụng ClusterSecretStore cho shared secret backends và SecretStore cho tenant isolation.
Câu hỏi: Làm thế nào để xử lý rotation secrets mà không có downtime?
Triển khai rotation ba giai đoạn:
- Dual-write: Ghi credentials mới trong khi giữ credentials cũ
- Transition: Cập nhật ứng dụng để sử dụng credentials mới
- Cleanup: Xóa credentials cũ sau khi tất cả ứng dụng đã migrate
# dual-credential-secret.yaml
# Hỗ trợ rotation dual-credential
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: rotating-credentials
spec:
refreshInterval: 5m
secretStoreRef:
name: vault-backend
kind: ClusterSecretStore
target:
name: app-credentials
data:
- secretKey: current-password
remoteRef:
key: secret/data/app/credentials
property: current
- secretKey: previous-password
remoteRef:
key: secret/data/app/credentials
property: previousCâu hỏi: Làm thế nào để audit quyền truy cập secrets trong Kubernetes?
Kích hoạt audit logging trong API server với policy bắt các thao tác secrets:
# audit-policy.yaml
# Audit policy cho các thao tác secrets
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: RequestResponse
resources:
- group: ""
resources: ["secrets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]Vault cung cấp audit logging tích hợp ghi lại mọi thao tác secret với timestamp và danh tính.
Xử lý sự cố Các Vấn đề Phổ biến
Các vấn đề deployment ESO thường bắt nguồn từ lỗi xác thực hoặc cấu hình.
# debug-external-secret.sh
# Kiểm tra trạng thái đồng bộ ExternalSecret
kubectl get externalsecret -A
# Xem các condition chi tiết
kubectl describe externalsecret database-credentials -n production
# Kiểm tra log controller ESO
kubectl logs -n external-secrets -l app.kubernetes.io/name=external-secretsCác lỗi xác thực phổ biến:
- Service account không tồn tại: Đảm bảo service account được tham chiếu tồn tại trong namespace ESO
- Role binding sai: Xác minh role Vault liên kết đúng service account và namespace
- Cluster connectivity: Kiểm tra ESO có thể kết nối đến endpoint Vault
Các Thực hành Tốt nhất về Bảo mật
Theo các hướng dẫn này cho deployment secrets production:
- Không bao giờ commit secrets vào Git: Sử dụng ESO hoặc sealed-secrets cho GitOps workflows
- Triển khai least privilege: Chỉ cấp quyền truy cập vào secrets cần thiết
- Kích hoạt audit logging: Theo dõi tất cả truy cập secrets cho compliance và forensics
- Sử dụng TTL ngắn: Dynamic secrets với auto-expiration giảm tác động của rò rỉ
- Mã hóa etcd: Kích hoạt mã hóa at rest cho Kubernetes secrets
- Network segmentation: Giới hạn quyền truy cập vào các endpoint quản lý secret
Kết luận
Quản lý secrets Kubernetes hiệu quả đòi hỏi nhiều hơn native Secrets. External Secrets Operator kết nối khoảng cách giữa các nền tảng quản lý secret enterprise và Kubernetes workloads, cung cấp đồng bộ tự động, rotation và khả năng audit. Hiểu kiến trúc và quy trình vận hành này chuẩn bị ứng viên cho các câu hỏi phỏng vấn DevOps và các kịch bản production thực tế. Tích hợp HashiCorp Vault với Kubernetes thông qua ESO tạo ra giải pháp secrets an toàn và có thể mở rộng đáp ứng các tiêu chuẩn tuân thủ enterprise trong khi duy trì tốc độ phát triển.
Bạn có tìm ra lỗi trong DevOps không?
Một đoạn mã thật, một lỗi ẩn, mỗi ngày một lượt. Không cần tài khoản để thử.

Viết bởi
Anthony Fillion-MailletNgười sáng lập SharpSkill
Lập trình viên fullstack hơn 10 năm. Anh điều hành SharpSkill và chịu trách nhiệm về mọi nội dung đăng tại đây.
Cập nhật ngày 2 tháng 9, 2026
Thẻ
Chia sẻ
Bài viết liên quan

Kubernetes: Triển khai ứng dụng đầu tiên
Hướng dẫn thực hành để triển khai ứng dụng trên Kubernetes. Từ cài đặt minikube đến Deployments, Services và ConfigMaps với các ví dụ cụ thể.

Câu hỏi Phỏng vấn DevOps Thiết yếu: Hướng dẫn Đầy đủ 2026
Chuẩn bị phỏng vấn DevOps với những câu hỏi bắt buộc về CI/CD, Kubernetes, Docker, Terraform và các thực tiễn SRE. Có câu trả lời chi tiết.

ArgoCD và GitOps cho Kubernetes: Hướng dẫn triển khai liên tục và câu hỏi phỏng vấn 2026
Tìm hiểu cách sử dụng ArgoCD để triển khai GitOps trên Kubernetes. Bài viết bao gồm cấu hình Application, Sync Waves, ApplicationSet và các câu hỏi phỏng vấn thường gặp.