Skip to content

在 Kubernetes 上部署 Traefik

Kubernetes

本指南提供了使用官方 Helm chart 在 Kubernetes 集群中安装和配置 Traefik 代理的详尽步骤。在本指南中,我们将涵盖以下内容:

  • 配置标准 HTTP(web)和 HTTPS(websecure)入口点
  • 实现从 HTTP 到 HTTPS 的自动重定向
  • 使用 Basic 认证保护 Traefik 仪表盘
  • 部署一个演示应用来测试设置
  • 探索其他关键配置选项

前置条件

  • 一个 Kubernetes 集群
  • Helm v3
  • Kubectl

创建集群

如果你还没有 Kubernetes 集群,可以使用 K3d 创建一个:

bash
k3d cluster create traefik \
  --port 80:80@loadbalancer \
  --port 443:443@loadbalancer \
  --port 8000:8000@loadbalancer \
  --k3s-arg "--disable=traefik@server:0"

80443 端口从主机到达 Traefik,8000 端口留作后续演示。k3s 自带的 Traefik 被禁用以避免冲突。

检查上下文:

bash
kubectl cluster-info --context k3d-traefik

你应该看到类似这样的内容:

Kubernetes control plane is running at https://0.0.0.0:56049
CoreDNS is running at https://0.0.0.0:56049/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://0.0.0.0:56049/api/v1/namespaces/kube-system/services/https:metrics-server:https/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

添加 chart 仓库和命名空间

Helm 简化了 Kubernetes 应用的部署。Helm 将应用打包为 "chart",chart 是描述 Kubernetes 资源的模板文件集合。我们使用官方 Traefik Helm chart 来进行托管式和可定制的安装。

bash
helm repo add traefik https://traefik.github.io/charts
helm repo update
kubectl create namespace traefik

第一个命令注册 traefik 仓库别名,指向官方 chart 位置。第二个命令刷新本地缓存,以确保你拥有来自所有已配置仓库的最新 chart 和版本列表。

创建本地自签名 TLS Secret

只要监听器使用 protocol: HTTPS,Traefik 的 Gateway 监听器就需要证书。

对于本地开发,创建一个临时的自签名证书,并将其存储在名为 local-selfsigned-tls 的 Kubernetes Secret 中。

Gateway 引用此 Secret 来终止 websecure 监听器上的 TLS。

bash
# 1) 生成对 *.docker.localhost 有效的自签名证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout tls.key -out tls.crt \
  -subj "/CN=*.docker.localhost"

# 2) 在 traefik 命名空间中创建 TLS Secret
kubectl create secret tls local-selfsigned-tls \
  --cert=tls.crt --key=tls.key \
  --namespace traefik

为什么我们需要这样做

Gateway 的 HTTPS 监听器通过 certificateRefs 引用此 Secret。没有它,helm chart 验证会失败,HTTP→HTTPS 重定向链也会中断。

生产环境提示

上面的自签名证书仅用于本地开发。对于生产环境,可以将组织 CA 颁发的证书存储在 Secret 中,或者让自动化颁发者(如 cert-manager 或 Traefik 的 ACME(Let's Encrypt))按需生成证书。更新 websecure 监听器中的 certificateRefs —— 或使用 traefik.io/tls.certresolver —— 以便客户端获得受信任的证书,不再看到浏览器警告。

准备 Helm Chart 配置值

创建一个 values.yaml 文件,内容如下:

yaml
# 配置网络端口和入口点
# 入口点是传入流量的网络监听器
ports:
  # 定义名为 'web' 的 HTTP 入口点
  web:
    port: 80
    nodePort: 30000
    # 指示此入口点将所有流量重定向到 'websecure' 入口点
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true

  # 定义名为 'websecure' 的 HTTPS 入口点
  websecure:
    port: 443
    nodePort: 30001

# 在安全模式下启用仪表盘
api:
  dashboard: true
  insecure: false

ingressRoute:
  dashboard:
    enabled: true
    matchRule: Host(`dashboard.docker.localhost`)
    entryPoints:
      - websecure
    middlewares:
      - name: dashboard-auth

# 为仪表盘安全创建 BasicAuth 中间件和 Secret
extraObjects:
  - apiVersion: v1
    kind: Secret
    metadata:
      name: dashboard-auth-secret
    type: kubernetes.io/basic-auth
    stringData:
      username: admin
      password: "P@ssw0rd"      # 替换为实际密码
  - apiVersion: traefik.io/v1alpha1
    kind: Middleware
    metadata:
      name: dashboard-auth
    spec:
      basicAuth:
        secret: dashboard-auth-secret

# 我们将使用 Gateway API 进行路由
ingressClass:
  enabled: false

# 启用 Gateway API Provider,并禁用 KubernetesIngress Provider
# Providers 告诉 Traefik 在哪里查找路由配置
providers:
  kubernetesIngress:
    enabled: false
  kubernetesGateway:
    enabled: true

# Gateway 监听器
gateway:
  listeners:
    web:           # 匹配入口点 `web` 的 HTTP 监听器
      port: 80
      protocol: HTTP
      namespacePolicy:
        from: All

    websecure:         # 匹配入口点 `websecure` 的 HTTPS 监听器
      port: 443
      protocol: HTTPS  # TLS 在 Traefik 内终止
      namespacePolicy:
        from: All
      mode: Terminate
      certificateRefs:
        - kind: Secret
          name: local-selfsigned-tls  # 我们在安装前创建的 Secret
          group: ""

# 启用可观测性
logs:
  general:
    level: INFO
  # 这会启用访问日志,默认输出到 Traefik 的标准输出
  access:
    enabled: true

# 启用 Prometheus 指标
metrics:
  prometheus:
    enabled: true

使用 Helm 值安装 Traefik

现在,使用 Helm 客户端应用配置。

bash
# 将 chart 安装到 'traefik' 命名空间
helm install traefik traefik/traefik \
  --namespace traefik \
  --values values.yaml

命令分解:

  • helm install traefik:指示 Helm 安装一个名为 traefik 的新 release。
  • traefik/traefik:指定要使用的 chart(来自先前添加的 traefik 仓库的 traefik chart)。
  • --namespace traefik:指定要安装到的 Kubernetes 命名空间。建议使用专用命名空间。
  • --values values.yaml:应用 values.yaml 文件中的自定义配置。

访问仪表盘

现在 Traefik 已部署,你可以通过 https://dashboard.docker.localhost/ 访问其仪表盘。当你访问此链接时,浏览器将提示你输入用户名和密码。确保使用在 values.yaml 文件中设置的凭证登录。成功登录后,仪表盘将如下所示:

部署演示应用

要测试设置,请在 Kubernetes 集群中部署 Traefik whoami 应用。创建一个名为 whoami.yaml 的文件,并粘贴以下内容:

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
  namespace: traefik
spec:
  replicas: 2
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: traefik/whoami
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: whoami
  namespace: traefik
spec:
  selector:
    app: whoami
  ports:
    - port: 80

应用清单:

bash
kubectl apply -f whoami.yaml

部署应用后,你可以通过创建 Gateway API HTTPRoute 来暴露该应用。为此,创建一个名为 whoami-route.yaml 的文件,并粘贴以下内容:

yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: whoami
  namespace: traefik
spec:
  parentRefs:
    - name: traefik-gateway # 启用 Gateway API Provider 时 Traefik 创建的 Gateway 名称
  hostnames:
    - "whoami.docker.localhost"
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - name: whoami
          port: 80

应用清单:

bash
kubectl apply -f whoami-route.yaml

应用清单后,导航到 Traefik 仪表盘中的 Routes;你将看到 https://whoami.docker.localhost 路由已创建。

你可以使用 curl 测试该应用:

bash
curl -k https://whoami.docker.localhost/

返回内容:

Hostname: whoami-76c9859cfc-k7jzs
IP: 127.0.0.1
IP: ::1
IP: 10.42.0.59
IP: fe80::50d7:a2ff:fed5:2530
RemoteAddr: 10.42.0.60:54148
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/8.7.1
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.42.0.1
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Forwarded-Server: traefik-644b7c67d9-f2tn9
X-Real-Ip: 10.42.0.1

你也可以在浏览器中打开 https://whoami.docker.localhost 查看服务的 JSON 转储。

其他关键配置领域

上述设置提供了安全的基础,但 Traefik 还提供了更多功能。以下是其他重要配置的简要概述,并提供了使用 Helm values.yaml 覆盖的最小示例。

这些示例说明了如何启用这些功能;详细选项请查阅主文档。

TLS 证书管理(Let's Encrypt)

websecure 入口点上,TLS 默认是启用的。但它目前缺少有效的证书。Traefik 可以使用 ACME 协议自动从 Let's Encrypt 获取并续订 TLS 证书。

values.yaml 添加示例:

yaml
additionalArguments:
  - "[email protected]"
  - "--certificatesresolvers.le.acme.storage=/data/acme.json"
  - "--certificatesresolvers.le.acme.httpchallenge.entrypoint=web"
  # - "--certificatesresolvers.le.acme.dnschallenge.provider=your-dns-provider" # 需要特定于 Provider 的配置

# 启用 ACME 数据(证书、账户)的持久性以确保在 Pod 重启后仍然存在:
persistence:
  enabled: true
  name: data
  size: 1Gi
  storageClass: ""

这会启用一个名为 le 的证书解析器,配置必需的电子邮件和存储文件,并设置 HTTP challenge(需要 80 端口的访问权限)。有关完整详细信息(包括 DNS challenge 配置),请参阅 HTTPS/TLS 文档Let's Encrypt 文档

生产环境中的 Let's Encrypt

Let's Encrypt 只能为指向公共 IP 地址(80 端口(HTTP-01)或通过 DNS provider 的 API(DNS-01)可访问)的主机名颁发证书。将 *.docker.localhost 示例替换为你控制的真实域名,创建 DNS 记录,并保持 80/443 端口对集群开放,以便验证能够成功。

Gateway API & ACME

Traefik 内置的 ACME/Let's Encrypt 集成适用于 IngressRoute 和 Ingress 资源,但不会为 Gateway API 监听器颁发证书。如果你正在使用 Gateway API,请安装 cert-manager(或其他证书控制器),并在 gateway.listeners.websecure.certificateRefs 中引用其创建的 Secret。

指标(Prometheus)

Traefik 可以以 Prometheus 格式暴露详细的指标,对于监控其性能和处理的流量至关重要。

values.yaml 添加示例:

yaml
# 启用指标端点
metrics:
  prometheus:
    # 指标可用的入口点(通常为 internal/admin)
    entryPoint: metrics
    # 添加标准 Prometheus 指标
    addRoutersLabels: true
    addServicesLabels: true
    # ... 还有其他可用选项

这会在专用 metrics 入口点(9100 端口)上启用 Prometheus 端点。有关配置详细信息和可用指标,请参阅指标文档

链路追踪(OTel)

分布式追踪有助于了解请求延迟和通过系统的流量,包括 Traefik 本身。

values.yaml 添加示例:

yaml
additionalArguments:
  - "--tracing.otel=true"
  - "--tracing.otel.grpcendpoint=otel-collector.observability:4317" # 根据需要调整端点
  - "--tracing.otel.httpendpoint=otel-collector.observability:4318" # 根据需要调整端点

这会启用 OTel 追踪并指定收集器端点。有关 OTel 追踪的详细信息,请参阅链路追踪文档

结论

此设置建立了具有安全仪表盘访问和 HTTPS 重定向的 Traefik,并提供了启用可观测性和 TLS 的指引。


在生产环境使用 Traefik OSS?

如果你在工作中使用 Traefik,可以考虑为其添加企业级 API 网关能力或获取 Traefik OSS 的商业支持。

基于 MIT 协议发布