Kubernetes集群中Traefik作为Ingress Controller访问应用出现404错误
我在Kubernetes集群中部署了Apache演示应用,使用Traefik作为Ingress Controller。应用本身无问题(将Service改为NodePort类型后可正常访问),但通过Traefik Ingress访问时出现404错误,以下是相关配置及问题详情:
应用部署配置
apiVersion: apps/v1 kind: Deployment metadata: name: apache labels: name: apache spec: selector: matchLabels: app: apache replicas: 1 template: metadata: labels: app: apache spec: containers: - name: apache image: httpd:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: apache-svc labels: name: apache spec: type: ClusterIP ports: - port: 80 name: http targetPort: 80 selector: app: apache --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: apache-ingress annotations: kubernetes.io/ingress.class: traefik spec: rules: - http: paths: - path: /test pathType: Prefix backend: service: name: apache-svc port: number: 80
Traefik Service配置
kind: Service apiVersion: v1 metadata: name: traefik-ingress-service namespace: monitoring spec: selector: app: traefik ports: - protocol: TCP port: 80 name: http targetPort: http - protocol: TCP port: 8080 name: admin targetPort: admin type: NodePort
补充:Traefik Dashboard的IngressRoute配置
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: traefik-webui-ingress namespace: monitoring spec: entryPoints: - web routes: - match: PathPrefix(`/`) kind: Rule services: - name: traefik port: 8080
当前Service信息
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) monitoring traefik-ingress-service NodePort x.x.x.x <none> 80:<httpNodePort>/TCP,8080:<AdminNodePort>/TCP
问题现象
通过http://<workerIP>:<AdminNodePort>/test/访问应用时出现404错误,但将apache-svc改为NodePort类型后,通过对应NodePort可正常访问应用,确定问题出在Traefik Ingress Controller配置上。
排查与解决方案
访问端口错误
你误用了Traefik的Admin端口(8080对应的NodePort)访问应用,该端口仅用于Traefik Dashboard。应用的Ingress规则绑定在Traefik的web入口点(对应Service的80端口),应使用http://<workerIP>:<httpNodePort>/test/访问。IngressRoute路由优先级冲突
Traefik Dashboard的IngressRoute配置了PathPrefix(/),该规则会匹配所有请求,优先级高于Apache的Ingress规则。需调整Dashboard的路由前缀,避免覆盖其他规则:apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: traefik-webui-ingress namespace: monitoring spec: entryPoints: - web routes: - match: PathPrefix(`/dashboard`) kind: Rule services: - name: traefik port: 8080 middlewares: - name: strip-dashboard-prefix --- apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: strip-dashboard-prefix namespace: monitoring spec: stripPrefix: prefixes: - /dashboard确认Traefik启用Kubernetes Ingress支持
检查Traefik启动参数,确保添加了--providers.kubernetesingress,否则Traefik不会处理标准Ingress资源。Ingress类注解兼容性
若使用Traefik v2+,建议替换旧注解为Traefik专用注解,确保Ingress被正确识别:metadata: name: apache-ingress annotations: traefik.ingress.kubernetes.io/router.entrypoints: web
内容的提问来源于stack exchange,提问作者Schottky

