vault init 在 kubernetes 上挂起

vault init 在 kubernetes 上挂起

我正在尝试在 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 能够启动,并且后续脚本成功完成。

相关内容