Giới thiệu
Vault là một công cụ quản lý bí mật mạnh mẽ, cho phép lưu trữ và bảo mật thông tin nhạy cảm một cách hiệu quả. Việc triển khai Vault trên Kubernetes với chế độ HA (High Availability) và backend Raft không chỉ cung cấp độ bền bỉ mà còn khả năng mở rộng cho việc lưu trữ bí mật an toàn. Hướng dẫn này sẽ hướng dẫn bạn cách cài đặt Vault, thiết lập namespaces, triển khai thông qua Helm, tham gia các nút Vault, mở khóa và xử lý các vấn đề thường gặp.
Mục tiêu của bài viết
- Cài đặt Vault trên Kubernetes
- Thiết lập chế độ HA với backend Raft
- Giải quyết các vấn đề thường gặp trong quá trình triển khai
Phần chuẩn bị
Trước khi bắt đầu, bạn cần đảm bảo đã chuẩn bị những điều sau:
- Cụm Kubernetes có thể truy cập được bằng
kubectl
- Helm 3 đã được cài đặt
- Quyền truy cập đầy đủ để tạo namespaces và Persistent Volumes (PV)
- Kiến thức cơ bản về các khái niệm của Vault và Kubernetes
Bước 1: Thiết lập Namespace và Repo Helm
Tạo một namespace để cách ly Vault khỏi các dịch vụ khác:
kubectl create namespace vault
Thêm repo Helm của HashiCorp và cập nhật:
helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update
Bước 2: Cài đặt Vault với Helm trong chế độ HA
Tạo một tệp values.yaml
cho Vault HA sử dụng lưu trữ Raft (Integrated Storage):
injector:
enabled: false
server:
image:
repository: "hashicorp/vault"
tag: "1.9.0"
pullPolicy: IfNotPresent
updateStrategyType: "OnDelete"
resources:
requests:
memory: 256Mi
cpu: 250m
limits:
memory: 256Mi
cpu: 250m
ha:
enabled: true
replicas: 3
raft:
enabled: true
config: |
ui = true
listener "tcp" {
tls_disable = 1
address = "[::]:8200"
cluster_address = "[::]:8201"
}
storage "raft" {
path = "/vault/data"
}
service_registration "kubernetes" {}
dataStorage:
enabled: true
size: 500Mi
Cài đặt Vault:
helm install vault hashicorp/vault -n vault -f values.yaml
Kiểm tra trạng thái của các pod:
$ kubectl get pods -n vault
NAME READY STATUS RESTARTS
vault-0 0/1 Running 0
vault-1 0/1 Running 0
vault-2 0/1 Running 0
Bước 3: Tham gia các nút Vault và Khởi tạo Cluster
- Chỉ có pod Vault đầu tiên (vault-0) được khởi tạo một lần.
- Khởi tạo Vault trên
vault-0
:
kubectl exec -it vault-0 -n vault -- vault operator init -key-shares=5 -key-threshold=3
Lưu ý: Hãy ghi nhớ các khóa phục hồi (Recovery Keys) được in ra sau khi khởi tạo, vì bạn sẽ cần chúng để mở khóa Vault khi nó bị niêm phong lại.
Bây giờ, chúng ta sẽ thấy việc mở khóa Vault diễn ra như sau:
$ kubectl exec -it vault-0 -n vault -- vault operator unseal <unseal_key_1>
$ kubectl exec -it vault-0 -n vault -- vault operator unseal <unseal_key_2>
$ kubectl exec -it vault-0 -n vault -- vault operator unseal <unseal_key_3>
Bước 4: Tham gia các nút Vault vào Cluster
Các pod khác (vault-1, vault-2) cần tham gia vào cluster Raft. Chạy các lệnh sau để tham gia:
$ kubectl exec -it vault-1 -n vault -- vault operator raft join http://vault-0.vault-internal:8200
$ kubectl exec -it vault-2 -n vault -- vault operator raft join http://vault-0.vault-internal:8200
Bước 5: Mở khóa các pod Vault
Mở khóa tất cả các pod Vault (vault-0, vault-1, vault-2) một cách thủ công với các khóa mở khóa:
kubectl exec -it vault-1 -n vault -- vault operator unseal <unseal_key_1>
kubectl exec -it vault-1 -n vault -- vault operator unseal <unseal_key_2>
kubectl exec -it vault-1 -n vault -- vault operator unseal <unseal_key_3>
kubectl exec -it vault-2 -n vault -- vault operator unseal <unseal_key_1>
kubectl exec -it vault-2 -n vault -- vault operator unseal <unseal_key_2>
kubectl exec -it vault-2 -n vault -- vault operator unseal <unseal_key_3>
Bước 6: Kiểm tra trạng thái pod
Kiểm tra trạng thái của các pod để đảm bảo tất cả đều sẵn sàng:
$ kubectl get pods -n vault
NAME READY STATUS RESTARTS
vault-0 1/1 Running 0
vault-1 1/1 Running 0
vault-2 1/1 Running 0
Thực hành tốt nhất
- Bảo mật khóa phục hồi: Hãy đảm bảo rằng bạn lưu trữ các khóa phục hồi một cách an toàn và không chia sẻ với người không có quyền truy cập.
- Giám sát trạng thái Vault: Sử dụng các công cụ giám sát để theo dõi trạng thái của Vault và đảm bảo rằng nó hoạt động bình thường.
Các vấn đề thường gặp và cách khắc phục
ClusterRoleBinding đã tồn tại
- Xóa ClusterRoleBinding xung đột trước khi cài đặt lại Helm chart:
kubectl delete clusterrolebinding vault-server-binding
Lỗi nâng cấp Helm ("no deployed releases")
- Gỡ cài đặt phiên bản trước đó khỏi namespace mặc định:
helm uninstall vault -n default
Các pod không mở khóa hoặc không sẵn sàng
- Kiểm tra nhật ký pod để tìm lỗi:
kubectl logs vault-1 -n vault
PVC bị kẹt trong trạng thái Terminating
- Xóa finalizers để buộc xóa:
kubectl patch pvc data-vault-1 -n vault -p '{"metadata":{"finalizers":[]}}' --type=merge
Kết luận
Việc triển khai Vault trên Kubernetes với chế độ HA và backend Raft cung cấp khả năng lưu trữ bí mật an toàn và khả năng mở rộng. Các quy trình khởi tạo, tham gia và mở khóa đúng cách là rất quan trọng để đảm bảo hoạt động của Vault. Nếu gặp phải các vấn đề, hãy xử lý cẩn thận tình trạng PVC, trạng thái pod và thành viên cluster Raft.
Câu hỏi thường gặp
Vault là gì?
Vault là một công cụ quản lý bí mật, giúp bảo vệ và lưu trữ thông tin nhạy cảm.
Tại sao nên sử dụng chế độ HA cho Vault?
Chế độ HA giúp đảm bảo rằng Vault luôn sẵn sàng và không bị gián đoạn trong trường hợp một nút gặp sự cố.
Làm thế nào để khôi phục Vault nếu bị lỗi?
Sử dụng các khóa phục hồi đã lưu để mở khóa Vault và khởi động lại dịch vụ.