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,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