Files
k8s-docs/k8s/xiongxiao.me/docs/02-traefik.md
2025-11-26 15:44:15 +08:00

5.3 KiB
Raw Blame History

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 暴露服务
kubernetes
traefik
ingress-controller
rbac
clusterrole
clusterrolebinding
serviceaccount
deployment
nodeport
permissions
networking
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 配置包含:

  • ServiceAccounttraefik 服务账户
  • 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 镜像
  • 引用前面创建的 ServiceAccounttraefik
  • 配置参数:
    • --api.insecure=true:启用管理 API生产环境建议禁用
    • --providers.kubernetesingress=true:启用 Kubernetes Ingress 支持
    • --entrypoints.web.address=:80HTTP 入口点
    • --entrypoints.websecure.address=:443HTTPS 入口点
  • 暴露端口80、443、8080管理界面

Service

  • 类型NodePort
  • 端口映射:
    • HTTP: 80 → NodePort 30080
    • HTTPS: 443 → NodePort 30443
    • Admin: 8080 → 集群内部访问

IngressClass

  • 名称traefik
  • Controllertraefik.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

注意事项

  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