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



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

展开后,我手动解封Vault。然后保险库一直处于未密封状态。

问题是,当其中一个节点重新启动时,Vault pod将以非密封模式重新启动。是否有任何方法可以通过服务器服务器与其中一个已解封的pod通信来自动解封Vault节点

当我的Kubernetes环境得到更新,所有节点都重新启动时(滚动更新-一个接一个(,我不想手动打开Vault pod。

我也不想将未密封的密钥存储在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解封器">实现,它们试图通过定期检查vault pod状态并在必要时解封来填补这一空白。

建议使用K8s readinesprobe,以避免服务访问密封的保险箱。

由于没有官方的"保险库解封器"映像,因此必须谨慎使用公共实现。为了避免安全缺陷和许可问题,我最终编写了自己的"保险库解封器"。

我的解决方案是每个保险箱都有一个侧车容器。解封钥匙首先必须用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. 拱顶-1启动
  4. vault-0 sidecar检测到vault-1未密封,并调用vault-1 sidecar传输未密封的密钥。->拱顶-1侧车打开拱顶-0,准备就绪
  5. 等等

最新更新