K8s部署HashiCorp Vault Raft HA模式TLS证书加载报错问题
问题原因排查与修复方案
核心错误说明
Error initializing listener of type tcp: error loading TLS cert: open: no such file or directory
你当前的配置存在多处明确问题,直接导致证书加载失败:
- 监听块未指定自定义TLS证书路径
你已开启全局TLS开关(global.tlsDisable: false),但在listener "tcp"配置段中,没有显式声明自定义证书的存放路径。Vault 默认会去内置挂载路径/vault/tls下查找证书,该路径下没有你存储的证书文件,因此报错。
你通过extraVolumes挂载的Secret默认实际路径就是/vault/userconfig/vault-server-tls/,K8s会自动把Secret里的vault.ca、vault.crt、vault.key三个键对应内容映射为该目录下的同名文件,这一步挂载逻辑没有问题,只是没有被Vault监听配置引用到。 - 路径拼写错误
第二个重试join的配置行里,证书路径多打了一个字符:
原Secret挂载路径是leader_client_cert_file = "/vault/userconfig/vault-server-tlsr/vault.crt"vault-server-tls,这里写成了vault-server-tlsr,会导致raft节点互联时也找不到证书。 - 证书与协议配置不匹配
你在retry_join里用http://作为leader地址,但同时又配置了客户端证书参数。http协议本身不需要TLS加密,这部分配置逻辑矛盾,配合自签名TLS场景应当使用https://协议。 - CA证书路径指向错误
你在extraEnvironmentVars和retry_join块里,把vault.crt(服务器证书)当成了CA证书使用,实际CA证书是Secret里的vault.ca键对应文件。
修复后的配置示例
调整Helm Chart自定义配置,修改以下几个部分:
1. 补全tcp监听的TLS参数
listener "tcp" { address = "[::]:8200" cluster_address = "[::]:8201" # 显式指定挂载好的证书路径 tls_cert_file = "/vault/userconfig/vault-server-tls/vault.crt" tls_key_file = "/vault/userconfig/vault-server-tls/vault.key" tls_client_ca_file = "/vault/userconfig/vault-server-tls/vault.ca" }
2. 修正retry_join的拼写错误、协议与证书路径
retry_join { leader_api_addr = "https://vault-0.vault-internal:8200" leader_ca_cert_file = "/vault/userconfig/vault-server-tls/vault.ca" leader_client_cert_file = "/vault/userconfig/vault-server-tls/vault.crt" leader_client_key_file = "/vault/userconfig/vault-server-tls/vault.key" } retry_join { leader_api_addr = "https://vault-1.vault-internal:8200" leader_ca_cert_file = "/vault/userconfig/vault-server-tls/vault.ca" # 修正拼写错误,去掉多余的r leader_client_cert_file = "/vault/userconfig/vault-server-tls/vault.crt" leader_client_key_file = "/vault/userconfig/vault-server-tls/vault.key" } retry_join { leader_api_addr = "https://vault-2.vault-internal:8200" leader_ca_cert_file = "/vault/userconfig/vault-server-tls/vault.ca" leader_client_cert_file = "/vault/userconfig/vault-server-tls/vault.crt" leader_client_key_file = "/vault/userconfig/vault-server-tls/vault.key" }
3. 调整环境变量的CA路径
extraEnvironmentVars: VAULT_CACERT: /vault/userconfig/vault-server-tls/vault.ca
验证步骤
修改配置后重新部署,可先执行以下命令确认Secret是否正确挂载到Pod内:
kubectl exec -n vault-foo vault-0 -- ls /vault/userconfig/vault-server-tls/
正常会输出vault.ca、vault.crt、vault.key三个文件,再观察Pod启动日志确认报错消失。
内容的提问来源于stack exchange,提问作者user63898
相关产品推荐
相关产品推荐

