You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes双Ingress Controller(Traefik+Nginx)配置疑问求助

多Ingress Controller配置指南

一、解决Traefik重复安装问题

你遇到的cannot re-use a name that is still in use错误,是因为集群中已存在名为traefik的Helm Release。解决方式二选一:

  • 使用新名称重新安装Traefik:
helm install traefik-new traefik/traefik
  • 先卸载现有Traefik再重新安装:
helm uninstall traefik

二、为不同Ingress Controller配置Ingress规则

核心逻辑:每个Ingress Controller只会处理匹配自身IngressClass的Ingress资源(若未指定IngressClass,则匹配集群默认的Controller)。

步骤1:确认IngressClass资源

先查看集群中已存在的IngressClass:

kubectl get ingressclass

通常Nginx Helm部署的IngressClass为nginx,Traefik的为traefik。若未找到,可通过查看Controller Pod的启动参数或注解确认其关联的IngressClass。

步骤2:配置Traefik对应Ingress(a.example.com)

创建traefik-ingress-a.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: traefik-ingress-a
spec:
  ingressClassName: traefik  # 指定由Traefik Controller处理
  rules:
  - host: a.example.com
    http:
      paths:
      # 根路径指向nginx-deployment对应的service
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service
            port:
              number: 80
      # 路径示例:a.example.com/app指向service2
      - path: /app
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80

应用配置:

kubectl apply -f traefik-ingress-a.yaml

步骤3:配置Nginx对应Ingress(b.example.com)

创建nginx-ingress-b.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress-b
spec:
  ingressClassName: nginx  # 指定由Nginx Controller处理
  rules:
  - host: b.example.com
    http:
      paths:
      # 根路径指向nginx-deployment1对应的service1
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80
      # 路径示例:b.example.com/api指向service2
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80

应用配置:

kubectl apply -f nginx-ingress-b.yaml

三、IngressClass与Annotations疑问解答

1. 未设置IngressClass为何能正常工作?

Kubernetes支持设置默认IngressClass,若Ingress资源未指定ingressClassName,会自动匹配集群默认的Controller。你首次使用Nginx Controller时,其对应的IngressClass大概率被设为默认,可通过以下命令确认:

kubectl describe ingressclass nginx

若输出中包含ingressclass.kubernetes.io/is-default-class: "true",则说明该IngressClass是默认值。

2. 何时使用IngressClass?

  • 集群存在多个Ingress Controller时,必须用ingressClassName指定对应的处理Controller,避免路由规则冲突。
  • 统一管理不同Controller的配置逻辑,比如不同IngressClass对应不同的Controller策略(如限流、SSL配置)。

3. 何时使用Annotations?

Annotations用于给特定Ingress Controller传递自定义配置,不同Controller支持的注解不同:

  • Nginx Controller常用注解:nginx.ingress.kubernetes.io/rewrite-target(路径重写)、nginx.ingress.kubernetes.io/ssl-redirect(强制HTTPS跳转)。
  • Traefik Controller常用注解:traefik.ingress.kubernetes.io/router.middlewares(绑定Traefik中间件)。
  • 场景示例:给Nginx Ingress添加路径重写规则:
metadata:
  name: nginx-ingress-b
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: b.example.com
    http:
      paths:
      - path: /api(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80

四、Minikube本地测试访问

Minikube中LoadBalancer类型Service的EXTERNAL-IP会显示<pending>,需执行minikube tunnel命令暴露服务,然后在本地/etc/hosts中添加映射:

<Minikube节点IP> a.example.com
<Minikube节点IP> b.example.com

之后即可通过http://a.example.com和http://b.example.com访问对应服务。


内容的提问来源于stack exchange,提问作者狗狗兔兔

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:43:28