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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:05:20