如何在Kubernetes Ingress TLS中使用HashiCorp Vault证书(禁用vault-csi-provider)
可行替代方案
1. 手动同步证书到Kubernetes Secret
直接从Vault拉取证书文件,手动创建/更新K8s的TLS Secret,再让Ingress引用该Secret即可,适合证书有效期长、更新频率低的场景。
- 操作步骤:
- 通过Vault CLI获取证书和私钥:
# 拉取证书内容并保存到本地文件 vault kv get -field=tls.crt secret/path/to/your/cert > tls.crt # 拉取私钥内容并保存到本地文件 vault kv get -field=tls.key secret/path/to/your/key > tls.key - 创建K8s TLS Secret:
kubectl create secret tls my-ingress-tls --cert=tls.crt --key=tls.key -n your-target-namespace - 在Ingress资源中引用该Secret:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: your-ingress namespace: your-target-namespace spec: tls: - hosts: - your-domain.com secretName: my-ingress-tls rules: - host: your-domain.com http: paths: - path: / pathType: Prefix backend: service: name: your-backend-service port: number: 80
- 通过Vault CLI获取证书和私钥:
- 注意:证书过期时,重复上述步骤更新Secret即可。
2. 自定义脚本自动化同步
写个简单脚本定期从Vault拉取证书,对比当前K8s Secret的内容,有差异就自动更新。可以用K8s CronJob在集群内运行(使用官方Vault CLI镜像或符合公司安全政策的自定义镜像)。
- 核心脚本逻辑示例:
- 通过K8s Auth方式登录Vault(避免硬编码Token,更安全)
- 拉取最新的证书和私钥
- 获取K8s中当前Secret的证书内容
- 对比两者,不一致则更新Secret
- CronJob容器命令示例:
# 用K8s角色登录Vault vault login -method=kubernetes role=your-vault-role # 获取当前Secret中的证书内容 CURRENT_CERT=$(kubectl get secret my-ingress-tls -n your-target-namespace -o jsonpath='{.data.tls\.crt}' | base64 -d) # 获取Vault中的最新证书 NEW_CERT=$(vault kv get -field=tls.crt secret/path/to/your/cert) # 对比并更新 if [ "$CURRENT_CERT" != "$NEW_CERT" ]; then vault kv get -field=tls.crt secret/path/to/your/cert > tls.crt vault kv get -field=tls.key secret/path/to/your/key > tls.key kubectl create secret tls my-ingress-tls --cert=tls.crt --key=tls.key -n your-target-namespace --dry-run=client -o yaml | kubectl apply -f - fi
3. 使用Vault Agent注入证书
借助Vault Agent的Init容器或Sidecar,将证书注入到Nginx Ingress Controller的Pod中,再修改控制器配置引用这些证书文件。
- 操作要点:
- 给Ingress Controller的ServiceAccount绑定Vault角色,授权读取目标证书路径
- 配置Vault Agent Init容器,将证书拉取到Pod的共享Volume(比如emptyDir)
- 修改Ingress Controller的启动参数,指定自定义证书路径,或通过Ingress的annotation引用该路径
- 优势:无需引入额外第三方组件,仅依赖Vault Agent(若公司允许使用该镜像),证书在Pod生命周期内保持最新。
4. 利用Vault Kubernetes Secret Engine自动同步
如果已启用Vault的Kubernetes Secret Engine,可配置它自动将Vault中的证书同步为K8s的TLS Secret。
- 操作步骤:
- 在Vault中启用Kubernetes Secret Engine
- 创建同步角色,指定要同步的证书路径,设置生成的Secret类型为
kubernetes.io/tls - 配置同步周期,Vault会自动将证书同步到指定的K8s命名空间中
- 优势:完全由Vault管理同步流程,无需额外脚本或组件,适合已使用该Secret Engine的环境。
内容的提问来源于stack exchange,提问作者Guts
相关产品推荐
相关产品推荐

