簡體   English   中英

如何在Kubernetes中使用Vault HA進行滾動更新?

[英]How perform a rolling update with Vault HA in Kubernetes?

我正在K8s中運行HashiCorp Vault無狀態集,在三個節點上有3個容器。

部署后,我手動打開Vault的密封。 然后,保管庫始終保持未密封狀態。

問題是,當其中一個節點重新啟動時,Vault pod會以非密封模式重新啟動。 有什么方法可以通過與已經拆封的容器之一進行服務器-服務器通信來自動拆開Vault節點嗎?

當我更新Kubernetes環境並且重新啟動所有節點(滾動更新-逐一)時,我不想手動解開Vault容器。

我也不想將解封密鑰存儲在K8s密鑰甚至文件中,因為這會使對我的密鑰進行加密變得毫無用處。

這是我的yaml:

apiVersion: v1
kind: Service
metadata:
  name: vault
spec:
  clusterIP: None
  ports:
    - name: http
      port: 8200
    - name: server
      port: 8201
  selector:
    xyz.service: vault
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: vault
  labels:
    xyz.service: vault
spec:
  serviceName: "vault"
  selector:
    matchLabels:
      xyz.service: vault
  replicas: 3
  template:
    metadata:
      labels:
        xyz.service: vault
    spec:
      imagePullSecrets:
      - name: reg-dhc-xyzoms-pull-secret
      securityContext:
        runAsUser: 100
        fsGroup: 1000
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: xyz.service
                    operator: In
                    values:
                      - vault
              topologyKey: kubernetes.io/hostname
      containers:
        - name: vault
          image: vault:0.11.0
          resources:
            requests:
              memory: "100Mi"
          env:
          - name: SKIP_SETCAP
            value: dontcare
          - name: POD_IP
            valueFrom:
              fieldRef:
                fieldPath: "status.podIP"
          - name: "VAULT_CLUSTER_ADDR"
            value: "https://$(POD_IP):8201"
          ports:
            - name: http
              containerPort: 8200
              protocol: "TCP"
            - name: server
              containerPort: 8201
              protocol: "TCP"

經過更多的挖掘,我了解到,我想要的是不可能的。 無論何時重新啟動Vault實例,都將首先將其密封,並且無法使用Vault擁有的技術自動將其密封。

您可以在GitHub和Docker商店中找到許多“不安全的 存儲 庫”實現,它們通過定期檢查Vault容器狀態並在必要時將其啟封來嘗試填補這一空白。

建議使用K8s就緒探針,以避免服務訪問密封的Vault吊艙。

由於沒有官方的“未注冊保險庫”圖像,因此必須謹慎使用公共實現。 我最終寫了我自己的“保險庫管理員”,以避免安全漏洞和許可問題。

我的解決方案是在每個Vault吊艙中放置一個小車容器。 首先必須在一側kubectl exec ...使用kubectl exec ...手動輸入kubectl exec ...鍵。 邊車會定期檢查所有保險櫃的吊艙,並將解封的鑰匙傳遞給另一輛已密封的邊車。 如果Sidecar收到解封密鑰,則它們會存儲在內存中,並用於解封其自己的Vault實例。

  1. kubect aply -f vault.yaml > vault-0開始
  2. kubectl exec vault-0 -c sidecar ...輸入解封密鑰-> vault-0 sidecar解封vault-0並准備就緒
  3. Vault 1開始
  4. vault-0輔助車輛檢測到未密封的vault-1,並調用vault-1輔助車輛以傳輸未密封的鑰匙。 -> Vault-1 Sidecar解開Vault-0並准備就緒
  5. 等等...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM