跳到主要内容

在 TKE 使用 Traefik 流量网关

概述

Traefik 是一款现代化的云原生反向代理工具,与 Nginx 相比具有以下显著优势:

  • 同时支持 Kubernetes Ingress API、Traefik CRD 和 Gateway API 三种流量管理配置方式。
  • 提供功能丰富的 Dashboard 管理界面,支持路由可视化配置与监控。
  • 深度集成 Prometheus 提供完整的 Metrics 数据,便于监控告警。
  • 支持丰富的流量治理功能,包括:多版本灰度发布、流量镜像复制、自动签发 Let's Encrypt HTTPS 证书、灵活的中间件机制等。

本文将介绍如何在 TKE 集群中部署 Traefik 并通过多种配置方式管理流量。

安装 Traefik

  1. TKE 应用市场 搜索 traefik
  2. 单击 traefik 进入应用详情页。
  3. 单击创建应用
  4. 应用名称建议填 traefik,选择需要安装 traefik 的目标集群。
  5. 可参考后文的Traefik 参数配置,根据需求配置完参数后,单击创建即可将 traefik 安装到集群中。
  6. 安装完后在应用管理中找到 traefik 应用,单击应用名称进入应用详情页,在Service中可以查到 traefik 的 CLB 地址信息,将需要用到的域名配置下 DNS 解析,确保域名能解析到 traefik 的 CLB 地址。

后续若想更改配置,可在应用管理中找到 traefik 应用,单击更新应用并编辑参数即可。

Traefik 参数配置

以下是关于安装 Traefik 的一些参数配置建议,可根据需求进行修改。

说明

本文使用 TKE 应用市场安装 traefik,TKE 应用市场安装的应用是 helm chart,其中 traefik 应用搬运自开源社区的 traefik-helm-chart,参数配置(values.yaml)与社区完全一致(镜像地址除外),如果你通过 helm 来安装,也可以这里的参数配置建议。

启用 CLB 直连 Pod

建议启用 CLB 直连 Pod,这样 CLB 就可以将流量直接转发给 Pod,无需经过 NodePort,延迟更低,且 Traefik 自身可以感知真实源 IP,后端的业务 Pod 可通过 header 获取真实源 IP。

配置方法如下:

service:
annotations:
service.cloud.tencent.com/direct-access: "true"

使用已有的 CLB

如果已经创建了 CLB,可以指定下 CLB 实例 ID,配置方法如下:

说明

更多详情参考 Service 使用已有 CLB

注意

注意替换 lb-xxx 为已有的 CLB 实例 ID。

service:
annotations:
service.kubernetes.io/tke-existed-lbid: lb-xxx

公网和内网同时接入

默认创建的是公网 CLB,可通过类似如下配置实现内网和公网双 CLB 同时接入:

注意

自动创建内网 CLB 需指定子网 ID,注意替换 subnet-xxxxxxxx

ports:
web:
expose:
default: true
internal: true
websecure:
expose:
default: true
internal: true
service:
additionalServices:
internal:
type: LoadBalancer
annotations:
service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: "subnet-xxxxxxxx" # 配置内网 CLB 的子网

IPV4 和 IPV6 同时接入

默认创建的是 IPV4 的 CLB,可通过类似如下配置实现 IPV6 和 IPV4 双 CLB 同时接入:

说明

更多详情请参考 在 TKE 上使用 IPv6

ports:
web:
expose:
default: true
ipv6: true
websecure:
expose:
default: true
ipv6: true
service:
additionalServices:
ipv6:
type: LoadBalancer
annotations:
service.kubernetes.io/service.extensiveParameters: '{"AddressIPVersion":"IPv6FullChain"}'

启用 Gateway API

默认没启用 Gateway API 的支持,可通过以下配置启用:

providers:
kubernetesGateway:
enabled: true
gateway:
enabled: false # 禁用自动创建与 traefik 在相同命名空间的 Gateway 对象,建议自行按需创建(1 个或多个,可跨命名空间)。

如果同时想禁用 Ingress 和 Traefik 自身 CRD 的支持,可以用如下的配置:

providers:
kubernetesGateway:
enabled: true
kubernetesIngress:
enabled: false
kubernetesCRD:
enabled: false

使用 Ingress 管理流量

Traefik 支持使用 Kubernetes 的 Ingress 资源作为动态配置,可直接在集群中创建 Ingress 资源用于对外暴露集群,需要加上指定的 IngressClass(安装 Traefik 时可自定义,默认为 traefik)。示例如下:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
spec:
ingressClassName: traefik
rules:
- host: traefik.demo.com
http:
paths:
- path: /test
backend:
serviceName: nginx
servicePort: 80
注意

TKE 暂未将 Traefik 产品化,无法直接在 TKE 控制台进行可视化创建 Ingress,需要使用 YAML 进行创建。

使用 Traefik CRD 管理流量

Traefik 不仅支持标准的 Kubernetes Ingress 资源,也支持 Traefik 特有的 CRD 资源,例如 IngressRoute,可以支持更多 Ingress 不具备的高级功能。IngressRoute 使用示例如下:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: test-ingressroute
spec:
entryPoints:
- web
routes:
- match: Host(`traefik.demo.com`) && PathPrefix(`/test`)
kind: Rule
services:
- name: nginx
port: 80
说明

Traefik 更多用法请参见 Traefik 官方文档

使用 Gateway API 管理流量

Traefik 也支持了 Gateway API,如果你启用了 Gateway API 的支持,就可以用 Gateway API 的方式来管理流量,下面给出示例。

首先创建 Gateway 对象(定义的端口会自动映射到对应的 LoadBalancer Service,通过 CLB 监听器暴露):

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: prod-gw
namespace: prod
spec:
gatewayClassName: traefik # 指定自动创建出来的 GatewayClass 名称
listeners:
- name: http
protocol: HTTP
port: 8000
allowedRoutes:
namespaces:
from: All

再定义转发规则(如 HTTPRoute),并引用 Gateway 对象:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: foo
namespace: prod
spec:
parentRefs: # 引用 Gateway 对象
- name: prod-gw
namespace: prod
hostnames:
- "foo.example.com"
rules:
- backendRefs:
- name: foo
port: 8000