Files
k8s-docs/k8s/xiongxiao.me/docs/04-host-service.md
2025-11-26 15:44:15 +08:00

5.6 KiB
Raw Blame History

title, description, tags, createdAt
title description tags createdAt
Traefik 配置主机服务指南 通过 Traefik Ingress 将主机端口服务暴露到 Kubernetes 集群,实现域名访问
Kubernetes
Traefik
Ingress
主机服务
端口转发
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.254host.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

参考资源