使用k3d与Traefik从自定义端口9200访问服务遇阻排查
在MacOS环境下使用k3d,先禁用内置Traefik后通过Helm安装Traefik并配置负载均衡,8443(websecure)端口的“2048”服务可从主机正常访问:
curl --cacert ca.crt -I https://2048.127.0.0.1.nip.io:8443 HTTP/2 200
部署了相同的“2049”服务,希望通过9200端口访问(已关闭TLS简化配置),但curl返回空响应:
+ curl -vvv -k -I http://2049.127.0.0.1.nip.io:9200 * Trying 127.0.0.1:9200... * Connected to 2049.127.0.0.1.nip.io (127.0.0.1) port 9200 (#0) > HEAD / HTTP/1.1 > Host: 2049.127.0.0.1.nip.io:9200 > User-Agent: curl/7.79.1 > Accept: */* > * Empty reply from server * Closing connection 0 curl: (52) Empty reply from server
两个服务在集群内均可访问。Traefik Service已配置9200端口映射:
k get -n traefik-system svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE traefik LoadBalancer 10.43.86.220 172.27.0.3,172.27.0.4,172.27.0.5 80:30039/TCP,443:30253/TCP,9092:30179/TCP,9200:31428/TCP 61m
对应的IngressRoute配置如下:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: game-2049 spec: entryPoints: # 监听来自9200端口的请求 - elasticsearch routes: - match: Host(`2049.127.0.0.1.nip.io`) kind: Rule services: - name: game-2049 # 请求转发至该服务 port: 80
Traefik已配置entrypoints:
- "--entrypoints.web.address=:8000/tcp" - "--entrypoints.websecure.address=:8443/tcp" - "--entrypoints.kafka.address=:9092/tcp" - "--entrypoints.elasticsearch.address=:9200/tcp"
目标是通过k3d从MacOS主机访问9200端口的Elasticsearch和9092端口的Kafka,目前需先解决“2049”服务的9200端口访问问题,请问缺失了哪些配置?
以下是需要补充的关键配置项:
1. 补全k3d主机端口映射
你当前通过主机的9200端口发起请求,但k3d并未将主机的9200端口映射到集群节点上Traefik Service对应的NodePort(31428)。需要添加端口映射:
- 如果集群未创建,创建时加入端口映射参数:
k3d cluster create <集群名称> --port 9200:31428@server[0] --port 9092:30179@server[0] - 如果集群已存在,编辑集群添加端口映射:
k3d cluster edit <集群名称> --port-add 9200:31428@server[0] --port-add 9092:30179@server[0]
2. 显式禁用IngressRoute的TLS配置
虽然你关闭了TLS,但需要确保Traefik的elasticsearch入口点未强制启用TLS,同时在IngressRoute中显式声明禁用TLS,避免路由匹配异常:
修改game-2049的IngressRoute配置:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: game-2049 spec: entryPoints: - elasticsearch routes: - match: Host(`2049.127.0.0.1.nip.io`) kind: Rule services: - name: game-2049 port: 80 tls: false # 显式禁用TLS,避免默认TLS配置干扰
3. 验证Traefik Service的端口映射正确性
确认Traefik Service的9200端口指向的是Traefik容器的9200端口(即elasticsearch入口点的监听端口)。检查Service的yaml配置,确保targetPort为9200:
apiVersion: v1 kind: Service metadata: name: traefik namespace: traefik-system spec: ports: - name: elasticsearch port: 9200 targetPort: 9200 # 必须与Traefik容器内entrypoint的监听端口一致 nodePort: 31428 # 其他端口配置...
4. 调整Host匹配规则(可选)
你的curl请求中Host头携带了端口9200,而Traefik的Host()匹配器默认匹配不带端口的主机名。如果出现匹配失败,可扩展match规则覆盖带端口的情况:
routes: - match: Host(`2049.127.0.0.1.nip.io`) || Host(`2049.127.0.0.1.nip.io:9200`) kind: Rule services: - name: game-2049 port: 80
内容的提问来源于stack exchange,提问作者Bjarte Brandt

