You need to enable JavaScript to run this app. AKS中使用Nginx Ingress为不同命名空间服务分配独立公网IP
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 05:00:03