5.3 KiB
5.3 KiB
title, description, tags, createdAt
| title | description | tags | createdAt | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Traefik Ingress Controller 部署与 RBAC 配置指南 | 完整的 Kubernetes Traefik v2.10 部署教程,包含 RBAC 权限配置、ServiceAccount、ClusterRole、ClusterRoleBinding 设置,解决 ingresses.networking.k8s.io forbidden 权限问题,使用 NodePort 暴露服务 |
|
2025-11-26T04:30:00Z |
Traefik Ingress Controller 部署
本文档介绍如何使用 YAML 清单在 Kubernetes 集群中部署 Traefik Ingress Controller,包含完整的 RBAC 权限配置。
部署步骤
1. 创建 Traefik 命名空间
kubectl create namespace traefik
2. 应用 Traefik CRDs
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 文件,配置必要的权限:
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:
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. 验证部署
# 查看 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 - 管理界面:通过端口转发访问
# 访问 Traefik Dashboard
kubectl port-forward -n traefik svc/traefik 8080:8080
# 浏览器打开 http://localhost:8080/dashboard/
配置 Ingress
创建 Ingress 资源时,指定 ingressClassName: traefik:
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
排查步骤:
# 检查 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
注意事项
-
生产环境建议:
- 关闭
--api.insecure=true,使用安全的方式访问 Dashboard - 使用 LoadBalancer 类型的 Service(如果云环境支持)
- 配置 TLS 证书和 HTTPS
- 限制 ServiceAccount 权限范围(使用 Role 而非 ClusterRole)
- 关闭
-
DNS 配置:
- 将域名解析到任意一个 Node 节点的 IP
- 确保防火墙开放 30080 和 30443 端口
-
高可用性:
- 增加 Traefik 副本数(修改
replicas) - 使用 DaemonSet 在每个节点运行 Traefik
- 配置外部负载均衡器
- 增加 Traefik 副本数(修改
-
命名空间隔离:
- 当前配置使用 ClusterRole,可以访问所有命名空间的 Ingress
- 如需限制访问范围,改用 Role 和 RoleBinding
wget http://verdaccio-service.default.svc.cluster.local:4873