kubernetes安装traefik Gateway API,应对Ingress NGINX停止维护

官方公告:Ingress NGINX 将在 2026 年3月停止维护,之后不会再有新 bug 修复或安全补丁。

这次官方宣布停止维护Ingress NGINX主要原因还是因为项目长期依赖少数维护者、并且今年暴露过严重安全事件,还有一个原因是大量 NGINX 自定义配置、各种注解(annotations)、自定义模板,使得开发者几乎"被锁定"在老旧架构中。

"停止维护"并不等于服务立即停止或失效:目前系统继续运行不会因为公告立即宕掉。但风险增加:未来若有新漏洞或安全事件,使用者将无法获得官方补丁,自行承担风险。

所以短期内还可以继续使用,后期就需要考虑替代品了

大部分公司如果用了K8S,把服务暴露给外网,大概率都使用了Ingress NGINX。所以它宣布即将停止维护,大家还是捏了一把汗,还好在2026年3月才停止维护,这就给企业留了缓冲时间。

Kubernetes 的新方向是 Gateway API,行业趋势已经不再是 "Ingress + NGINX",而是标准化的 Gateway API

Kubernetes 1.34 中 Gateway API 已进入 GA(通用可用) 阶段(v1.0.0),替代传统 Ingress 成为更灵活的流量管理方案。以下主流流量组件都支持 Gateway API。

本次实现在新搭建的kubernetes1.34集群尝试安装Traefik,经过官网对比,Traefik 3.x 是适配 Gateway API v1 的最佳选择。

1.部署 Gateway API CRDs(K8s 1.34 必备)

复制代码
# 部署 Gateway API v1.0.0 CRDs(官方源)
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml

# 验证 CRDs 部署成功
kubectl get crds | grep gateway.networking.k8s.io
# 输出包含 gatewayclasses.gateway.networking.k8s.io、gateways.gateway.networking.k8s.io、httproutes.gateway.networking.k8s.io 等即正常

2.创建 Traefik 命名空间

复制代码
kubectl create namespace traefik
  1. 部署 Traefik RBAC 权限(适配 Gateway API)

Traefik 需要访问 Gateway API 资源(GatewayClass/Gateway/HTTPRoute 等),创建 traefik-rbac.yaml

复制代码
---
# ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik
  namespace: traefik
---
# ClusterRole:包含 Gateway API 资源权限 + 基础 K8s 资源权限
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: traefik
rules:
  # 基础网络资源
  - apiGroups: [""]
    resources: ["services", "endpoints", "secrets"]
    verbs: ["get", "list", "watch"]
  # Gateway API v1 资源(核心)
  - apiGroups: ["gateway.networking.k8s.io"]
    resources:
      - gatewayclasses
      - gateways
      - httproutes
      - tcproutes
      - tlsroutes
      - referencegrants
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  # 节点信息(用于 DaemonSet 模式)
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["get", "list", "watch"]
  # Pod 信息(用于端点发现)
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "watch"]
---
# ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: traefik
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik
subjects:
  - kind: ServiceAccount
    name: traefik
    namespace: traefik

4.部署 Traefik 3.1(DaemonSet 模式,生产推荐)

复制代码
---
# ConfigMap:Traefik 基础配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: traefik-config
  namespace: traefik
data:
  traefik.yaml: |
    api:
      insecure: true # 测试阶段开启仪表盘(生产关闭)
      dashboard: true
    entryPoints:
      web:
        address: ":80" # HTTP 入口
      websecure:
        address: ":443" # HTTPS 入口
      traefik:
        address: ":8080" # 仪表盘入口
    providers:
      kubernetesGateway: # 启用 Gateway API 提供者(核心)
        enabled: true
        namespace: "*" # 监听所有命名空间的 Gateway 资源
      kubernetesIngress: # 可选:保留 Ingress 兼容(如需双模式)
        enabled: false
    log:
      level: "INFO" # 生产可改为 WARN
    accessLog:
      filePath: "/dev/stdout" # 访问日志输出到标准输出,便于日志收集
---
# DaemonSet:每个节点部署 Traefik,使用 HostPort 暴露端口
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: traefik
  namespace: traefik
  labels:
    app: traefik
spec:
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      labels:
        app: traefik
    spec:
      serviceAccountName: traefik
      hostNetwork: true # 使用主机网络,确保 HostPort 生效
      terminationGracePeriodSeconds: 60
      containers:
        - name: traefik
          image: traefik:v3.1.0 # 适配 K8s 1.34 + Gateway API v1,镜像下载可参考官网
          args:
            - --configfile=/etc/traefik/traefik.yaml
          ports:
            - name: web
              containerPort: 80
              hostPort: 80 # 主机 HTTP 端口
            - name: websecure
              containerPort: 443
              hostPort: 443 # 主机 HTTPS 端口
            - name: traefik
              containerPort: 8080
              hostPort: 8080 # 仪表盘端口
          volumeMounts:
            - name: config
              mountPath: /etc/traefik
          securityContext:
            capabilities:
              drop: ["ALL"]
              add: ["NET_BIND_SERVICE"] # 允许绑定 80/443 端口
          resources:
            limits:
              cpu: 1000m
              memory: 512Mi
            requests:
              cpu: 100m
              memory: 64Mi
          # 健康检查(生产必备)
          livenessProbe:
            httpGet:
              path: /ping
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /ping
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5
      volumes:
        - name: config
          configMap:
            name: traefik-config
      # 允许运行在控制平面节点(按需开启)
      tolerations:
        - key: node-role.kubernetes.io/control-plane
          operator: Exists
          effect: NoSchedule
        - key: node-role.kubernetes.io/master
          operator: Exists
          effect: NoSchedule
---
# Service:暴露仪表盘(测试用,生产建议删除)
apiVersion: v1
kind: Service
metadata:
  name: traefik-dashboard
  namespace: traefik
spec:
  selector:
    app: traefik
  ports:
    - name: traefik
      port: 8080
      targetPort: 8080
      nodePort: 30800
  type: NodePort

5.执行部署

复制代码
kubectl apply -f traefik-rbac.yaml
kubectl apply -f traefik-daemonset.yaml

6.验证 Traefik 部署

复制代码
# 检查 Traefik Pod 状态(每个节点一个 Pod,Running 状态)
kubectl get pods -n traefik

# 检查 Traefik 日志,确认 Gateway API 提供者加载成功
kubectl logs -f <traefik-pod-name> -n traefik
# 日志中包含 "Provider kubernetesGateway started" 即表示 Gateway API 适配成功

# 访问仪表盘验证(测试用)
curl http://<节点IP>:30800/dashboard/
# 能看到 Traefik 仪表盘界面即正常

7.配置 Gateway API 资源(核心验证)

Gateway API 核心资源关系:GatewayClass(网关类)→ Gateway(网关实例)→ HTTPRoute(路由规则)。以下创建完整示例,实现 Nginx 服务的流量转发。

  • 创建 GatewayClass(绑定 Traefik 控制器)

GatewayClass 是集群级资源,定义网关的「类型」,绑定 Traefik 控制器

复制代码
# traefik-gatewayclass.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: traefik-gateway-class
spec:
  controllerName: traefik.io/gateway-controller # Traefik 3.x 固定标识
  description: "Traefik GatewayClass for K8s 1.34"

kubectl apply -f traefik-gatewayclass.yaml

验证 GatewayClass

kubectl get gatewayclass

输出 traefik-gateway-class,STATUS 为 Accepted 即正常

  • 创建 Gateway(网关实例,暴露 80/443 端口)

Gateway 是命名空间级资源,对应 Traefik 的入口端口,绑定上述 GatewayClass:

复制代码
# traefik-gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: traefik-gateway
  namespace: default # 可自定义命名空间
spec:
  gatewayClassName: traefik-gateway-class # 关联上述 GatewayClass
  listeners: # 监听端口配置(对应 Traefik 的 entryPoints)
    - name: web
      protocol: HTTP
      port: 80
      allowedRoutes:
        namespaces:
          from: All # 允许所有命名空间的 HTTPRoute 关联
    - name: websecure
      protocol: HTTPS
      port: 443
      allowedRoutes:
        namespaces:
          from: All
      # 可选:配置默认 TLS 证书(需提前创建 Secret)
      # tls:
      #   certificateRefs:
      #     - name: https-tls-secret
      #       kind: Secret

kubectl apply -f traefik-gateway.yaml # 验证 Gateway

kubectl get gateway # 输出 traefik-gateway,

STATUS 为 Ready 即正常(需等待 Traefik 识别)

  • 创建测试服务 + HTTPRoute(路由规则)

先部署 Nginx 测试服务,再创建 HTTPRoute 关联 Gateway,实现流量转发:

复制代码
# nginx-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
        - name: nginx
          image: nginx:1.22
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-test
  namespace: default
spec:
  selector:
    app: nginx-test
  ports:
    - port: 80
      targetPort: 80
  type: ClusterIP
---
# HTTPRoute:路由规则,关联 Gateway 和测试服务
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: nginx-httproute
  namespace: default
spec:
  parentRefs: # 关联上述 Gateway
    - name: traefik-gateway
      namespace: default
      sectionName: web # 关联 Gateway 的 web 监听器(80 端口)
  hostnames: # 自定义域名(需配置 hosts 解析到节点 IP)
    - "nginx.test.com"
  rules: # 路由规则
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs: # 转发到测试服务
        - name: nginx-test
          port: 80

kubectl apply -f nginx-test.yaml

验证 HTTPRoute

kubectl get httproutes

输出 nginx-httproute,STATUS 为 Accepted 即正常

  • 验证 Gateway API 转发

    1. 配置本地 hosts(示例)

    echo "<节点IP> nginx.test.com" >> /etc/hosts

    2. 访问测试(通过 Traefik 网关 80 端口)

    curl http://nginx.test.com

    输出 Nginx 默认页面 → 路由转发成功

    3. 验证 Traefik 路由识别

    kubectl logs -f <traefik-pod-name> -n traefik

    日志中包含 "Added HTTPRoute default/nginx-httproute" 即表示路由加载成功

关键点回顾

  1. K8s 1.34 需手动部署 Gateway API v1.0.0 CRDs(GA 版本,无需特性门控);
  2. Traefik 3.x 是适配 Gateway API v1 的核心版本,需配置 kubernetesGateway 提供者;
  3. Gateway API 核心资源流程:GatewayClass(集群级)→ Gateway(命名空间级,暴露端口)→ HTTPRoute(路由规则,关联服务);
  4. 生产环境需关闭 Traefik 仪表盘、启用 TLS 加密、配置资源限制和监控,确保稳定性。
相关推荐
G31135422732 小时前
如何用 QClaw 龙虾做一个规律作息健康助理 Agent
大数据·人工智能·ai·云计算
木雷坞2 小时前
K8s GPU 推理服务 ImagePullBackOff 排查与预热
云原生·容器·kubernetes·gpu算力
吴爃3 小时前
Spring Boot 项目在 K8S 中的打包、部署与运维发布实践
运维·spring boot·kubernetes
TG_yunshuguoji3 小时前
阿里云代理商:DeepSeek V4 vs GPT 系列 阿里云上的成本与性能新平衡
人工智能·阿里云·云计算·ai智能体·deepseek v4
byoass4 小时前
企业云盘数据备份与恢复策略:定时备份增量备份异地容灾实战
网络·安全·云计算
**蓝桉**4 小时前
阿里云存储服务
阿里云·云计算
The Straggling Crow5 小时前
Monitoring 2026-04-30
kubernetes
AOwhisky5 小时前
Kubernetes调度与服务暴露:从“定时任务”到“服务发现”的完全指南
linux·运维·云原生·容器·kubernetes·服务发现
Cyber4K6 小时前
【Kubernetes专项】温故而知新,重温技术原理(6)
云原生·容器·kubernetes
ZStack开发者社区6 小时前
ZStack dGPU:让虚拟机里的 GPU 也能按需切分
云计算·gpu算力