使用 Helm 在 Kubernetes 上安装 Traefik

🔔 注意: 本文通过 Google 的 AI 模型 Gemini 翻译自原文,并根据技术内容进行了整理。

原始来源: Traefik 官方文档 (Kubernetes Setup) https://doc.traefik.io/traefik/setup/kubernetes/

本指南提供了使用官方 Helm Chart 在 Kubernetes 集群中安装和配置 Traefik Proxy 的深入指导。本指南涵盖以下内容:

  • 配置标准 HTTP (web) 和 HTTPS (websecure) 入口点
  • 实现从 HTTP 到 HTTPS 的自动重定向
  • 使用基本认证保护 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 CoreDNS is running at Metrics-server is running at

要进一步调试和诊断集群问题,请使用 kubectl cluster-info dump。


添加 Chart 仓库和命名空间

Helm 简化了 Kubernetes 应用程序的部署。Helm 将应用程序打包为“Chart”,这是一组描述 Kubernetes 资源的模板文件。我们将使用官方 Traefik Helm Chart 以便于管理和自定义。

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

第一个命令注册一个指向官方 Chart 位置的 traefik 仓库别名。第二个命令刷新本地缓存,确保所有配置的仓库中的最新 Chart 列表和版本都可用。


生成本地自签名 TLS Secret

每当 Traefik 的网关监听器使用 HTTPS 协议时,都需要证书。对于本地开发,我们将生成一个一次性自签名证书,并将其存储在名为 local-selfsigned-tls 的 Kubernetes Secret 中。网关将引用此 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

为什么需要此操作 网关的 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)

创建一个包含以下内容的 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 提供程序并禁用 KubernetesIngress 提供程序
# 提供程序告诉 Traefik 在何处查找路由配置。
providers:
  kubernetesIngress:
    enabled: false
  kubernetesGateway:
    enabled: true

## 게이트웨이 리스너
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 客户端应用配置。

# 在 'traefik' 命名空间中安装 Chart
helm install traefik traefik/traefik 
  --namespace traefik 
  --values values.yaml

命令说明:

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

访问控制面板

Traefik 部署完成后,您可以通过 访问控制面板。当您访问此链接时,浏览器将提示您输入用户名和密码。使用您在 values.yaml 文件中设置的凭据登录。成功登录后,将显示控制面板。


部署演示应用程序

为了测试设置,我们将 Traefik whoami 应用程序部署到您的 Kubernetes 集群。创建一个 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 提供程序时 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 部分,您将看到 路由已创建。

您可以使用 curl 测试应用程序:

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

您也可以在浏览器中访问 以查看服务的 JSON 转储。


其他主要配置区域

虽然上述设置提供了安全的基础,但 Traefik 提供了更多功能。以下是使用 Helm values.yaml 覆盖的一些基本配置的摘要:

TLS 证书管理 (Let’s Encrypt)

websecure 入口点默认启用 TLS,但目前没有有效的证书。Traefik 可以使用 ACME 协议自动从 Let’s Encrypt 获取和续订 TLS 证书。

values.yaml 添加示例:

additionalArguments:
  - "--certificatesresolvers.le.acme.email=your-email@example.com"
  - "--certificatesresolvers.le.acme.storage=/data/acme.json"
  - "--certificatesresolvers.le.acme.httpchallenge.entrypoint=web"

persistence:
  enabled: true
  name: data
  size: 1Gi
  storageClass: ""

####

生产环境中的 Let’s Encrypt

Let’s Encrypt 只能为指向可通过端口 80 (HTTP-01) 或 DNS 提供商 API (DNS-01) 访问的公共 IP 地址的主机名颁发证书。将 *.docker.localhost 示例替换为您实际拥有的域名并创建 DNS 记录。

Gateway API 和 ACME

Traefik 内置的 ACME 集成适用于 IngressRoute 和 Ingress 资源,但不为 Gateway API 监听器颁发证书。如果您使用 Gateway API,请安装 cert-manager 并在 gateway.listeners.websecure.certificateRefs 中引用生成的 Secret。

####

指标 (Prometheus)

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

values.yaml 添加示例:

metrics:
  prometheus:
    entryPoint: metrics
    addRoutersLabels: true
    addServicesLabels: true

####

追踪 (OTel)

分布式追踪有助于理解请求通过系统(包括 Traefik 本身)的延迟和流程。

values.yaml 添加示例:

additionalArguments:
  - "--tracing.otel=true"
  - "--tracing.otel.grpcendpoint=otel-collector.observability:4317"

###

结论

通过此配置,Traefik 已设置完毕,具备安全的控制面板访问、HTTPS 重定向,并为可观测性和 TLS 启用奠定了基础。


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注