Chuyển đến nội dung chính

第 20 課:Kubernetes 上的 Vault - Helm、Operator 和 CSI

使用 Helm Chart、Vault Secrets Operator (VSO)、Vault CSI Provider、Vault Agent Injector 在 Kubernetes 上部署 Vault。比較 VSO、CSI 和代理注入器。

<定義> <線性漸變 id="bg-6026" x1="0%" y1="0%" x2="100%" y2="100%">

<矩形寬度=“1200”高度=“340”rx=“12”填滿=“url(#bg-6026)”/>

<圓cx =“750”cy =“108”r =“1.5”填入=“#34d399”不透明度=“0.15”/> <圓cx =“806”cy =“108”r =“1.5”填入=“#34d399”不透明度=“0.15”/> <圓cx =“862”cy =“108”r =“1.5”填入=“#34d399”不透明度=“0.15”/> <圓cx =“890”cy =“80”r =“1.5”填入=“#34d399”不透明度=“0.15”/> <圓cx =“890”cy =“108”r =“1.5”填入=“#34d399”不透明度=“0.15”/> <多邊形點=“1045.9089653438086,194 1045.9089653438086,232 1013,251 980.0910346561914,232 980.091034,191034 1013,175”填充=“無”筆畫=“#34d399”筆畫寬度=“1”不透明度=“0.12”/>

<矩形x =“60”y =“50”寬度=“4”高度=“60”rx =“2”填滿=“#34d399”/> <矩形x =“80”y =“50”寬度=“121”高度=“28”rx =“14”填滿=“#34d399”不透明度=“0.15”/> 🔒 DevSecOps — 第 20 堂課

第 20 課:Kubernetes 上的 Vault - Helm, 營運商和 CSI

HashiCorp Vault 從基礎到進階

第 5 部分:Vault 代理程式、代理程式和 Kubernetes 整合

xdev.asia

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 管道。