Kubernetes 与 Traefik 快速开始
Kubernetes 与 Traefik 入门
Kubernetes 是 Traefik 的一等公民,原生支持 Kubernetes 资源以及最新的 Kubernetes 标准。
无论你使用 Traefik 的 IngressRoute CRD、Ingress 还是 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 以避免冲突
k3d cluster create traefik \
--port 80:80@loadbalancer \
--port 443:443@loadbalancer \
--port 8000:8000@loadbalancer \
--k3s-arg "--disable=traefik@server:0"配置 kubectl:
kubectl cluster-info --context k3d-traefik安装 Traefik
使用 Helm values 文件
添加 Traefik Helm 仓库:
helm repo add traefik https://traefik.github.io/charts
helm repo update创建一个 values 文件。该配置:
- 将 80 与 443 端口映射到 web 与 websecure 入口点
- 启用仪表盘,并配置特定的主机名规则
- 启用 Kubernetes Gateway API Provider
- 允许 Gateway 暴露来自所有命名空间的 HTTPRoute
# 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:
helm install traefik traefik/traefik -f values.yaml --wait使用 Helm CLI 参数
你也可以使用 CLI 参数安装 Traefik。该命令:
- 将
30000与30001端口映射到 web 与 websecure 入口点 - 启用仪表盘,并配置特定主机名规则
- 启用 Kubernetes Gateway API Provider
- 允许 Gateway 暴露来自所有命名空间的 HTTPRoute
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:
kubectl describe GatewayClass traefik暴露仪表盘
如安装时在 Helm values 中定义,仪表盘通过 Chart 提供的 IngressRoute 暴露。
访问地址:
http://dashboard.localhost/dashboard/
部署示例应用
创建一个 Deployment:
# 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:
# whoami-service.yaml
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
ports:
- port: 80
selector:
app: whoami应用清单:
kubectl apply -f whoami.yaml
kubectl apply -f whoami-service.yaml使用 IngressRoute (CRD) 暴露应用
创建一个 IngressRoute:
# 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应用清单:
kubectl apply -f whoami-ingressroute.yaml测试你的设置
使用以下 curl 命令验证应用是否已正确暴露:
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:
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 端口
# 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应用清单:
kubectl apply -f httproute.yaml测试你的设置
使用以下 curl 命令验证应用是否已正确暴露:
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 的商业支持。