Skip to content

Kubernetes 与 Traefik 快速开始

Kubernetes 与 Traefik 入门

Kubernetes 是 Traefik 的一等公民,原生支持 Kubernetes 资源以及最新的 Kubernetes 标准。

无论你使用 Traefik 的 IngressRoute CRDIngress 还是 Kubernetes Gateway API,Traefik 都能为管理你的 Kubernetes 流量提供无缝衔接的体验。

本指南将展示如何:

  • 使用 k3d 创建一个 Kubernetes 集群
  • 使用 Helm 安装 Traefik
  • 暴露 Traefik 仪表盘
  • 部署一个示例应用
  • 使用 IngressRoute 和 Gateway API 配置基础路由

前置条件

  • Kubernetes
  • Helm 3
  • kubectl
  • k3d(用于本地创建集群)

创建 Kubernetes 集群

使用 k3d

使用以下命令创建一个集群。该命令:

  • 创建一个名为 "traefik" 的 k3d 集群
  • 将 80、443、8000 端口映射到 loadbalancer,用于访问服务
  • 禁用内建的 Traefik ingress controller 以避免冲突
bash
k3d cluster create traefik \
  --port 80:80@loadbalancer \
  --port 443:443@loadbalancer \
  --port 8000:8000@loadbalancer \
  --k3s-arg "--disable=traefik@server:0"

配置 kubectl:

bash
kubectl cluster-info --context k3d-traefik

安装 Traefik

使用 Helm values 文件

添加 Traefik Helm 仓库:

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

创建一个 values 文件。该配置:

yaml
# values.yaml
ingressRoute:
  dashboard:
    enabled: true
    matchRule: Host(`dashboard.localhost`)
    entryPoints:
      - web
providers:
  kubernetesGateway:
    enabled: true
gateway:
  listeners:
    web:
      namespacePolicy:
        from: All

ℹ️ 提示

使用 Helm chart 时,KubernetesCRD Provider 是默认启用的,因此我们无需在 values 文件中显式设置。

安装 Traefik:

bash
helm install traefik traefik/traefik -f values.yaml --wait

使用 Helm CLI 参数

你也可以使用 CLI 参数安装 Traefik。该命令:

  • 3000030001 端口映射到 web 与 websecure 入口点
  • 启用仪表盘,并配置特定主机名规则
  • 启用 Kubernetes Gateway API Provider
  • 允许 Gateway 暴露来自所有命名空间的 HTTPRoute
bash
helm install traefik traefik/traefik --wait \
  --set ingressRoute.dashboard.enabled=true \
  --set ingressRoute.dashboard.matchRule='Host(`dashboard.localhost`)' \
  --set ingressRoute.dashboard.entryPoints={web} \
  --set providers.kubernetesGateway.enabled=true \
  --set gateway.listeners.web.namespacePolicy.from=All

ℹ️ 提示

使用 Helm chart 时,KubernetesCRD Provider 是默认启用的,因此我们无需在 CLI 参数中显式设置。

当 Traefik 启用了 Gateway API Provider 安装时,它会自动创建一个名为 traefik 的默认 GatewayClass:

bash
kubectl describe GatewayClass traefik

暴露仪表盘

如安装时在 Helm values 中定义,仪表盘通过 Chart 提供的 IngressRoute 暴露。

访问地址:

http://dashboard.localhost/dashboard/

部署示例应用

创建一个 Deployment:

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

创建一个 Service:

yaml
# whoami-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: whoami
spec:
  ports:
    - port: 80
  selector:
    app: whoami

应用清单:

bash
kubectl apply -f whoami.yaml
kubectl apply -f whoami-service.yaml

使用 IngressRoute (CRD) 暴露应用

创建一个 IngressRoute:

yaml
# whoami-ingressroute.yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: whoami
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`whoami.localhost`)
      kind: Rule
      services:
        - name: whoami
          port: 80

应用清单:

bash
kubectl apply -f whoami-ingressroute.yaml

测试你的设置

使用以下 curl 命令验证应用是否已正确暴露:

bash
curl http://whoami.localhost

返回内容示例:

Hostname: whoami-76c9859cfc-6v8hh
IP: 127.0.0.1
IP: ::1
IP: 10.42.0.11
IP: fe80::20ad:eeff:fe44:a63
RemoteAddr: 10.42.0.9:38280
GET / HTTP/1.1
Host: whoami.localhost
User-Agent: curl/8.7.1
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 127.0.0.1
X-Forwarded-Host: whoami.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: traefik-598946cd7-zds59
X-Real-Ip: 127.0.0.1

你也可以在浏览器中访问 http://whoami.localhost 来验证应用是否已正确暴露:

使用 Gateway API 暴露应用

Traefik 支持 Kubernetes Gateway API 规范,它为 Kubernetes 中的 ingress 配置提供了一种更加标准化的方式。在我们之前安装 Traefik 时,已经启用了 Gateway API Provider。你可以在 Traefik 仪表盘的 Providers 部分验证这一点。

要使用 Gateway API:

在你的集群中安装 Gateway API CRD:

bash
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.5.1/standard-install.yaml

创建一个 HTTPRoute。该配置:

  • 创建一个名为 "whoami" 的 HTTPRoute
  • 把它附加到 Traefik 安装时创建的默认 Gateway 上
  • 为 "whoami-gatewayapi.localhost" 主机名配置路由
  • 将所有流量路由到 whoami 服务的 80 端口
yaml
# httproute.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: whoami
spec:
  parentRefs:
    - name: traefik-gateway
  hostnames:
    - "whoami-gatewayapi.localhost"
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - name: whoami
          port: 80

应用清单:

bash
kubectl apply -f httproute.yaml

测试你的设置

使用以下 curl 命令验证应用是否已正确暴露:

bash
curl http://whoami-gatewayapi.localhost

返回示例:

Hostname: whoami-76c9859cfc-6v8hh
IP: 127.0.0.1
IP: ::1
IP: 10.42.0.11
IP: fe80::20ad:eeff:fe44:a63
RemoteAddr: 10.42.0.9:38280
GET / HTTP/1.1
Host: whoami.localhost
User-Agent: curl/8.7.1
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 127.0.0.1
X-Forwarded-Host: whoami.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: traefik-598946cd7-zds59
X-Real-Ip: 127.0.0.1

你可以在浏览器中访问 http://whoami.localhost 来验证应用是否已正确暴露:

如果你导航到 Traefik 仪表盘的 HTTP Routes 部分,你可以看到 whoami.localhost 路由由 Traefik Kubernetes Gateway API Provider 管理:

就这样!你已经成功部署了 Traefik 并在 Kubernetes 集群中配置好了路由。

下一步


在生产环境使用 Traefik OSS?

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

基于 MIT 协议发布