Kubernetes双Ingress Controller(Traefik+Nginx)配置疑问求助
一、解决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,提问作者狗狗兔兔

