AKS应用路由Ingress:单IP多主机不同TLS配置实现问询
问题
希望用单个Ingress IP承载多个主机,且每个主机使用不同的SSL/TLS配置:
- 已配置
abc.com:使用独立证书,启用TLS客户端认证(TLS-MA) - 新增
def.com:使用不同证书,不启用TLS-MA(或使用不同CA)
直接在现有Ingress中添加def.com后,它会继承abc.com的TLS-MA设置,且生成Kubernetes伪证书。请问该需求是否可行?如何让Ingress注解仅作用于单个主机,实现多主机不同SSL/TLS配置?
当前Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: # 从Key Vault拉取服务器证书 kubernetes.azure.com/tls-cert-keyvault-uri: https://myvault.vault.azure.net/certificates/mycert/b36bc0840bc23423432837c450d9 # 启用客户端证书认证 nginx.ingress.kubernetes.io/auth-tls-verify-client: "on" # 该Secret中包含CA和中间证书,必须命名为ca.crt nginx.ingress.kubernetes.io/auth-tls-secret: mynamespace/ca-secret # 将证书传递给上游服务 nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true" name: myingress namespace: mynamespace spec: ingressClassName: webapprouting.kubernetes.azure.com rules: - host: abc.com http: paths: - backend: service: name: abc port: number: 8080 path: / pathType: Prefix - host: def.com http: paths: - backend: service: name: def port: number: 80 path: / pathType: Prefix tls: - hosts: - abc.com secretName: keyvault-certificate
解决方案
该需求完全可行,核心方案是创建两个独立的Ingress资源,共享同一个Ingress Class以复用公共IP,分别为每个主机配置专属的注解与TLS参数,避免配置互相干扰。
1. 保留abc.com的专属Ingress
将原有Ingress修改为仅包含abc.com的配置,确保其TLS-MA设置仅作用于该主机:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: # 从Key Vault拉取abc.com的服务器证书 kubernetes.azure.com/tls-cert-keyvault-uri: https://myvault.vault.azure.net/certificates/mycert/b36bc0840bc23423432837c450d9 # 启用客户端证书认证 nginx.ingress.kubernetes.io/auth-tls-verify-client: "on" # 该Secret中包含abc.com的CA和中间证书 nginx.ingress.kubernetes.io/auth-tls-secret: mynamespace/ca-secret # 将证书传递给上游服务 nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true" name: ingress-abc namespace: mynamespace spec: ingressClassName: webapprouting.kubernetes.azure.com rules: - host: abc.com http: paths: - backend: service: name: abc port: number: 8080 path: / pathType: Prefix tls: - hosts: - abc.com secretName: keyvault-certificate
2. 为def.com创建独立Ingress
新建一个仅包含def.com的Ingress,配置其专属证书且不添加TLS-MA相关注解:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: # 从Key Vault拉取def.com的服务器证书(替换为实际URI) kubernetes.azure.com/tls-cert-keyvault-uri: https://myvault.vault.azure.net/certificates/defcert/xxxxxxxxx # 无需启用客户端认证,默认即为关闭状态,可省略该注解 # nginx.ingress.kubernetes.io/auth-tls-verify-client: "off" name: ingress-def namespace: mynamespace spec: ingressClassName: webapprouting.kubernetes.azure.com rules: - host: def.com http: paths: - backend: service: name: def port: number: 80 path: / pathType: Prefix tls: - hosts: - def.com secretName: keyvault-certificate-def # 替换为def.com对应的Secret名称
关键注意事项
- 两个Ingress使用相同的
ingressClassName,Azure Web App Routing控制器会自动将它们绑定到同一个公共IP,实现单IP多主机的需求。 - 每个Ingress的注解与TLS配置仅作用于自身关联的主机,不会产生配置继承问题。
- 若
def.com需要使用不同CA的TLS-MA,只需在其Ingress中添加对应的auth-tls-*注解即可,与abc.com的配置完全隔离。
内容的提问来源于stack exchange,提问作者Guy Wood
相关产品推荐
相关产品推荐

