temp
This commit is contained in:
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
|
||||
Reference in New Issue
Block a user