我正在K8s中运行HashiCorp Vault无状态集,在三个节点上有3个容器。
部署后,我手动打开Vault的密封。然后保管箱始终保持密封状态。
问题是当其中一个节点重新启动时,Vault容器以非密封模式重新启动。 有什么方法可以通过与已经打开的容器之一进行服务器-服务器通信来自动打开Vault节点的密封?
当我更新Kubernetes环境并重新启动所有节点(滚动更新-逐一)时,我不想手动解开Vault容器。
我也不想将解封密钥存储在K8s密钥或什至文件中,因为这会使我的密钥加密变得无用。
这是我的名字:
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"
答案 0 :(得分:0)
经过进一步的挖掘,我了解到,我想要的是不可能的。 每当Vault实例重新启动时,都会首先将其密封,并且无法使用Vault拥有的技术自动将其密封。
您可以在GitHub和Docker store中找到许多“ vault-unsealer” 实现,这些实现通过定期检查Vault Pod状态并在必要时将其打开来尝试填补这一空白。 / p>
建议使用K8s准备就绪探针,以避免服务访问密封的保险柜盒。
由于没有官方的“未注册保险库”图像,因此必须谨慎使用公共实现。为了避免安全漏洞和许可问题,我最终编写了自己的“保险库管理员”。
我的解决方案是在每个Vault吊舱中放置一个小车容器。首先必须在一侧的kubectl exec ...
上手动输入一次解封密钥。
边车会定期检查所有保险柜的吊舱,并将解封的钥匙传递给另一辆已密封的边车。如果Sidecar收到解封密钥,则它们会存储在内存中,并用于解封其自己的Vault实例。
kubect aply -f vault.yaml
-> Vault 0开始kubectl exec vault-0 -c sidecar ...
输入解封密钥-> vault-0 sidecar解封vault-0并准备就绪