基础教程
在 Kubernetes 上使用 Traefik 暴露服务 — 基础¶
本指南将帮助你开始使用 Traefik 代理在 Kubernetes 上暴露服务。你将学习 HTTP 流量路由的基础知识、设置基于路径的路由,以及使用 TLS 保护你的服务。
对于路由,本指南为你提供了两个选项:
请随意选择最适合你需求的那个。
前置条件
- 已安装 Traefik 代理的 Kubernetes 集群
kubectl配置为与你的集群交互- 已使用 Traefik Kubernetes 设置指南 部署 Traefik
暴露你的第一个 HTTP 服务
让我们使用 whoami 应用程序暴露一个简单的 HTTP 服务。这将演示到后端服务的基本路由。
首先,创建 Deployment 和 Service:
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami
namespace: default
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: default
spec:
selector:
app: whoami
ports:
- port: 80将其保存为 whoami.yaml 并应用:
kubectl apply -f whoami.yaml现在,让我们使用 Gateway API 或 IngressRoute 创建路由。
使用 Gateway API
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: whoami
namespace: default
spec:
parentRefs:
- name: traefik-gateway # 此 Gateway 由 Traefik 自动创建
hostnames:
- "whoami.docker.localhost"
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: whoami
port: 80将其保存为 whoami-route.yaml 并应用:
kubectl apply -f whoami-route.yaml使用 IngressRoute
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: whoami
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`whoami.docker.localhost`)
kind: Rule
services:
- name: whoami
port: 80将其保存为 whoami-ingressroute.yaml 并应用:
kubectl apply -f whoami-ingressroute.yaml验证你的服务
你的服务现在可以在 http://whoami.docker.localhost/ 访问。测试它是否工作:
curl -H "Host: whoami.docker.localhost" http://localhost/提示
如果你按照 Kubernetes 设置指南安装了 Traefik,请确保从
values.yaml文件中删除ports.web.redirections块,否则你将被重定向到 HTTPS 入口点:yamlredirections: entryPoint: to: websecure
你应该看到类似下面的输出:
Hostname: whoami-6d5d964cb-8pv4k
IP: 127.0.0.1
IP: ::1
IP: 10.42.0.18
IP: fe80::d4c0:3bff:fe20:b0a3
RemoteAddr: 10.42.0.17:39872
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/7.68.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.42.0.1
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: traefik-76cbd5b89c-rx5xn
X-Real-Ip: 10.42.0.1这确认了 Traefik 正在成功地将请求路由到你的 whoami 应用程序。
添加路由规则
现在,我们将通过基于 URL 路径将流量定向到不同的服务来增强我们的路由。这对于 API 版本控制、前端/后端分离或组织微服务很有用。
首先,部署第二个服务来表示一个 API:
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami-api
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: whoami-api
template:
metadata:
labels:
app: whoami-api
spec:
containers:
- name: whoami
image: traefik/whoami
env:
- name: WHOAMI_NAME
value: "API Service"
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: whoami-api
namespace: default
spec:
selector:
app: whoami-api
ports:
- port: 80将其保存为 whoami-api.yaml 并应用:
kubectl apply -f whoami-api.yaml现在设置基于路径的路由:
Gateway API 与路径规则
更新你现有的 HTTPRoute 以包含基于路径的路由:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: whoami
namespace: default
spec:
parentRefs:
- name: traefik-gateway
hostnames:
- "whoami.docker.localhost"
rules:
- matches:
- path:
type: PathPrefix
value: /api
backendRefs:
- name: whoami-api
port: 80
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: whoami
port: 80更新 whoami-route.yaml 文件并应用:
kubectl apply -f whoami-route.yamlIngressRoute 与路径规则
更新你现有的 IngressRoute 以包含基于路径的路由:
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: whoami
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`whoami.docker.localhost`) && Path(`/api`)
kind: Rule
services:
- name: whoami-api
port: 80
- match: Host(`whoami.docker.localhost`)
kind: Rule
services:
- name: whoami
port: 80将其保存为 whoami-ingressroute.yaml 并应用:
kubectl apply -f whoami-ingressroute.yaml测试基于路径的路由
验证不同路径是否路由到不同服务:
# 根路径应转到主 whoami 服务
curl -H "Host: whoami.docker.localhost" http://localhost/
# /api 路径应转到 whoami-api 服务
curl -H "Host: whoami.docker.localhost" http://localhost/api对于 /api 请求,你应该看到响应中的 "API Service",确认你的基于路径的路由正常工作。
启用 TLS
让我们通过添加 TLS 来保护我们的服务。我们将从本地开发的自签名证书开始。
创建自签名证书
生成自签名证书:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key -out tls.crt \
-subj "/CN=whoami.docker.localhost"在 Kubernetes 中创建 TLS Secret:
kubectl create secret tls whoami-tls --cert=tls.crt --key=tls.key使用 Gateway API 和 TLS 的前置条件
在将 Gateway API 与 TLS 一起使用之前,你必须在 Traefik 安装中定义
websecure监听器。这通常在你的 Helm values 中完成。
values.yaml中的示例配置:yamlgateway: listeners: web: port: 80 protocol: HTTP namespacePolicy: from: All websecure: port: 443 protocol: HTTPS namespacePolicy: from: All mode: Terminate certificateRefs: - kind: Secret name: local-selfsigned-tls group: ""有关完整的安装详细信息,请参阅 Traefik Kubernetes 设置指南。
Gateway API 与 TLS
更新你现有的 HTTPRoute 以使用受保护的 gateway 监听器:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: whoami
namespace: default
spec:
parentRefs:
- name: traefik-gateway
sectionName: websecure # HTTPS 监听器
hostnames:
- "whoami.docker.localhost"
rules:
- matches:
- path:
type: PathPrefix
value: /api
backendRefs:
- name: whoami-api
port: 80
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: whoami
port: 80更新 whoami-route.yaml 文件并应用:
kubectl apply -f whoami-route.yamlIngressRoute 与 TLS
更新你现有的 IngressRoute 以使用 TLS:
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: whoami
namespace: default
spec:
entryPoints:
- websecure # 从 'web' 改为 'websecure'
routes:
- match: Host(`whoami.docker.localhost`) && Path(`/api`)
kind: Rule
services:
- name: whoami-api
port: 80
- match: Host(`whoami.docker.localhost`)
kind: Rule
services:
- name: whoami
port: 80
tls:
secretName: whoami-tls # 添加 TLS 配置更新 whoami-ingressroute.yaml 文件并应用:
kubectl apply -f whoami-ingressroute.yaml验证 HTTPS 访问
现在你可以安全地访问你的服务。由于我们使用的是自签名证书,你需要跳过证书验证:
curl -k -H "Host: whoami.docker.localhost" https://localhost/你的浏览器也可以访问 https://whoami.docker.localhost/(你需要接受自签名证书的安全警告)。
下一步
现在你已经掌握了使用 Traefik 在 Kubernetes 上暴露服务的基础知识,你可以探索更高级的功能,如中间件、Let's Encrypt 证书、粘性会话和多层路由。
继续阅读高级指南 了解:
- 添加用于安全性和访问控制的中间件
- 使用 Let's Encrypt(IngressRoute)或 cert-manager(Gateway API)生成证书
- 为有状态应用程序配置粘性会话
- 使用 IngressRoute 为基于身份验证的路由设置多层路由