Skip to content

Kubernetes Ingress 路由配置

Traefik 与 Kubernetes 配合使用 Ingress

路由配置

Kubernetes Ingress provider 监听传入的 ingress 事件(如下例所示),并从中推导出相应的动态配置,进而创建出路由器、service、handler 等。

配置示例

Ingress

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myingress
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web

spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /bar
            pathType: Exact
            backend:
              service:
                name:  whoami
                port:
                  number: 80
          - path: /foo
            pathType: Exact
            backend:
              service:
                name:  whoami
                port:
                  number: 80

注解

在注解中引用资源

在注解中,当引用由另一个 provider 定义的资源时,必须使用 provider 命名空间语法

在 Ingress 上

注解描述
traefik.ingress.kubernetes.io/router.entrypoints更多信息参见 entry pointsep1,ep2
traefik.ingress.kubernetes.io/router.middlewares更多信息参见 middlewares overviewauth@file,default-prefix@kubernetescrd
traefik.ingress.kubernetes.io/router.priority更多信息参见 priority"42"
traefik.ingress.kubernetes.io/router.rulesyntax更多信息参见 rule syntax已弃用:RuleSyntax 选项已弃用,将在下一个主要版本中移除。请不要使用此字段,并将路由器规则重写为使用 v3 语法。"v2"
traefik.ingress.kubernetes.io/router.pathmatcher覆盖用于路径的默认路由器规则类型。应仅指定与路径相关的匹配器名称:Path、PathPrefix 或 PathRegexp。默认值:PathPrefixPath
traefik.ingress.kubernetes.io/router.tls为路由器启用 TLS。"true"
traefik.ingress.kubernetes.io/router.tls.certresolver指定用于 TLS 证书的证书解析器。myresolver
traefik.ingress.kubernetes.io/router.tls.domains.n.main定义 TLS 证书的主域名(n 是域名索引)。example.org
traefik.ingress.kubernetes.io/router.tls.domains.n.sans定义 TLS 证书的 Subject Alternative Names(SANs)(n 是域名索引)。test.example.org,dev.example.org
traefik.ingress.kubernetes.io/router.tls.options更多信息参见 TLS optionsfoobar@file
traefik.ingress.kubernetes.io/router.observability.accesslogs控制路由器是否生成访问日志。true
traefik.ingress.kubernetes.io/router.observability.metrics控制路由器是否生成指标。true
traefik.ingress.kubernetes.io/router.observability.tracing控制路由器是否生成链路追踪数据。true

在 Service 上

注解描述
traefik.ingress.kubernetes.io/service.nativelb控制创建负载均衡器时,LB 的子项是直接是 pod IP 还是仅是 Kubernetes Service clusterIP。Kubernetes Service 本身负责对 pod 进行负载均衡。请注意,默认情况下,Traefik 会重用与后端建立的连接以提升性能。当设置该选项时,这可能会阻止副本之间的请求负载均衡按预期工作。默认值:false"true"
traefik.ingress.kubernetes.io/service.nodeportlb控制创建负载均衡器时,当 service 类型为 NodePort 时,LB 的子项是否使用节点内部 IP 和 nodePort。它允许在 Traefik 在 Kubernetes 集群外部但在节点同一网络内运行时,service 仍可访问。默认值:false"true"
traefik.ingress.kubernetes.io/service.serversscheme覆盖默认协议。h2c
traefik.ingress.kubernetes.io/service.serverstransport更多信息参见 ServersTransportfoobar@file
traefik.ingress.kubernetes.io/service.passhostheader控制是否将 Host 头转发到后端。"true"
traefik.ingress.kubernetes.io/service.sticky.cookie使用 cookie 启用粘性会话。"true"
traefik.ingress.kubernetes.io/service.sticky.cookie.name定义粘性会话的 cookie 名称。foobar
traefik.ingress.kubernetes.io/service.sticky.cookie.secure在粘性会话 cookie 上设置 Secure 标志。"true"
traefik.ingress.kubernetes.io/service.sticky.cookie.samesite在粘性会话 cookie 上设置 SameSite 属性。"none"
traefik.ingress.kubernetes.io/service.sticky.cookie.domain在粘性会话 cookie 上设置 Domain 属性,定义 cookie 将发送到的主机。"foo.com"
traefik.ingress.kubernetes.io/service.sticky.cookie.httponly在粘性会话 cookie 上设置 HttpOnly 标志。"true"
traefik.ingress.kubernetes.io/service.sticky.cookie.maxage在粘性会话 cookie 上设置 Max-Age 属性(以秒为单位)。42
traefik.ingress.kubernetes.io/service.sticky.cookie.path在粘性会话 cookie 上设置 Path 属性,定义请求 URL 中必须存在的路径。/foobar

traefik.ingress.kubernetes.io/service.middlewares

有关更多信息,请参阅 service middlewares

yaml
traefik.ingress.kubernetes.io/service.middlewares: auth@file,prefix@kubernetescrd

TLS

通过 Entrypoint 的 HTTP 选项启用 TLS

可以通过 Entrypoint 的 HTTP 选项 启用 TLS:

CLI

bash
# 静态配置
--entryPoints.websecure.address=:443
--entryPoints.websecure.http.tls

File (YAML)

yaml
# 静态配置
entryPoints:
  websecure:
    address: ':443'
    http:
      tls: {}

File (TOML)

toml
# 静态配置
[entryPoints.websecure]
  address = ":443"

    [entryPoints.websecure.http.tls]

这样,附加到此 Entrypoint 的任何 Ingress 默认都将具有 TLS 终止。

使用 Entrypoint 上的 TLS 配置 Kubernetes Ingress Controller

RBAC

yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: traefik-ingress-controller
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - discovery.k8s.io
    resources:
      - endpointslices
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
      - networking.k8s.io
    resources:
      - ingresses
      - ingressclasses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
      - networking.k8s.io
    resources:
      - ingresses/status
    verbs:
      - update

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: traefik-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
  - kind: ServiceAccount
    name: traefik-ingress-controller
    namespace: default

Ingress

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myingress
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: websecure

spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /bar
            pathType: Exact
            backend:
              service:
                name:  whoami
                port:
                  number: 80
          - path: /foo
            pathType: Exact
            backend:
              service:
                name:  whoami
                port:
                  number: 80

Traefik

yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: traefik
  labels:
    app: traefik

spec:
  replicas: 1
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      labels:
        app: traefik
    spec:
      serviceAccountName: traefik-ingress-controller
      containers:
        - name: traefik
          image: traefik:v3.7
          args:
            - --entryPoints.websecure.address=:443
            - --entryPoints.websecure.http.tls
            - --providers.kubernetesingress
          ports:
            - name: websecure
              containerPort: 443

---
apiVersion: v1
kind: Service
metadata:
  name: traefik
spec:
  type: LoadBalancer
  selector:
    app: traefik
  ports:
    - protocol: TCP
      port: 443
      name: websecure
      targetPort: 443

Whoami

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
  labels:
    app: traefiklabs
    name: whoami

spec:
  replicas: 2
  selector:
    matchLabels:
      app: traefiklabs
      task: whoami
  template:
    metadata:
      labels:
        app: traefiklabs
        task: whoami
    spec:
      containers:
        - name: whoami
          image: traefik/whoami
          ports:
            - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: whoami

spec:
  ports:
    - name: http
      port: 80
  selector:
    app: traefiklabs
    task: whoami

通过注解启用 TLS

要启用从 Ingress 创建的底层路由器上的 TLS,应通过注解进行配置:

yaml
traefik.ingress.kubernetes.io/router.tls: "true"

有关更多选项,请参阅可用的注解

使用 TLS 配置 Kubernetes Ingress Controller

Ingress

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myingress
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
    traefik.ingress.kubernetes.io/router.tls: "true"

spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /bar
            pathType: Exact
            backend:
              service:
                name:  whoami
                port:
                  number: 80
          - path: /foo
            pathType: Exact
            backend:
              service:
                name:  whoami
                port:
                  number: 80

证书管理

使用 Secret

Ingress

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: foo
  namespace: production

spec:
  rules:
  - host: example.net
    http:
      paths:
      - path: /bar
        pathType: Exact
        backend:
          service:
            name:  service1
            port:
              number: 80
  # 仅选择应从 secret 加载哪些证书以终止 TLS。
  # 不会为该 ingress 启用 TLS(因此也不会为底层路由器启用 TLS)。
  # 请参阅 Ingress 上的 TLS 注解以达到此目的。
  tls:
  - secretName: supersecret

Secret

yaml
apiVersion: v1
kind: Secret
metadata:
  name: supersecret

data:
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
  tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=

TLS 证书可以在 Secret 对象中进行管理。

信息

只有用户提供的 TLS 证书可以存储在 Kubernetes Secrets 中。 Let's Encrypt 证书目前还不能在 Kubernetes Secrets 中管理。

Traefik 与 Pod 之间的通信

直接路由到 Kubernetes services

要直接路由到 Kubernetes service,可以在 Kubernetes service 上使用 traefik.ingress.kubernetes.io/service.nativelb 注解。它控制创建负载均衡器时,LB 的子项是直接是 pod IP 还是仅是 Kubernetes Service clusterIP。

另一种方法是使用 ExternalName service 通过 DNS 将请求转发到 Kubernetes service。为此,必须允许外部名称 service。

Traefik 根据 ingress 规范中提供的 service 自动请求端点信息。尽管 Traefik 将直接连接到端点(pod),但它仍会检查 service 端口以查看是否需要 TLS 通信。

有 3 种方式可以配置 Traefik 使用 HTTPS 与 pod 通信:

  1. 如果 ingress 规范中定义的 service 端口是 443(请注意,你仍然可以使用 targetPort 在 pod 上使用不同的端口)。
  2. 如果 ingress 规范中定义的 service 端口的名称以 https 开头(例如 https-apihttps-web 或仅 https)。
  3. 如果 service 规范包含注解 traefik.ingress.kubernetes.io/service.serversscheme: https

如果存在这些配置选项之一,则假定后端通信协议是 TLS,并将通过 TLS 自动连接。

信息

请注意,通过启用 traefik 与 pod 之间的 TLS 通信,你必须拥有具有正确信任链和 IP 主题名称的可信证书。如果无法做到这一点,你可能需要跳过 TLS 证书验证。有关更多详细信息,请参阅 insecureSkipVerify TLSOption 设置。

全局默认后端 Ingress

可以创建如下所示的 Ingress:

Ingress

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: cheese

spec:
  defaultBackend:
    service:
      name: stilton
      port:
        number: 80

此 ingress 遵循 ingress 的全局默认后端属性。这将允许用户创建一个"默认路由器",它将匹配所有未匹配的请求。

信息

由于 Traefik 使用优先级,你可能需要将此 ingress 优先级设置为低于环境中其他 ingress,以避免此全局 ingress 满足可能与其他 ingress 匹配的请求。

为此,请在 ingress 上使用 traefik.ingress.kubernetes.io/router.priority 注解(如在 Ingress 上的注解中所述)。


在生产环境使用 Traefik OSS?

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

向 Traefik OSS 添加 API 网关功能既快速又无缝。无需进行替换,所有配置都保持不变。可以通过这个短视频查看实际效果。

基于 MIT 协议发布