<矩形寬度=“1200”高度=“340”rx=“12”填滿=“url(#bg-6026)”/>
<矩形x =“60”y =“50”寬度=“4”高度=“60”rx =“2”填滿=“#34d399”/>
<矩形x =“80”y =“50”寬度=“121”高度=“28”rx =“14”填滿=“#34d399”不透明度=“0.15”/>
1.使用 Helm 在 Kubernetes 上部署 Vault
部署模式
<表> <標題>
模式描述用例 <正文> 開發單一 Pod,記憶體儲存開發、測試 獨立單一 Pod,持久儲存小型部署 HA多 Pod、整合式儲存(Raft)生產 外部Vault在K8s之外運行,僅部署代理注入器外部Vault伺服器Helm 安裝(HA 模式)
# 新增 Helm 儲存庫
helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update
# 安裝 Vault HA với 整合存儲
helm install vault hashicorp/vault \
--命名空間庫\
--建立命名空間\
--set server.ha.enabled=true \
--set server.ha.replicas=3 \
--set server.ha.raft.enabled=true \
--set server.dataStorage.size=10Gi \
--set server.resources.requests.memory=256Mi \
--set server.resources.requests.cpu=250m \
--set server.resources.limits.memory=512Mi \
--set server.resources.limits.cpu=500m \
--set ui.enabled=true \
--set ui.serviceType=叢集IP
自訂值
#values-product.yaml
伺服器:
哈:
啟用:真
副本:3
筏:
啟用:真
配置: |
使用者介面=真
偵聽器“tcp”{
tls_禁用 = 0
位址 =“[::]:8200”
cluster_address =“[::]:8201”
tls_cert_file =“/vault/userconfig/vault-tls/tls.crt”
tls_key_file = “/vault/userconfig/vault-tls/tls.key”
}存放“筏”{
路徑 =“/vault/數據”
重試加入{
Leader_api_addr = "https://vault-0.vault-internal:8200"
Leader_ca_cert_file = "/vault/userconfig/vault-tls/ca.crt"
}
重試加入{
Leader_api_addr = "https://vault-1.vault-internal:8200"
Leader_ca_cert_file = "/vault/userconfig/vault-tls/ca.crt"
}
重試加入{
Leader_api_addr = "https://vault-2.vault-internal:8200"
Leader_ca_cert_file = "/vault/userconfig/vault-tls/ca.crt"
}
}
service_registration“kubernetes”{}
資料儲存:
尺寸:20Gi
儲存類別:gp3
額外卷數:
- 類型:秘密
名稱:vault-tls
資源:
要求:
內存:512Mi
中央處理器:500m
限制:
記憶體:1Gi
中央處理器:1000m
入口:
啟用:真
主持人:
- 主機:vault.company.com
使用者介面:
啟用:真
注射器:
啟用:真
副本:2
# 安裝 với 自訂值
helm install vault hashicorp/vault \
--命名空間庫\
--建立命名空間\
-f 值-生產.yaml
初始化和解封
# Init trênVault-0
kubectl exec -n vault vault-0 -- vault operator init \
-密鑰份額=5 \
-鍵閾值=3 \
-format=json >Vault-init.json
# 解封Vault-0
kubectl exec -n vault vault-0 -- vault operator unseal <key-1>
kubectl exec -n vault vault-0 -- vault operator unseal <key-2>
kubectl exec -n vault vault-0 -- vault operator unseal <key-3>
# 加入Vault-1、Vault-2、Raft集群
kubectl exec -n vault vault-1 -- vault operator raft join \
https://vault-0.vault-internal:8200
kubectl exec -n vault vault-2 -- vault operator raft join \
https://vault-0.vault-internal:8200
# 解封Vault-1和Vault-2
kubectl exec -n vault vault-1 -- vault operator unseal <key-1>
# ...(對每個節點重複)
2. Vault Secrets Operator (VSO)
VSO 是官方 Kubernetes 營運商,自動將 Vault 中的機密同步到 Kubernetes Secrets。這是 Kubernetes 原生秘密管理的推薦方法。
安裝 VSO
helm 安裝vault-secrets-operator hashicorp/vault-secrets-operator \
--命名空間vault-secrets-operator-system \
--建立命名空間
自訂資源
# 1. VaultConnection — kết nối đến Vault 伺服器
api版本:secrets.hashicorp.com/v1beta1
種類:VaultConnection
元數據:
名稱: 保險庫連接
命名空間:應用程式
規格:
地址:https://vault.company.com:8200
跳過TLS驗證:假
caCertSecretRef:vault-ca-cert
---
# 2. VaultAuth — xác thực với Vault
api版本:secrets.hashicorp.com/v1beta1
種類:VaultAuth
元數據:
名稱:vault-auth
命名空間:應用程式
規格:
VaultConnectionRef:保管庫連接
方法:kubernetes
掛載:kubernetes
庫伯內特:
角色:網頁應用程式
服務帳號:webapp-sa---
# 3. VaultStaticSecret — 同步 KV 秘密
api版本:secrets.hashicorp.com/v1beta1
種類:VaultStaticSecret
元數據:
名稱:應用程式資料庫秘密
命名空間:應用程式
規格:
VaultAuthRef:vault-auth
坐騎:秘密
類型:kv-v2
路徑:生產/資料庫
刷新後:60s
目的地:
名稱:應用程式資料庫憑證
創作:真實
標籤:
應用程式:網頁應用程式
轉變:
排除原始: true
模板:
連接字串:
文字:“postgresql://{{ .Secrets.username }}:{{ .Secrets.password }}@{{ .Secrets.host }}:5432/{{ .Secrets.database }}”
---
# 4. VaultDynamicSecret — 動態資料庫憑證
api版本:secrets.hashicorp.com/v1beta1
種類:VaultDynamicSecret
元數據:
名稱:應用程式動態資料庫
命名空間:應用程式
規格:
VaultAuthRef:vault-auth
掛載:資料庫
路徑:信用/應用程式角色
更新百分比:67
目的地:
名稱:應用程式動態資料庫憑證
創作:真實
---
# 5. VaultPKISecret — 自動頒發證書
api版本:secrets.hashicorp.com/v1beta1
種類:VaultPKISecret
元數據:
名稱:app-tls-cert
命名空間:應用程式
規格:
VaultAuthRef:vault-auth
安裝:pki
角色:應用程式憑證
學名:app.company.com
替代名稱:
- app.internal.company.com
存活時間:24 小時
到期偏移:1小時
目的地:
名稱:app-tls
創作:真實
在 Pod 中使用
api版本:apps/v1
種類:部署
元數據:
名稱: 網路應用程式
命名空間:應用程式
規格:
模板:
規格:
服務帳號名稱:webapp-sa
容器:
- 名稱:網頁應用程式
圖:myapp:最新
環境來自:
- 秘密參考:
名稱:應用程式資料庫憑證
體積安裝:
- 名稱:tls
掛載路徑:/etc/tls
只讀:真
卷:
- 名稱:tls
秘密:
秘密名稱:app-tls
3. Vault CSI 供應商
Vault CSI 提供者使用Secrets Store CSI Driver將機密直接裝載到 Pod 磁碟區中,而無需建立 Kubernetes Secret。
# SecretProviderClass
api版本:secrets-store.csi.x-k8s.io/v1
類型:SecretProviderClass
元數據:
名稱:vault-db-creds
命名空間:應用程式
規格:
提供者:金庫
參數:
保管庫位址:「https://vault.company.com:8200"
角色名稱:“webapp”
對象: |
- 物件名稱:“資料庫使用者名稱”
秘密路徑:“秘密/數據/生產/資料庫”
秘鑰:“用戶名”
- 物件名稱:“資料庫密碼”
秘密路徑:“秘密/數據/生產/資料庫”
秘鑰:“密碼”
# 可選擇同步到 K8s Secret
秘密對象:
- 秘密名稱:應用程式資料庫同步
類型: 不透明
數據:
- 物件名稱:資料庫使用者名稱
關鍵:用戶名
- 物件名稱:資料庫密碼
密鑰:密碼---
# Pod 儲存 CSI 卷
api版本:v1
種類: 豆莢
元數據:
名稱: 網路應用程式
規格:
服務帳號名稱:webapp-sa
容器:
- 名稱:網頁應用程式
圖:myapp:最新
體積安裝:
- 名稱:秘密
掛載路徑:/mnt/secrets
只讀:真
卷:
- 名稱:秘密
CSI:
驅動程式:secrets-store.csi.k8s.io
只讀:真
體積屬性:
SecretProviderClass:vault-db-creds
4. Vault 代理注入器
Agent Injector 使用 Kubernetes Mutating Webhook 透過註解自動將 Vault Agent sidecar 注入到 Pod 中。
api版本:apps/v1
種類:部署
元數據:
名稱: 網路應用程式
規格:
模板:
元數據:
註:
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/role: "webapp"
vault.hashicorp.com/agent-inject-secret-db.txt: "secret/data/production/db"
vault.hashicorp.com/agent-inject-template-db.txt: |
{{- 帶有秘密「秘密/資料/生產/資料庫」-}}
DB_HOST={{ .Data.data.host }}
DB_USER={{ .Data.data.使用者名稱 }}
DB_PASS={{ .Data.data.password }}
{{-結束}}
規格:
服務帳號名稱:webapp-sa
容器:
- 名稱:網頁應用程式
圖:myapp:最新
# 機密可在 /vault/secrets/db.txt 取得
5。比較 VSO、CSI 與代理注入器
<表> <標題>
條件VSOCSI 提供者代理注入器 <正文> 機制操作符 + CRDCSI 驅動程式變異 Webhook K8s Secret建立 K8s Secret可選同步否 動態機密✅(VaultDynamicSecret)限制✅(模板) PKI 憑證✅ (VaultPKISecret)限制✅(範本) 自動旋轉✅(refreshAfter)單獨配置✅(sidecar) 需要 Sidecar否否是 資源開銷低(一般操作員)低高(1個sidecar/pod) 推薦✅推薦OK cho simple舊版6。 Kubernetes 最佳實務
新部署優先考慮VSO - 原生 K8s 體驗,更少的開銷
為每個工作負載使用專用 ServiceAccount
使用 Cloud KMS 啟用自動解封
為 Vault Pod(非 root、唯讀檔案系統)設定Pod 安全性
使用NetworkPolicy限制對保險箱的存取
將機密裝載到emptyDir(記憶體支援)而不是持久性磁碟區
7.摘要
Helm 圖表 - 在 K8s 上部署具有整合儲存的 Vault HA
VSO — 推薦,基於 CRD,自動將 Secret 同步到 K8s Secret
CSI Provider — 將機密直接裝載到 Pod 磁碟區
代理注入器 - 遺留、基於 sidecar、註釋驅動
下一節將重點放在 Vault 與實際應用程式的整合 — Spring Boot、Node.js、Terraform、Ansible 和 CI/CD 管道。