5.6 KiB
5.6 KiB
title, description, tags, createdAt
| title | description | tags | createdAt | |||||
|---|---|---|---|---|---|---|---|---|
| Traefik 配置主机服务指南 | 通过 Traefik Ingress 将主机端口服务暴露到 Kubernetes 集群,实现域名访问 |
|
2025-11-26 |
Traefik 配置主机服务指南
概述
本文档介绍如何通过 Traefik Ingress 将主机上的服务(例如 4000 端口)暴露到 Kubernetes 集群,并通过域名访问。
配置方案
方案一:使用 Service + Endpoints(推荐)
这种方式直接将主机 IP 和端口映射到 Kubernetes Service。
1. 创建 Service 和 Endpoints
文件:services/host-service-4000.yaml
---
# 主机服务端点配置
apiVersion: v1
kind: Service
metadata:
name: host-service-4000
namespace: default
spec:
ports:
- protocol: TCP
port: 4000
targetPort: 4000
clusterIP: None
---
apiVersion: v1
kind: Endpoints
metadata:
name: host-service-4000
namespace: default
subsets:
- addresses:
- ip: 192.168.65.254 # 主机 IP 地址
ports:
- port: 4000
主机 IP 说明:
- Docker Desktop (Mac/Windows):
192.168.65.254或host.docker.internal - Linux (Minikube): 使用
minikube ssh "route -n | grep ^0.0.0.0 | awk '{ print \$2 }'"获取 - 自定义集群: 使用实际的主机 IP 地址
2. 创建 Ingress 规则
文件:ingress/host-service-ingress.yaml
---
# 主机服务 Ingress 配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: host-service-ingress
namespace: default
spec:
ingressClassName: traefik
rules:
- host: zd.xiongxiao.me
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: host-service-4000
port:
number: 4000
3. 部署配置
# 应用 Service 和 Endpoints
kubectl apply -f services/host-service-4000.yaml
# 应用 Ingress
kubectl apply -f ingress/host-service-ingress.yaml
4. 验证配置
# 检查 Service
kubectl get svc host-service-4000
# 检查 Endpoints
kubectl get endpoints host-service-4000
# 检查 Ingress
kubectl get ingress host-service-ingress
# 查看 Ingress 详情
kubectl describe ingress host-service-ingress
5. 配置 DNS
在你的 DNS 提供商或本地 hosts 文件中添加:
<traefik-ip> zd.xiongxiao.me
6. 测试访问
# 通过域名访问
curl http://zd.xiongxiao.me
# 或在浏览器中访问
# http://zd.xiongxiao.me
方案二:使用 ExternalName Service
适用于可以通过主机名访问的情况。
---
apiVersion: v1
kind: Service
metadata:
name: host-service-4000
namespace: default
spec:
type: ExternalName
externalName: host.docker.internal # 或使用实际主机名
ports:
- protocol: TCP
port: 4000
targetPort: 4000
注意: ExternalName 不支持指定端口,可能需要额外配置。
常见问题
1. 如何获取主机 IP?
Docker Desktop (Mac/Windows):
# 使用特殊域名
host.docker.internal
# 或使用固定 IP
192.168.65.254
Linux/Minikube:
# 方法一:从容器内查看
kubectl run -it --rm debug --image=alpine --restart=Never -- sh
/ # ip route | grep default
/ # exit
# 方法二:Minikube 特定
minikube ssh "route -n | grep ^0.0.0.0 | awk '{ print \$2 }'"
2. 连接被拒绝
检查以下几点:
- 主机服务是否在 0.0.0.0:4000 监听(而不是 127.0.0.1:4000)
- 防火墙是否允许访问
- 主机 IP 配置是否正确
修改服务监听地址示例:
# 错误 - 只监听本地
node server.js --host 127.0.0.1 --port 4000
# 正确 - 监听所有接口
node server.js --host 0.0.0.0 --port 4000
3. Ingress 无法路由
检查 Traefik 日志:
kubectl logs -n traefik -l app.kubernetes.io/name=traefik --tail=100
查看 Ingress 事件:
kubectl describe ingress host-service-ingress
配置多个主机服务
如果需要配置多个主机端口,只需复制配置并修改相应的值:
---
# 第二个服务 - 5000 端口
apiVersion: v1
kind: Service
metadata:
name: host-service-5000
namespace: default
spec:
ports:
- protocol: TCP
port: 5000
targetPort: 5000
clusterIP: None
---
apiVersion: v1
kind: Endpoints
metadata:
name: host-service-5000
namespace: default
subsets:
- addresses:
- ip: 192.168.65.254
ports:
- port: 5000
---
# Ingress 配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: host-service-5000-ingress
namespace: default
spec:
ingressClassName: traefik
rules:
- host: another.xiongxiao.me
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: host-service-5000
port:
number: 5000
HTTPS 配置
如果需要 HTTPS,可以添加 TLS 配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: host-service-ingress
namespace: default
annotations:
traefik.ingress.kubernetes.io/router.tls: "true"
spec:
ingressClassName: traefik
tls:
- hosts:
- zd.xiongxiao.me
secretName: zd-xiongxiao-me-tls
rules:
- host: zd.xiongxiao.me
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: host-service-4000
port:
number: 4000