This commit is contained in:
2025-11-26 15:44:15 +08:00
parent 1cd698ed64
commit 2418891634
42 changed files with 3715 additions and 5 deletions

View File

@@ -0,0 +1,47 @@
# 安装 master
```sh
## 1. 安装 k3s
curl -sfL https://get.k3s.io | sh -
sudo cat /var/lib/rancher/k3s/server/node-token
```
## 2. 安装 node
```sh
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
```
## 3. 删除
```sh
## master 节点上执行
sudo /usr/local/bin/k3s-uninstall.sh
## node 节点上执行
sudo /usr/local/bin/k3s-agent-uninstall.sh
```
## 4. 这是 role
```
kubectl label nodes <node-name> role=<value> --overwrite
```
## 部署
如何在某一个节点vm-32-6-ubuntu部署verdaccio
```sh
# services
kubectl apply -f verdaccio-deployment.yaml
# ip
kubectl apply -f verdaccio-services.yaml
# 查看pod
kubectl get pods -o wide
```

View File

@@ -0,0 +1,13 @@
# 本地管理
## 安装
```sh
brew install kubectl
```
## 查看配置
```sh
cat /etc/rancher/k3s/k3s.yaml
```

View File

@@ -0,0 +1,204 @@
---
title: Traefik Ingress Controller 部署与 RBAC 配置指南
description: 完整的 Kubernetes Traefik v2.10 部署教程,包含 RBAC 权限配置、ServiceAccount、ClusterRole、ClusterRoleBinding 设置,解决 ingresses.networking.k8s.io forbidden 权限问题,使用 NodePort 暴露服务
tags:
- kubernetes
- traefik
- ingress-controller
- rbac
- clusterrole
- clusterrolebinding
- serviceaccount
- deployment
- nodeport
- permissions
- networking
createdAt: 2025-11-26T04:30:00Z
---
# Traefik Ingress Controller 部署
本文档介绍如何使用 YAML 清单在 Kubernetes 集群中部署 Traefik Ingress Controller包含完整的 RBAC 权限配置。
## 部署步骤
### 1. 创建 Traefik 命名空间
```bash
kubectl create namespace traefik
```
### 2. 应用 Traefik CRDs
```bash
kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v2.10/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml
```
### 3. 配置 RBAC 权限(重要)
创建 `traefik-rbac.yaml` 文件,配置必要的权限:
```bash
kubectl apply -f /Users/xion/kevisual/k8s-docs/k8s/xiongxiao.me/traefik/traefik-rbac.yaml
```
RBAC 配置包含:
- **ServiceAccount**traefik 服务账户
- **ClusterRole**:定义访问 Kubernetes 资源的权限
- 读取 Services、Endpoints、Secrets
- 读取和监听 Ingresses、IngressClasses
- 更新 Ingress 状态
- 访问 Traefik CRDs
- **ClusterRoleBinding**:将 ClusterRole 绑定到 ServiceAccount
### 4. 部署 Traefik
使用 `traefik-deployment.yaml` 配置文件部署 Traefik
```bash
kubectl apply -f /Users/xion/kevisual/k8s-docs/k8s/xiongxiao.me/traefik/traefik-deployment.yaml
```
配置文件内容说明:
**Deployment**
- 使用 Traefik v2.10 镜像
- 引用前面创建的 ServiceAccount`traefik`
- 配置参数:
- `--api.insecure=true`:启用管理 API生产环境建议禁用
- `--providers.kubernetesingress=true`:启用 Kubernetes Ingress 支持
- `--entrypoints.web.address=:80`HTTP 入口点
- `--entrypoints.websecure.address=:443`HTTPS 入口点
- 暴露端口80、443、8080管理界面
**Service**
- 类型NodePort
- 端口映射:
- HTTP: 80 → NodePort 30080
- HTTPS: 443 → NodePort 30443
- Admin: 8080 → 集群内部访问
**IngressClass**
- 名称traefik
- Controllertraefik.io/ingress-controller
### 5. 验证部署
```bash
# 查看 RBAC 配置
kubectl get serviceaccount traefik -n traefik
kubectl get clusterrole traefik-ingress-controller
kubectl get clusterrolebinding traefik-ingress-controller
# 查看 Pod 状态
kubectl get pods -n traefik
# 查看 Service
kubectl get svc -n traefik
# 查看 IngressClass
kubectl get ingressclass
# 查看日志(确认没有权限错误)
kubectl logs -n traefik -l app=traefik
```
预期日志中不应出现类似错误:
```
Failed to watch *v1.Ingress: ingresses.networking.k8s.io is forbidden
```
## 访问方式
部署完成后Traefik 通过 NodePort 方式暴露服务:
- **HTTP 访问**`http://<任意Node-IP>:30080`
- **HTTPS 访问**`https://<任意Node-IP>:30443`
- **管理界面**:通过端口转发访问
```bash
# 访问 Traefik Dashboard
kubectl port-forward -n traefik svc/traefik 8080:8080
# 浏览器打开 http://localhost:8080/dashboard/
```
## 配置 Ingress
创建 Ingress 资源时,指定 `ingressClassName: traefik`
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: verdaccio-ingress
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
ingressClassName: traefik
rules:
- host: npm.xiongxiao.me
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: verdaccio-service
port:
number: 82
```
访问应用时需要使用 NodePort 端口,例如:`http://npm.xiongxiao.me:30080`
## 常见问题
### 1. 权限错误ingresses.networking.k8s.io is forbidden
**症状**Traefik 日志中出现权限错误
**解决**:确保已正确应用 `traefik-rbac.yaml` 配置,包含 ClusterRole 和 ClusterRoleBinding
### 2. 404 Page Not Found
**排查步骤**
```bash
# 检查 Ingress 是否被识别
kubectl describe ingress verdaccio-ingress
# 查看 Traefik 路由
kubectl port-forward -n traefik svc/traefik 8080:8080
# 访问 http://localhost:8080/dashboard/ 查看路由配置
# 确认 Service 正常
kubectl get svc verdaccio-service
kubectl get endpoints verdaccio-service
```
## 注意事项
1. **生产环境建议**
- 关闭 `--api.insecure=true`,使用安全的方式访问 Dashboard
- 使用 LoadBalancer 类型的 Service如果云环境支持
- 配置 TLS 证书和 HTTPS
- 限制 ServiceAccount 权限范围(使用 Role 而非 ClusterRole
2. **DNS 配置**
- 将域名解析到任意一个 Node 节点的 IP
- 确保防火墙开放 30080 和 30443 端口
3. **高可用性**
- 增加 Traefik 副本数(修改 `replicas`
- 使用 DaemonSet 在每个节点运行 Traefik
- 配置外部负载均衡器
4. **命名空间隔离**
- 当前配置使用 ClusterRole可以访问所有命名空间的 Ingress
- 如需限制访问范围,改用 Role 和 RoleBinding
##
wget http://verdaccio-service.default.svc.cluster.local:4873
wget http://10.43.17.172:4873

View File

@@ -0,0 +1,16 @@
# 使用 curl 镜像测试 DNS 解析
```bash
kubectl run curl-test --image=curlimages/curl --rm -it --restart=Never -n default -- curl -v http://verdaccio-service:4873
#进入容器后,可以使用 curl 命令测试 DNS 解析:
kubectl run -it --rm --image=curlimages/curl dns-test -- sh
```
## 创建 一个 curlimages/curl 测试 Pod
创建在 master访问的是 worker 几点的 verdaccio-service 服务run 完后自己删除
```bash
kubectl run curl-test --image=curlimages/curl --rm -it --restart=Never -- sh
```

View 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/)

View File

@@ -0,0 +1,18 @@
```bash
# 1. 安装 Helm如果未安装
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 2. 添加 Rancher Helm 仓库
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
# 3. 创建命名空间
kubectl create namespace cattle-system
# 4. 安装 Rancher使用自签名证书示例生产请用 Let's Encrypt
helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--set hostname=rancher.xiongxiao.me \
--set ingress.tls.source=secret
```

View File

@@ -0,0 +1,176 @@
---
tags: traefik, ssl, https, let's encrypt, acme, ingress, kubernetes, 证书
description: Traefik 配置 Let's Encrypt 自动 SSL 证书的完整指南,解决浏览器显示不安全的问题
title: Traefik SSL 证书配置指南
createdAt: 2025-11-26
---
# Traefik SSL 证书配置指南
## 问题描述
Traefik 默认使用自签名证书,导致浏览器显示"不安全"警告。
## 解决方案
使用 Let's Encrypt 提供的免费 SSL 证书,通过 ACME 协议自动获取和续期。
## 配置步骤
### 1. 更新 Traefik 配置
已在 `traefik-complete.yaml` 中添加:
- **PersistentVolume/PVC**: 存储 ACME 证书数据
- **ACME 配置参数**:
- 证书解析器 `letsencrypt`
- HTTP Challenge 验证
- 自动 HTTP → HTTPS 重定向
### 2. 关键配置说明
```yaml
# Let's Encrypt 配置
- --certificatesresolvers.letsencrypt.acme.email=your-email@example.com # 修改为你的邮箱
- --certificatesresolvers.letsencrypt.acme.storage=/acme/acme.json
- --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
```
### 3. 修改邮箱地址
**重要**: 在应用配置前,修改 `traefik-complete.yaml` 中的邮箱:
```bash
# 编辑文件,将 your-email@example.com 改为你的真实邮箱
vi k8s/xiongxiao.me/traefik/traefik-complete.yaml
```
### 4. 应用配置
```bash
# 创建存储目录(在 k8s master 节点上)
sudo mkdir -p /data/traefik-acme
sudo chmod 600 /data/traefik-acme
# 应用配置
kubectl apply -f k8s/xiongxiao.me/traefik/traefik-complete.yaml
# 检查 PV/PVC 状态
kubectl get pv,pvc -n traefik
# 检查 Traefik Pod 状态
kubectl get pods -n traefik
kubectl logs -f deployment/traefik -n traefik
```
### 5. Ingress 使用示例
创建带 SSL 的 Ingress 资源:
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: default
annotations:
# 指定使用 letsencrypt 证书解析器
traefik.ingress.kubernetes.io/router.tls.certresolver: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: example.xiongxiao.me
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
tls:
- hosts:
- example.xiongxiao.me
# Let's Encrypt 会自动生成证书,无需手动指定 secretName
```
## 验证 SSL 证书
### 检查证书状态
```bash
# 查看 Traefik 日志中的 ACME 证书获取过程
kubectl logs -f deployment/traefik -n traefik | grep -i acme
# 进入 Pod 检查证书文件
kubectl exec -it deployment/traefik -n traefik -- ls -la /acme/
kubectl exec -it deployment/traefik -n traefik -- cat /acme/acme.json
```
### 浏览器验证
1. 访问你的域名: `https://example.xiongxiao.me`
2. 点击浏览器地址栏的锁图标
3. 查看证书详情,应显示由 "Let's Encrypt" 签发
## 常见问题
### 1. 证书获取失败
**原因**:
- 域名未正确解析到 Traefik 的公网 IP
- 80 端口未开放(HTTP Challenge 需要)
- 邮箱地址无效
**解决**:
```bash
# 检查域名解析
nslookup example.xiongxiao.me
# 检查 Traefik Service 的 NodePort
kubectl get svc traefik -n traefik
# 确保防火墙开放 80 和 443 端口
```
### 2. 测试环境配置
如果需要测试,使用 Let's Encrypt Staging 环境(避免达到速率限制):
```yaml
# 在 traefik args 中添加:
- --certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
```
**注意**: Staging 证书不被浏览器信任,仅用于测试。
### 3. 证书续期
Let's Encrypt 证书有效期 90 天,Traefik 会自动在到期前 30 天续期。
### 4. 多域名支持
可以为不同的域名自动获取证书:
```yaml
tls:
- hosts:
- app1.xiongxiao.me
- app2.xiongxiao.me
```
## 生产环境检查清单
- [ ] 修改邮箱地址为真实邮箱
- [ ] 确认域名 DNS 解析正确
- [ ] 确认 NodePort 30080 (HTTP) 可访问
- [ ] 确认 NodePort 30443 (HTTPS) 可访问
- [ ] 移除或注释 staging 环境配置
- [ ] 备份 `/data/traefik-acme/acme.json` 文件
## 参考资料
- [Traefik 官方文档 - Let's Encrypt](https://doc.traefik.io/traefik/https/acme/)
- [Let's Encrypt 速率限制](https://letsencrypt.org/docs/rate-limits/)
- [ACME HTTP Challenge](https://letsencrypt.org/docs/challenge-types/#http-01-challenge)

View File

@@ -0,0 +1,289 @@
# Nginx 配置迁移到 K3s + Traefik 指南
---
tags: kubernetes, k3s, traefik, nginx-migration, ingress, services
description: 将 Nginx 反向代理配置迁移到 K3s Kubernetes 集群,使用 Traefik 作为 Ingress Controller
title: Nginx 到 K3s Traefik 迁移指南
createdAt: 2025-11-26
---
## 概述
本指南说明如何将原有的 Nginx 反向代理配置迁移到 K3s Kubernetes 集群,使用 Traefik 作为 Ingress Controller。
## 架构说明
### 原架构Nginx
- Nginx 直接反向代理到各个应用服务
- 使用 Let's Encrypt 证书
- 手动配置每个域名的 SSL
### 新架构K3s + Traefik
- Traefik 作为统一的 Ingress Controller
- 自动申请和续期 Let's Encrypt 证书
- 使用 Kubernetes Service 和 Endpoints 映射外部服务
- 使用 IngressRoute CRD 配置路由规则
## 配置文件说明
### 1. 外部服务配置 (`services/external-services.yaml`)
为每个外部运行的应用创建 Kubernetes Service 和 Endpoints
```yaml
# Service 定义服务接口
apiVersion: v1
kind: Service
metadata:
name: blinko-external
namespace: default
spec:
type: ClusterIP
ports:
- port: 3111
targetPort: 3111
protocol: TCP
name: http
# Endpoints 指向实际的 IP 地址
apiVersion: v1
kind: Endpoints
metadata:
name: blinko-external
namespace: default
subsets:
- addresses:
- ip: 10.0.32.6 # 实际服务运行的 IP
ports:
- port: 3111
name: http
```
### 2. Traefik IngressRoute 配置 (`ingress/apps-ingressroute.yaml`)
为每个服务配置域名路由和 HTTPS
```yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: blinko-https
namespace: default
spec:
entryPoints:
- websecure # HTTPS 入口
routes:
- match: Host(`blinko.xiongxiao.me`)
kind: Rule
services:
- name: blinko-external
port: 3111
tls:
certResolver: letsencrypt # 自动申请 SSL 证书
```
## 服务列表
已迁移的服务包括:
| 域名 | 服务名称 | 端口 | IP 地址 | 说明 |
|------|---------|------|---------|------|
| blinko.xiongxiao.me | blinko-external | 3111 | 10.0.32.6 | Blinko 笔记 |
| chat.xiongxiao.me | chat-external | 3000 | 127.0.0.1 | 聊天服务 |
| kevisual.xiongxiao.me | kevisual-external | 3005 | 127.0.0.1 | Kevisual |
| www.xiongxiao.me | www-external | 3005 | 127.0.0.1 | 主网站 |
| immich.xiongxiao.me | immich-external | 2283 | 127.0.0.1 | 图片管理 |
| cloud.xiongxiao.me | cloud-external | 5212 | 127.0.0.1 | 云盘 |
| docmost.xiongxiao.me | docmost-external | 3011 | 127.0.0.1 | 文档协作 |
| drawio.xiongxiao.me | drawio-external | 13000 | 127.0.0.1 | 绘图工具 |
| minio.xiongxiao.me | minio-external | 9000 | 127.0.0.1 | 对象存储 |
| npm.xiongxiao.me | npm-external | 30001 | 10.0.32.6 | NPM 私有仓库 |
| gist.xiongxiao.me | gist-external | 6157 | 127.0.0.1 | 代码片段 |
| webdav.xiongxiao.me | webdav-external | 6060 | 127.0.0.1 | WebDAV |
| esm.xiongxiao.me | esm-external | 12000 | 127.0.0.1 | ESM CDN |
| umami.xiongxiao.me | umami-external | 4004 | 127.0.0.1 | 网站分析 |
| pwd.xiongxiao.me | pwd-external | 8180 | 127.0.0.1 | 密码管理 |
| meilisearch.xiongxiao.me | meilisearch-external | 7700 | 127.0.0.1 | 搜索引擎 |
| memos.xiongxiao.me | memos-external | 8181 | 10.0.32.6 | Memos |
| git.xiongxiao.me | gitea-external | 3000 | 10.0.32.6 | Gitea |
## 部署步骤
### 1. 确保 Traefik 已部署
```bash
# 检查 Traefik 是否运行
kubectl get pods -n traefik
# 如果未部署,先部署 Traefik
kubectl apply -f k8s/xiongxiao.me/traefik/traefik-complete.yaml
```
### 2. 部署外部服务配置
```bash
# 应用外部服务配置
kubectl apply -f k8s/xiongxiao.me/services/external-services.yaml
# 验证服务创建成功
kubectl get svc -n default | grep external
kubectl get endpoints -n default | grep external
```
### 3. 部署 IngressRoute
```bash
# 应用 IngressRoute 配置
kubectl apply -f k8s/xiongxiao.me/ingress/apps-ingressroute.yaml
# 验证 IngressRoute 创建成功
kubectl get ingressroute -n default
```
### 4. 验证路由配置
```bash
# 检查 Traefik Dashboard
kubectl port-forward svc/traefik 8080:8080 -n traefik
# 访问 http://localhost:8080/dashboard/
# 测试域名解析
curl -k https://blinko.xiongxiao.me
```
## 注意事项
### IP 地址说明
- `127.0.0.1` - 指向 Kubernetes 主节点本地运行的服务
- `10.0.32.6` - 指向局域网中其他机器运行的服务
**重要**: 如果服务是在 Pod 外部运行的:
- 本地服务需要确保端口可以从 Pod 内访问
- 远程服务需要确保网络互通
### WebSocket 支持
Traefik 默认支持 WebSocket以下服务需要 WebSocket
- chat.xiongxiao.me
- kevisual.xiongxiao.me
- www.xiongxiao.me
- immich.xiongxiao.me
- docmost.xiongxiao.me
- drawio.xiongxiao.me
- minio.xiongxiao.me
- gist.xiongxiao.me
- webdav.xiongxiao.me
- esm.xiongxiao.me
- umami.xiongxiao.me
### SSL 证书
- Traefik 自动使用 Let's Encrypt 申请证书
- 证书存储在 `/data/traefik-acme/acme.json`
- 自动续期,无需手动操作
### 大文件上传
部分服务配置了大文件上传支持(原 Nginx 的 `client_max_body_size`
- blinko: 1024m
- chat: 200m
- kevisual: 200m
- immich: 1024m
- cloud: 1024m
- docmost: 1024m
- drawio: 1024m
- minio: 200m
- npm: 24m
- gist: 1024m
- webdav: 2024m
- esm: 2048m
- umami: 1024m
- git: 2048m
如需在 Traefik 中配置,可添加 Middleware
```yaml
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: large-upload
namespace: default
spec:
buffering:
maxRequestBodyBytes: 2147483648 # 2GB
```
## 特殊配置
### look-good.xiongxiao.me (静态网站)
这是一个静态网站服务,需要单独处理:
**方案 1**: 将静态文件打包到 Pod 中运行 Nginx
```bash
# 创建 ConfigMap 或使用 PV 挂载静态文件
# 运行 Nginx Pod
```
**方案 2**: 继续使用原 Nginx 服务器,通过 Service 映射
### home.mz.xiongxiao.me
这个服务指向外部域名 `xionmi.mz.zxj.im:8123`,需要特殊处理。
## 故障排查
### 服务无法访问
1. 检查 Service 和 Endpoints
```bash
kubectl get svc,endpoints -n default | grep <service-name>
```
2. 检查 IngressRoute
```bash
kubectl describe ingressroute <name> -n default
```
3. 检查 Traefik 日志
```bash
kubectl logs -n traefik -l app=traefik
```
### SSL 证书问题
1. 检查证书文件
```bash
kubectl exec -n traefik <traefik-pod> -- cat /acme/acme.json
```
2. 确认 Let's Encrypt 配置
```bash
kubectl describe deployment traefik -n traefik | grep acme
```
## 回滚到 Nginx
如果需要回滚:
1. 在 DNS 中将域名指回原 Nginx 服务器
2. 删除 K3s 配置:
```bash
kubectl delete -f k8s/xiongxiao.me/ingress/apps-ingressroute.yaml
kubectl delete -f k8s/xiongxiao.me/services/external-services.yaml
```
## 后续优化
1. **容器化服务**: 逐步将外部服务容器化并部署到 K3s
2. **服务网格**: 考虑使用 Istio 或 Linkerd
3. **监控告警**: 集成 Prometheus + Grafana
4. **自动扩展**: 配置 HPA (Horizontal Pod Autoscaler)
5. **日志聚合**: 使用 ELK 或 Loki 收集日志
## 参考资料
- [Traefik 官方文档](https://doc.traefik.io/traefik/)
- [K3s 官方文档](https://docs.k3s.io/)
- [Kubernetes Services 文档](https://kubernetes.io/docs/concepts/services-networking/service/)