如何在Kubernetes中使用Vault HA执行滚动更新?
我正在K8s中运行一个HashiCorp Vault无状态集,三个节点上有三个POD 展开后,我手动打开保险库。然后,保险库一直处于未密封状态 问题是当其中一个节点重新启动时,Vault pod将以未密封模式重新启动。 是否有任何方法可以通过服务器与其中一个已打开的POD通信来自动打开Vault节点 我不想在更新Kubernetes环境和重新启动所有节点(滚动更新-逐个更新)时手动打开Vault吊舱 我也不想将未密封的密钥存储在K8s机密中,甚至不想存储在文件中,因为这会使我的机密加密变得毫无用处 这是我的yaml:如何在Kubernetes中使用Vault HA执行滚动更新?,kubernetes,hashicorp-vault,Kubernetes,Hashicorp Vault,我正在K8s中运行一个HashiCorp Vault无状态集,三个节点上有三个POD 展开后,我手动打开保险库。然后,保险库一直处于未密封状态 问题是当其中一个节点重新启动时,Vault pod将以未密封模式重新启动。 是否有任何方法可以通过服务器与其中一个已打开的POD通信来自动打开Vault节点 我不想在更新Kubernetes环境和重新启动所有节点(滚动更新-逐个更新)时手动打开Vault吊舱 我也不想将未密封的密钥存储在K8s机密中,甚至不想存储在文件中,因为这会使我的机密加密变得毫无用
经过进一步的挖掘,我明白了,我想要的是不可能的。 每当重新启动Vault实例时,都会首先将其解封,并且无法使用Vault自己的技术自动将其解封 您可以在GitHub中找到许多“vault Uncapler”实现,它们通过定期检查vault pods状态并在必要时将其解封来填补这一空白 建议使用K8s readinessprobe,以避免服务访问密封的保险库吊舱 由于没有官方的“vault Unceller”图像,因此必须谨慎使用公共实现。为了避免安全漏洞和许可问题,我最终编写了自己的“金库解封器” 我的解决方案是一个带有每个保险库吊舱的侧车容器。首先必须使用
kubectl exec…
在一侧车手动输入一次解锁钥匙。
侧车定期检查所有保险库吊舱,并在密封的情况下将打开的钥匙传递给另一个侧车。如果侧车收到解封密钥,它们将存储在内存中,并用于解封其自己的Vault实例
kubect aply-f保险库。yaml
->0保险库启动kubectl exec vault-0-c侧车…
输入解锁键->vault-0侧车解锁vault-0并准备就绪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"