我正在尝试在 kubernetes 中建立一个自动密封的保险库集群,但看到了一些奇怪的行为。
我有一个 vault 提供传输密钥来自动解封第二个 vault 。它们在同一个 k8s 集群的不同命名空间中运行。第二个 vault 在带有自动启动脚本的 pod 中运行(见下文),但当它运行时,vault init 会挂起并最终返回 2 代码(超时),尽管 vault 实例已成功初始化和解封。
问题是我正尝试使用其吊舱中的启动后脚本来初始化第二个保险库,而错误代码 2 破坏了吊舱。
有谁见过类似的行为或者可以帮忙解决吗?
apiVersion: v1
kind: ConfigMap
metadata:
name: post-start
data:
post-start.sh: |
#!/bin/sh
#redirect stdout and stderr to kube logs
# exec &> /proc/1/fd/1
export VAULT_CLIENT_TIMEOUT=240
echo $VAULT_CLIENT_TIMEOUT > /proc/1/fd/1
nc -z 127.0.0.1 8200
while [ $? = 1 ]; do
sleep 2
nc -z 127.0.0.1 8200
done
echo "port 8200 ready" > /proc/1/fd/1
vault init
答案1
请参阅文档定义 postStart 和 preStop 处理程序以及容器生命周期钩子:
钩子传递至少应为一次,这意味着钩子可能会因任何给定事件(例如 PostStart 或 PreStop)而被调用多次。钩子实现必须正确处理此问题。
例如:
lifecycle:
postStart:
exec:
command:
- "sh"
- "-c"
- >
if [ -s /var/www/mybb/inc/config.php ]; then
rm -rf /var/www/mybb/install;
fi;
if [ ! -f /var/www/mybb/index.php ]; then
cp -rp /originroot/var/www/mybb/. /var/www/mybb/;
fi
另外,请提供崩溃的 POD 的日志。
答案2
经过一番调整,发现真正的问题是端口 8200 从未准备好,因为第二个保险库没有启动。第二个保险库没有启动,因为它无法与保险库 1 通信,我通过正确设置 TLS 解决了这个问题(这个链接可能会有用)
配置 TLS 后,vault 2 能够启动,并且后续脚本成功完成。