如何在Kubernetes中使用Vault HA执行滚动更新?

问题描述 投票:1回答:1

我在K8s中运行HashiCorp Vault无状态集,在三个节点上有3个pod。

部署后,我手动解封Vault。然后保险柜始终保持未密封状态。

问题是当其中一个节点重新启动时,Vault pod将以未密封模式重新启动。有没有办法通过服务器 - 服务器与已经未密封的容器之一进行通信来自动解封Vault节点?

当我的Kubernetes环境更新并且所有节点都重新启动(滚动更新 - 逐个)时,我不想手动启动Vault pod。

我也不想将unseal密钥存储在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"
kubernetes hashicorp-vault
1个回答
0
投票

经过一番挖掘,我学会了,我想要的是不可能的。每当重新启动Vault实例时,它将首先被解封,并且无法使用Vault自己的技术自动解封它。

你可以在GitHub和Docker store中找到很多“vault-unsealer”实现,它们通过定期检查Vault pods状态并在必要时启封它来填补这个空白。

建议使用K8s READinessprobe来避免该服务访问密封的Vault pod。

由于没有正式的“vault-unsealer”图像,因此必须谨慎使用公共实现。我最终编写了自己的“保险柜开启”,以避免安全漏洞和许可问题。

我的解决方案是带有每个Vault pod的边车容器。首先必须在一个边车上用kubectl exec ...手动输入开封钥匙。如果密封,侧面车会定期检查所有Vault舱并将开封钥匙传送给另一辆侧车。如果边车接收到密封密钥,它们将存储在内存中,用于解除其自身的Vault实例。

  1. kubect aply -f vault.yaml - > vault-0首发
  2. kubectl exec vault-0 -c sidecar ...进入unseal键 - > vault-0 sidecar unseals vault-0并准备好了
  3. 金库-1开始
  4. vault-0 sidecar检测到vault-1未密封并调用vault-1 sidecar来发送unseal密钥。 - > vault-1 sidecar unseals vault-0并准备就绪
  5. 等等...
© www.soinside.com 2019 - 2024. All rights reserved.