AKS中使用Nginx Ingress为不同命名空间服务分配独立公网IP
方案解答
可行性结论
可以实现,无需修改现有生产环境的Nginx Ingress配置,只需部署第二套独立的Nginx Ingress控制器即可达到完全隔离的效果。
实现原理
每个独立部署的Nginx Ingress控制器都会被AKS自动分配独立的公网IP,通过为不同控制器设置专属的ingressClass标识,即可让不同命名空间下的Ingress资源绑定到对应的控制器上,实现IP和命名空间资源的一一对应、互相隔离。
操作步骤
1. 部署第二套专属staging环境的Nginx Ingress控制器
执行以下helm命令安装,注意和现有生产环境的控制器配置做区分:
# 之前已经添加过ingress-nginx仓库可跳过该步骤 helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update # 部署staging环境专属的Nginx Ingress控制器 helm install nginx-ingress-staging ingress-nginx/ingress-nginx \ --namespace ingress-basic \ --set controller.replicaCount=2 \ --set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \ --set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \ --set controller.admissionWebhooks.patch.nodeSelector."beta\.kubernetes\.io/os"=linux \ # 设置专属ingressClass标识 --set controller.ingressClass=nginx-staging \ --set controller.ingressClassResource.name=nginx-staging \ --set controller.ingressClassResource.enabled=true \ --set controller.ingressClassResource.default=false \ # 限制控制器仅监听staging命名空间的Ingress资源,彻底隔离配置 --set controller.watchNamespace=staging
安装完成后执行kubectl get svc -n ingress-basic,即可看到新的控制器对应的公网IP,就是你需要的staging环境专属IP。
2. (可选)优化现有生产控制器的隔离性
你可以给现有生产的Nginx Ingress控制器升级配置,限制它仅监听production命名空间的资源,避免读取到其他命名空间的配置:
helm upgrade nginx-ingress ingress-nginx/ingress-nginx \ --namespace ingress-basic \ # 保留之前所有原有配置,新增以下参数即可 --set controller.watchNamespace=production
3. 配置staging命名空间的Ingress资源
直接复用你现有生产的Ingress配置模板,只需要修改annotations中的kubernetes.io/ingress.class值为nginx-staging即可,其余路径规则、域名配置都可以和生产完全一致,不需要修改URL结构:
# 建议替换为新版本API,原extensions/v1beta1已在K8s 1.22+版本废弃 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-staging-ingress namespace: staging annotations: # 仅此处修改为新的ingressClass标识即可 kubernetes.io/ingress.class: "nginx-staging" nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/enable-cors: "true" cert-manager.io/issuer: "letsencrypt-prod" nginx.ingress.kubernetes.io/proxy-body-size: 800000m spec: tls: - secretName: my-staging-cert-tls hosts: - {{ .Values.stagingDomain }} # 也可以使用和生产不同的域名,按需配置 rules: # 路径规则可以和生产完全一致 - host: {{ .Values.stagingDomain }} http: paths: - path: /api/svc1(/|$)(.*) pathType: Prefix backend: service: name: svc1 port: number: 8080 - path: /api(/|$)(.*) pathType: Prefix backend: service: name: svc2 port: number: 8080 - path: /(.*) pathType: Prefix backend: service: name: svc3 port: number: 8080
最终效果验证
- 生产IP(IP1)仅会路由production命名空间的服务,完全无法访问staging的资源
- staging IP(IP2)仅会路由staging命名空间的服务,完全无法访问production的资源
- 两边的URL路径结构可以完全一致,互不影响
内容的提问来源于stack exchange,提问作者Pablo Estrada
相关产品推荐
相关产品推荐

