temp
This commit is contained in:
47
k8s/xiongxiao.me/docs/00-master.md
Normal file
47
k8s/xiongxiao.me/docs/00-master.md
Normal 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
|
||||
```
|
||||
13
k8s/xiongxiao.me/docs/01-local-m.md
Normal file
13
k8s/xiongxiao.me/docs/01-local-m.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# 本地管理
|
||||
|
||||
## 安装
|
||||
|
||||
```sh
|
||||
brew install kubectl
|
||||
```
|
||||
|
||||
## 查看配置
|
||||
|
||||
```sh
|
||||
cat /etc/rancher/k3s/k3s.yaml
|
||||
```
|
||||
204
k8s/xiongxiao.me/docs/02-traefik.md
Normal file
204
k8s/xiongxiao.me/docs/02-traefik.md
Normal 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
|
||||
- Controller:traefik.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
|
||||
16
k8s/xiongxiao.me/docs/03-dns.md
Normal file
16
k8s/xiongxiao.me/docs/03-dns.md
Normal 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
|
||||
```
|
||||
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/)
|
||||
18
k8s/xiongxiao.me/docs/05-rancher.md
Normal file
18
k8s/xiongxiao.me/docs/05-rancher.md
Normal 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
|
||||
|
||||
```
|
||||
176
k8s/xiongxiao.me/docs/06-traefik-ssl.md
Normal file
176
k8s/xiongxiao.me/docs/06-traefik-ssl.md
Normal 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)
|
||||
289
k8s/xiongxiao.me/docs/07-nginx-migration.md
Normal file
289
k8s/xiongxiao.me/docs/07-nginx-migration.md
Normal 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/)
|
||||
Reference in New Issue
Block a user