Kubernetes Ingress 路由配置
Traefik 与 Kubernetes 配合使用 Ingress
路由配置
Kubernetes Ingress provider 监听传入的 ingress 事件(如下例所示),并从中推导出相应的动态配置,进而创建出路由器、service、handler 等。
配置示例
Ingress
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 points。 | ep1,ep2 |
traefik.ingress.kubernetes.io/router.middlewares | 更多信息参见 middlewares overview。 | auth@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。默认值:PathPrefix | Path |
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 options。 | foobar@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 | 更多信息参见 ServersTransport。 | foobar@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。
traefik.ingress.kubernetes.io/service.middlewares: auth@file,prefix@kubernetescrdTLS
通过 Entrypoint 的 HTTP 选项启用 TLS
可以通过 Entrypoint 的 HTTP 选项 启用 TLS:
CLI
# 静态配置
--entryPoints.websecure.address=:443
--entryPoints.websecure.http.tlsFile (YAML)
# 静态配置
entryPoints:
websecure:
address: ':443'
http:
tls: {}File (TOML)
# 静态配置
[entryPoints.websecure]
address = ":443"
[entryPoints.websecure.http.tls]这样,附加到此 Entrypoint 的任何 Ingress 默认都将具有 TLS 终止。
使用 Entrypoint 上的 TLS 配置 Kubernetes Ingress Controller
RBAC
---
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: defaultIngress
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: 80Traefik
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: 443Whoami
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,应通过注解进行配置:
traefik.ingress.kubernetes.io/router.tls: "true"有关更多选项,请参阅可用的注解。
使用 TLS 配置 Kubernetes Ingress Controller
Ingress
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
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: supersecretSecret
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 通信:
- 如果 ingress 规范中定义的 service 端口是
443(请注意,你仍然可以使用targetPort在 pod 上使用不同的端口)。 - 如果 ingress 规范中定义的 service 端口的名称以
https开头(例如https-api、https-web或仅https)。 - 如果 service 规范包含注解
traefik.ingress.kubernetes.io/service.serversscheme: https。
如果存在这些配置选项之一,则假定后端通信协议是 TLS,并将通过 TLS 自动连接。
信息
请注意,通过启用 traefik 与 pod 之间的 TLS 通信,你必须拥有具有正确信任链和 IP 主题名称的可信证书。如果无法做到这一点,你可能需要跳过 TLS 证书验证。有关更多详细信息,请参阅 insecureSkipVerify TLSOption 设置。
全局默认后端 Ingress
可以创建如下所示的 Ingress:
Ingress
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 网关功能既快速又无缝。无需进行替换,所有配置都保持不变。可以通过这个短视频查看实际效果。