Skip to content

基础教程

在 Kubernetes 上使用 Traefik 暴露服务 — 基础

本指南将帮助你开始使用 Traefik 代理在 Kubernetes 上暴露服务。你将学习 HTTP 流量路由的基础知识、设置基于路径的路由,以及使用 TLS 保护你的服务。

对于路由,本指南为你提供了两个选项:

请随意选择最适合你需求的那个。

前置条件

暴露你的第一个 HTTP 服务

让我们使用 whoami 应用程序暴露一个简单的 HTTP 服务。这将演示到后端服务的基本路由。

首先,创建 Deployment 和 Service:

yaml
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 并应用:

bash
kubectl apply -f whoami.yaml

现在,让我们使用 Gateway API 或 IngressRoute 创建路由。

使用 Gateway API

yaml
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 并应用:

bash
kubectl apply -f whoami-route.yaml

使用 IngressRoute

yaml
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 并应用:

bash
kubectl apply -f whoami-ingressroute.yaml

验证你的服务

你的服务现在可以在 http://whoami.docker.localhost/ 访问。测试它是否工作:

bash
curl -H "Host: whoami.docker.localhost" http://localhost/

提示

如果你按照 Kubernetes 设置指南安装了 Traefik,请确保从 values.yaml 文件中删除 ports.web.redirections 块,否则你将被重定向到 HTTPS 入口点:

yaml
redirections:
  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:

yaml
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 并应用:

bash
kubectl apply -f whoami-api.yaml

现在设置基于路径的路由:

Gateway API 与路径规则

更新你现有的 HTTPRoute 以包含基于路径的路由:

yaml
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 文件并应用:

bash
kubectl apply -f whoami-route.yaml

IngressRoute 与路径规则

更新你现有的 IngressRoute 以包含基于路径的路由:

yaml
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 并应用:

bash
kubectl apply -f whoami-ingressroute.yaml

测试基于路径的路由

验证不同路径是否路由到不同服务:

bash
# 根路径应转到主 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 来保护我们的服务。我们将从本地开发的自签名证书开始。

创建自签名证书

生成自签名证书:

bash
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout tls.key -out tls.crt \
  -subj "/CN=whoami.docker.localhost"

在 Kubernetes 中创建 TLS Secret:

bash
kubectl create secret tls whoami-tls --cert=tls.crt --key=tls.key

使用 Gateway API 和 TLS 的前置条件

在将 Gateway API 与 TLS 一起使用之前,你必须在 Traefik 安装中定义 websecure 监听器。这通常在你的 Helm values 中完成。

values.yaml 中的示例配置:

yaml
gateway:
  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 监听器:

yaml
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 文件并应用:

bash
kubectl apply -f whoami-route.yaml

IngressRoute 与 TLS

更新你现有的 IngressRoute 以使用 TLS:

yaml
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 文件并应用:

bash
kubectl apply -f whoami-ingressroute.yaml

验证 HTTPS 访问

现在你可以安全地访问你的服务。由于我们使用的是自签名证书,你需要跳过证书验证:

bash
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 为基于身份验证的路由设置多层路由

基于 MIT 协议发布