如何让AKS中Nginx Ingress从Vault/Consul KV获取证书?
我的AKS集群已部署Kubernetes Ingress Controller,当前通过Ingress规则配置了客户端证书认证,依赖tls-secret和ca-secret这两个存储证书的Kubernetes Secret。现在需要从Vault或Consul KV存储获取这些证书,让Ingress规则直接使用,有以下两个问题:
- Nginx Ingress规则是否支持使用Kubernetes Secret以外形式的证书?
- 如果不支持,如何将Vault Secrets转换为Kubernetes Secrets,这是否是标准实现方案?
当前Ingress配置(Ingress-rules.yaml)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: meta.helm.sh/release-name: service meta.helm.sh/release-namespace: mynamespace nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true" nginx.ingress.kubernetes.io/auth-tls-secret: microservices/ca-secret nginx.ingress.kubernetes.io/auth-tls-verify-client: "on" nginx.ingress.kubernetes.io/auth-tls-verify-depth: "3" nginx.ingress.kubernetes.io/enable-underscores-in-headers: "true" name: service-nginx-ingress namespace: mynamespace spec: ingressClassName: nginx rules: - host: ingress-nginx-controller.microservices.com http: paths: - backend: service: name: service port: number: 8080 path: /api/v1/service pathType: Prefix tls: - hosts: - ingress-nginx-controller.microservices.com secretName: tls-secret
补充说明:我曾尝试用Vault Agent在Pod中获取证书,但无法利用该数据在集群内创建Secret。
问题1:Nginx Ingress规则是否支持使用Kubernetes Secret以外形式的证书?
不支持。Nginx Ingress Controller的设计逻辑是依赖Kubernetes Secret加载TLS证书和客户端认证CA证书的,不管是spec.tls.secretName字段还是nginx.ingress.kubernetes.io/auth-tls-secret注解,都只能指向集群内的Kubernetes Secret资源,无法直接引用Vault、Consul KV这类外部存储中的证书。
问题2:如何将Vault Secrets转换为Kubernetes Secrets,这是否是标准实现方案?
将外部密钥存储(如Vault、Consul KV)中的证书同步为Kubernetes Secret是行业内的标准实现方案,常用工具和方式如下:
1. Vault Kubernetes Secrets Operator
HashiCorp官方提供的Operator,可直接在Kubernetes集群内将Vault中的密钥同步为Kubernetes Secret,支持自动轮换。核心步骤:
- 在Vault中为Operator创建对应角色与策略,授予读取目标证书路径的权限
- 在AKS集群部署Vault Kubernetes Secrets Operator
- 创建
VaultStaticSecret或VaultDynamicSecret自定义资源,指定Vault证书路径、目标Kubernetes Secret的名称与命名空间 - Operator会自动拉取Vault证书,创建并维护对应的Kubernetes Secret,Ingress规则直接引用该Secret即可
2. External Secrets Operator (ESO)
通用型外部密钥同步工具,支持Vault、Consul KV、AWS Secrets Manager等多种后端。使用方式:
- 部署ESO到AKS集群
- 创建
SecretStore或ClusterSecretStore资源,配置与Vault/Consul的连接信息和认证方式 - 创建
ExternalSecret资源,映射外部存储中的证书字段到Kubernetes Secret的对应字段(如tls.crt、tls.key、ca.crt) - ESO会自动同步外部证书到集群内的Secret,且支持自动更新
3. 改进Vault Agent的使用方式
你之前尝试的Vault Agent仅在Pod内获取证书,无法直接创建集群级Secret,可调整为:
- 部署专用同步Pod,通过Vault Agent Sidecar获取Vault证书后,调用Kubernetes API创建或更新Secret
- 或者使用Vault Agent Injector为同步Pod注入Agent,配合脚本实现证书到Secret的同步
以上方案中,使用官方或通用Operator是最标准的做法,能保证同步的可靠性、自动轮换和权限管控,避免手动脚本带来的维护风险。
内容的提问来源于stack exchange,提问作者user1514910

