繁体   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