在 Kubernetes 上部署 Traefik
Kubernetes
本指南提供了使用官方 Helm chart 在 Kubernetes 集群中安装和配置 Traefik 代理的详尽步骤。在本指南中,我们将涵盖以下内容:
- 配置标准 HTTP(
web)和 HTTPS(websecure)入口点 - 实现从 HTTP 到 HTTPS 的自动重定向
- 使用 Basic 认证保护 Traefik 仪表盘
- 部署一个演示应用来测试设置
- 探索其他关键配置选项
前置条件
- 一个 Kubernetes 集群
- Helm v3
- Kubectl
创建集群
如果你还没有 Kubernetes 集群,可以使用 K3d 创建一个:
k3d cluster create traefik \
--port 80:80@loadbalancer \
--port 443:443@loadbalancer \
--port 8000:8000@loadbalancer \
--k3s-arg "--disable=traefik@server:0"80 和 443 端口从主机到达 Traefik,8000 端口留作后续演示。k3s 自带的 Traefik 被禁用以避免冲突。
检查上下文:
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 来进行托管式和可定制的安装。
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。
# 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 文件,内容如下:
# 配置网络端口和入口点
# 入口点是传入流量的网络监听器
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 客户端应用配置。
# 将 chart 安装到 'traefik' 命名空间
helm install traefik traefik/traefik \
--namespace traefik \
--values values.yaml命令分解:
helm install traefik:指示 Helm 安装一个名为traefik的新 release。traefik/traefik:指定要使用的 chart(来自先前添加的traefik仓库的traefikchart)。--namespace traefik:指定要安装到的 Kubernetes 命名空间。建议使用专用命名空间。--values values.yaml:应用values.yaml文件中的自定义配置。
访问仪表盘
现在 Traefik 已部署,你可以通过 https://dashboard.docker.localhost/ 访问其仪表盘。当你访问此链接时,浏览器将提示你输入用户名和密码。确保使用在 values.yaml 文件中设置的凭证登录。成功登录后,仪表盘将如下所示:
部署演示应用
要测试设置,请在 Kubernetes 集群中部署 Traefik whoami 应用。创建一个名为 whoami.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应用清单:
kubectl apply -f whoami.yaml部署应用后,你可以通过创建 Gateway API HTTPRoute 来暴露该应用。为此,创建一个名为 whoami-route.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应用清单:
kubectl apply -f whoami-route.yaml应用清单后,导航到 Traefik 仪表盘中的 Routes;你将看到 https://whoami.docker.localhost 路由已创建。
你可以使用 curl 测试该应用:
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 添加示例:
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 添加示例:
# 启用指标端点
metrics:
prometheus:
# 指标可用的入口点(通常为 internal/admin)
entryPoint: metrics
# 添加标准 Prometheus 指标
addRoutersLabels: true
addServicesLabels: true
# ... 还有其他可用选项这会在专用 metrics 入口点(9100 端口)上启用 Prometheus 端点。有关配置详细信息和可用指标,请参阅指标文档。
链路追踪(OTel)
分布式追踪有助于了解请求延迟和通过系统的流量,包括 Traefik 本身。
values.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 的商业支持。