🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # traefik流量匹配 部署完后启动 Traefik 时,定义了入口点(端口号和对应的端口名称),然后 Kubernetes 集群外部就可以通过访问 Traefik 服务器地址和配置的入口点对 Traefik 服务进行访问,在访问时一般会带上 “域名” + “入口点端口”,然后 Traefik 会根据域名和入口点端口在 Traefik 路由规则表中进行匹配,如果匹配成功,先进入中间件(middlewares)修饰请求,该过程可以包含多个中间件。最后将请求发送到 Kubernetes 内部应用中与外界进行交互。这里面的域名与入口点与对应后台服务关联的规则,即是 Traefik 路由规则。   Traefik 创建路由规则有多种方式: - 原生 Ingress 写法,cert-manager可以自动自签证书。 - 使用 CRD IngressRoute 方式 (推荐) - 使用 GatewayAPI 的方式 这里只演示 `CRD IngressRoute` 方式创建路由规则 # traefik路由 traefik路由分为 `entryPoints` 、 `match` 、 `services` 、 `middlewares` 、 `tls` 配置项组成。前三项是必填项,后面两项是可选项。 ## entryPoints 参数说明:  EntryPoints定义要绑定到的入口点名称列表,必须在静态配置(启动配置文件)中配置入口点。 参数配置:  在 `ingressroute.spec` 下的 entryPoints 配置项 IngressRoute 资源文件示例 ```yaml spec: entryPoints: - web ``` ## routes ### match 参数说明:  流量进去traefik入口点后,根据match条件来判断是否匹配成功。否则转发到404页面。 参数配置:  在 `ingressroute.spec.routes` 下的 `kind 和 match` 配置项 IngressRoute 资源文件示例 ```yaml spec: entryPoints: - web routes: - kind: Rule match: Host(`nginx.ecloud.com`) ``` 下表列出了所有可用的匹配器 | 规则 | 描述 | | - | - | | Headers(`key`, `value`) | 检查headers中是否有一个键为key值为value的键值对 | | HeadersRegexp(`key`, `regexp`) | 检查headers中是否有一个键位key值为正则表达式匹配的键值对 | | Host(`example.com`, ...) | 检查请求的域名是否包含在特定的域名中 | | HostHeader(`example.com`, ...) | 和Host一样,只是因为历史原因而存在 | | HostRegexp(`example.com`, `{subdomain:[a-z]+}.example.com`, ...) | 检查请求的域名是否包含在特定的正则表达式域名中 | | Method(`GET`, ...) | 检查请求方法是否为给定的methods(GET、POST、PUT、DELETE、PATCH)中 | | Path(`/path`, `/articles/{cat:[a-z]+}/{id:[0-9]+}`, ...) | 匹配特定的请求路径,它接受一系列文字和正则表达式路径 | | PathPrefix(`/products/`, `/articles/{cat:[a-z]+}/{id:[0-9]+}`) | 匹配特定的前缀路径,它接受一系列文字和正则表达式前缀路径 | | Query(`foo=bar`, `bar=baz`) | 匹配查询字符串参数,接受key=value的键值对 | | ClientIP(`10.0.0.0/16`, `::1`) | 如果请求客户端 IP 是给定的 IP/CIDR 之一,则匹配。它接受 IPv4、IPv6 和网段格式 | >[info] 注意:可以使用通常的 AND(&&) 和 OR(||) 逻辑运算符,以及预期的优先级规则和括号。 ### services 参数说明:   match条件匹配成功后,将流量转发给 k8s 的 service 对应后端服务处理请求。 参数配置:  在 `ingressroute.spec.routes` 下的 `services` 配置项 IngressRoute 资源文件示例 ```yaml spec: entryPoints: - web routes: - kind: Rule match: Host(`nginx.ecloud.com`) services: - kind: Service name: nginx port: 80 ``` >[info] kind默认是 `Service`, 可选 `Service` 和 `TraefikService` ### middlewares >[info] 请求被匹配成功后,流量进入k8s之前,请求会先经过middlewares处理后。流量再进入 services 服务。 参数说明:  将 match 匹配成功后,对请求做处理动作。例如修改路径、添加认证等操作。 参数配置:  在 `ingressroute.spec.routes` 下的 `middlewares` 配置项 IngressRoute 资源文件示例 ```yaml spec: entryPoints: - web routes: - match: Host(`nginx.ecloud.com`) kind: Rule services: - name: nginx port: 80 middlewares: - name: auth namespace: default ``` ## tls 参数说明:  定义该路由是https协议的。注意搭配使用的entryPoints也是https协议。 参数配置:  在 `ingressroute.spec` 下的 `tls` 配置项 证书生成有三种方式 - 手工生成证书,请参考以下命令 ```shell openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginx.ecloud.com" kubectl create secret tls myapp-tls --cert=tls.crt --key=tls.key ``` - cert-manager自动生成自签证书。请使用 `Certificate Resources` 证书证书 - Let’s Encrypt。没有购买证书,这里没法演示 IngressRoute 资源文件示例 ```yaml spec: entryPoints: - webSecurity routes: - match: Host(`nginx.ecloud.com`) kind: Rule services: - name: nginx port: 80 middlewares: - name: auth namespace: default tls: secretName: myapp-tls ``` # 在线文档 kubernetes ingressRoute: https://doc.traefik.io/traefik/routing/providers/kubernetes-crd/ kubernetes ingress:https://doc.traefik.io/traefik/routing/providers/kubernetes-ingress/