Kubernetes Traefik配置外部域名反向代理失败求助
解决Traefik反向代理集群外服务的配置问题
问题分析
你当前的配置存在几个关键问题:
- YAML格式错误:
Service的metadata.name未正确缩进,会导致K8s无法正常解析资源。 - ExternalName Service的
targetPort配置错误:targetPort应指定外部服务的实际端口号(如443),而非命名端口——因为ExternalName是将请求转发到外部域名,K8s不会解析命名端口对应的实际值。 - Traefik缺少必要注解:默认情况下Traefik可能用HTTP协议连接后端,但你的外部服务是HTTPS,需明确指定后端协议。
修正后的配置方案
1. 修正ExternalName Service
apiVersion: v1 kind: Service metadata: name: external-service spec: ports: - name: https port: 443 targetPort: 443 # 改为外部服务的实际端口 type: ExternalName externalName: my.outsidedomain.com
2. 修正Ingress并添加Traefik注解
kind: Ingress apiVersion: networking.k8s.io/v1 metadata: name: external-ingress annotations: cert-manager.io/cluster-issuer: simple-issuer # 指定后端服务使用HTTPS协议 traefik.ingress.kubernetes.io/service.serversscheme: https # 使用默认ServerTransport处理HTTPS后端(若需跳过证书校验可自定义) traefik.ingress.kubernetes.io/service.serverstransport: default@kubernetescrd spec: ingressClassName: traefik rules: - host: my.cluster.com http: paths: - pathType: Prefix path: /v2/ backend: service: name: external-service port: name: https tls: - hosts: - my.cluster.com secretName: secret-cert
3. 更可靠的IngressRoute方案(Traefik专属)
若Ingress配置仍不生效,推荐使用Traefik原生的IngressRoute自定义资源,配置逻辑更直观:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: external-ingressroute spec: entryPoints: - websecure routes: - match: Host(`my.cluster.com`) && PathPrefix(`/v2/`) kind: Rule services: - name: external-service port: 443 scheme: https # 明确指定后端为HTTPS tls: secretName: secret-cert
排查验证步骤
- 检查资源状态:执行
kubectl get svc,ing,ingressroute,确保所有资源处于正常可用状态。 - 查看Traefik日志:执行
kubectl logs -n traefik <traefik-pod-name>,搜索external-service相关日志,排查连接错误或路径转发问题。 - 测试集群内连通性:在集群内任意Pod中执行
curl -v https://my.outsidedomain.com/v2/,确认外部服务可正常访问。
内容的提问来源于stack exchange,提问作者Роман Коваленко
相关产品推荐
相关产品推荐

