如何通过k3s Ingress将流量路由至宿主机或本地网络非K8s服务?
可行,无需额外反向代理
完全可以通过k3s的Ingress将流量路由到集群外的本地服务——不管是宿主机上的服务还是同局域网内的其他机器服务,不需要在k3s服务器前额外部署反向代理。下面是具体实现方式:
场景1:路由到k3s宿主机上的服务(127.0.0.1:99)
注意:k3s默认的Ingress Controller(Traefik)运行在容器中,直接用127.0.0.1会指向容器自身而非宿主机,所以需要用宿主机的实际局域网IP(比如192.168.1.5)来配置。
步骤1:创建Endpoint资源
Endpoint用来定义集群外的服务地址:
apiVersion: v1 kind: Endpoints metadata: name: local-host-service subsets: - addresses: - ip: 192.168.1.5 # 替换成k3s宿主机的局域网IP ports: - port: 99 name: http
步骤2:创建ClusterIP Service关联Endpoint
这个Service用来给Ingress提供路由目标:
apiVersion: v1 kind: Service metadata: name: local-host-service spec: ports: - port: 80 targetPort: 99 name: http type: ClusterIP
这里Service的port可以选集群内不冲突的任意值,targetPort要和Endpoint里的端口一致。
步骤3:创建Ingress规则
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: local-service-ingress annotations: ingress.kubernetes.io/ssl-redirect: "false" # 不需要HTTPS可添加此注解 spec: rules: - host: foo.example.com http: paths: - path: / pathType: Prefix backend: service: name: local-host-service port: number: 80
场景2:路由到本地网络其他机器的服务(192.168.1.7:99)
配置逻辑和上述一致,仅需把Endpoint里的ip替换成目标机器的局域网IP即可:
修改后的Endpoint示例
apiVersion: v1 kind: Endpoints metadata: name: local-network-service subsets: - addresses: - ip: 192.168.1.7 # 替换成目标机器的局域网IP ports: - port: 99 name: http
对应的Service和Ingress只需将服务名改为local-network-service即可。
注意事项
- 确保k3s节点(单节点场景即宿主机)能正常访问目标服务的IP和端口,比如防火墙需开放对应端口、网络连通性正常。
- 若宿主机IP为动态分配,需定期更新Endpoint的IP,或用脚本自动同步。
内容的提问来源于stack exchange,提问作者Paperclip
相关产品推荐
相关产品推荐

