temp
This commit is contained in:
292
k8s/xiongxiao.me/docs/04-host-service.md
Normal file
292
k8s/xiongxiao.me/docs/04-host-service.md
Normal file
@@ -0,0 +1,292 @@
|
||||
---
|
||||
title: Traefik 配置主机服务指南
|
||||
description: 通过 Traefik Ingress 将主机端口服务暴露到 Kubernetes 集群,实现域名访问
|
||||
tags:
|
||||
- Kubernetes
|
||||
- Traefik
|
||||
- Ingress
|
||||
- 主机服务
|
||||
- 端口转发
|
||||
createdAt: 2025-11-26
|
||||
---
|
||||
|
||||
# Traefik 配置主机服务指南
|
||||
|
||||
## 概述
|
||||
|
||||
本文档介绍如何通过 Traefik Ingress 将主机上的服务(例如 4000 端口)暴露到 Kubernetes 集群,并通过域名访问。
|
||||
|
||||
## 配置方案
|
||||
|
||||
### 方案一:使用 Service + Endpoints(推荐)
|
||||
|
||||
这种方式直接将主机 IP 和端口映射到 Kubernetes Service。
|
||||
|
||||
#### 1. 创建 Service 和 Endpoints
|
||||
|
||||
文件:`services/host-service-4000.yaml`
|
||||
|
||||
```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`
|
||||
|
||||
```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. 部署配置
|
||||
|
||||
```bash
|
||||
# 应用 Service 和 Endpoints
|
||||
kubectl apply -f services/host-service-4000.yaml
|
||||
|
||||
# 应用 Ingress
|
||||
kubectl apply -f ingress/host-service-ingress.yaml
|
||||
```
|
||||
|
||||
#### 4. 验证配置
|
||||
|
||||
```bash
|
||||
# 检查 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. 测试访问
|
||||
|
||||
```bash
|
||||
# 通过域名访问
|
||||
curl http://zd.xiongxiao.me
|
||||
|
||||
# 或在浏览器中访问
|
||||
# http://zd.xiongxiao.me
|
||||
```
|
||||
|
||||
### 方案二:使用 ExternalName Service
|
||||
|
||||
适用于可以通过主机名访问的情况。
|
||||
|
||||
```yaml
|
||||
---
|
||||
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)**:
|
||||
```bash
|
||||
# 使用特殊域名
|
||||
host.docker.internal
|
||||
|
||||
# 或使用固定 IP
|
||||
192.168.65.254
|
||||
```
|
||||
|
||||
**Linux/Minikube**:
|
||||
```bash
|
||||
# 方法一:从容器内查看
|
||||
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 配置是否正确
|
||||
|
||||
**修改服务监听地址示例**:
|
||||
```bash
|
||||
# 错误 - 只监听本地
|
||||
node server.js --host 127.0.0.1 --port 4000
|
||||
|
||||
# 正确 - 监听所有接口
|
||||
node server.js --host 0.0.0.0 --port 4000
|
||||
```
|
||||
|
||||
### 3. Ingress 无法路由
|
||||
|
||||
检查 Traefik 日志:
|
||||
```bash
|
||||
kubectl logs -n traefik -l app.kubernetes.io/name=traefik --tail=100
|
||||
```
|
||||
|
||||
查看 Ingress 事件:
|
||||
```bash
|
||||
kubectl describe ingress host-service-ingress
|
||||
```
|
||||
|
||||
## 配置多个主机服务
|
||||
|
||||
如果需要配置多个主机端口,只需复制配置并修改相应的值:
|
||||
|
||||
```yaml
|
||||
---
|
||||
# 第二个服务 - 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 配置:
|
||||
|
||||
```yaml
|
||||
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
|
||||
```
|
||||
|
||||
## 参考资源
|
||||
|
||||
- [Traefik 官方文档](https://doc.traefik.io/traefik/routing/providers/kubernetes-ingress/)
|
||||
- [Kubernetes Ingress 文档](https://kubernetes.io/docs/concepts/services-networking/ingress/)
|
||||
- [Kubernetes Service 文档](https://kubernetes.io/docs/concepts/services-networking/service/)
|
||||
Reference in New Issue
Block a user