Hello folks,我是 Luga,今天我们来聊一下云原生网关 Traefik 核心技术之一-Traefik CRD。
随着容器编排不断获得关注,Kubernetes 已成为开发人员和 DevOps 工程师的标准:他们现在习惯于声明其系统的所需状态,而不是在全球范围内手动部署软件。
但是,如何宣告这一理想状态呢?如果 Kubernetes 没有完全捕捉到我们所设计的用例的微妙之处,而我们需要比它所知道的更具描述性,该怎么办?
或许,我们可以这篇文章中找到答案~
— 01—
Traefik CRD 历史背景
虽然 Kubernetes 提供了内置的 API 对象和资源,但可以使用自定义资源定义 (CRD) 将 Kubernetes API 扩展到我们自己喜欢的任何对象。这使我们能够可以捕捉用例的微妙之处,并利用 Kubernetes 提供的灵活性。
Traefik CRD(Custom Resource Definition)是在 Traefik 1.6 版本中引入的,Traefik 于 2018 年 5 月发布。在引入 CRD 之前,Traefik 依赖于 Kubernetes Ingress 对象来配置路由和负载均衡。 虽然 Ingress 对象提供了基本级别的功能,但它们有一些限制,使它们不适合更复杂的用例。
Ingress 对象的主要限制之一是它们不支持高级路由功能,例如流量拆分、金丝雀发布和蓝绿部署。 此外,Ingress 对象要求用户以特定格式定义他们的路由规则,这对于具有多个服务的大型部署来说可能难以管理。
为了解决这些限制,Traefik 引入了自己的自定义资源类型,例如中间件、ingressroutes 和 ingressroutetcps,可用于配置更高级的路由和负载均衡功能。 这些自定义资源是使用 Kubernetes CRD 定义的,提供了一种使用自定义资源扩展 Kubernetes API 的方法。
随着 CRD 的引入,Traefik 变得更加灵活和可定制,允许用户定义自己的自定义路由规则和其他特定于其应用程序环境的配置。 这使得 Traefik 成为管理 Kubernetes 上复杂微服务架构的更强大的工具。 自推出以来,Traefik 不断改进和扩展对 CRD 的支持,使其成为管理 Kubernetes 集群的越来越受欢迎的选择。
— 02—
Traefik CRD ,一个更佳的选择
通常情况下,在实际的业务场景中,Kubernetes 不仅具有内置对象,它还允许我们定义自己的对象,从而扩展其描述功能,这便是 CRD(自定义资源定义)发挥作用的地方。Traefik 也不例外。
Traefik Kubernetes CRD(自定义资源定义)是一个强大的工具,它克服了 Ingress 规范的限制,并允许在提供清晰结构的基础上提供更多选项,例如:
1、IngressRoute:这是 Ingress 对象的扩展等价物,增加了对各种选项的支持,例如负载平衡算法。
2、中间件:中间件是一个概念,我们可以混合和匹配路由以外的所有内容,无论是访问控制、标头更新、断路器、路径操作、错误控制、重定向等等。
3、TraefikService:为 HTTP 负载平衡和镜像提供抽象。它允许我们定义应如何在集群中的多个服务之间分配流量。
4、IngressRouteTCP & MiddlewareTCP:顾名思义,允许我们定义 TCP 路由并在此过程中调整请求。
5、IngressRouteUDP:再次添加对不同协议,例如,UDP的支持。
6、TLSOptions:微调 TLS 连接参数,例如,最低 TLS 版本和应使用的密码套件。
7、ServersTransport:调整 Traefik 和服务之间的通信。
那么,什么是 Traefik CRD?
Traefik CRD(自定义资源定义)是一种扩展机制,允许我们在 Kubernetes 中定义自定义资源,作为一种流行的开源反向代理和负载均衡器,Traefik 可以部署为 Kubernetes 入口控制器,支持各种 Kubernetes 资源,例如 Deployments、Services 和 Ingress 对象。
Traefik CRD 提供了一种方法来扩展 Traefik 的功能,使其超出标准 Kubernetes 资源中可用的功能。 使用 CRD,我们可以定义自己的自定义资源类型,例如中间件、ingressroutes 和 ingressroutetcps,这些资源类型可用于配置 Traefik 的路由、负载均衡等功能。
除此之外,使用 Traefik CRD,我们可以定义复杂的路由规则、中间件配置和其他特定于我们的应用程序环境的定制,从而使得我们可以实现仅使用标准 Kubernetes 资源无法实现的更高级用例。
— 03—
案例解析:使用 Traefik CRD 实现负载均衡策略
现在我们知道了 Traefik CRD 是什么,我们以基于 Traefik CRD 实现负载均衡策略为例,简要剖析其实现原理。
这里有一个如何使用 Traefik CRDs 配置加权循环或最少连接负载均衡策略的示例具体配置如下所示:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: my-ingressroute spec: entryPoints: - web routes: - match: Host(`example.com`) kind: Rule services: - name: backend-1 port: 80 weight: 5 strategy: type: "wrr" - name: backend-2 port: 80 weight: 3 strategy: type: "wrr" - name: backend-3 port: 80 strategy: type: "leastconn"
在上述配置示例中,我们定义了一个“IngressRoute”,监听“web”入口点并将请求匹配到“example.com”。 `services` 字段包含应处理与此路由匹配的请求的后端服务列表。 我们还使用“strategy”字段为每个服务指定负载平衡策略。
前两个服务“backend-1”和“backend-2”使用加权循环 (WRR) 负载平衡策略。 `weight` 字段用于指定每个后端服务器的相对权重。在这种情况下,`backend-1` 的权重为 5,而 `backend-2` 的权重为 3。这意味着 `backend-1` 将收到大约 5/8 的请求,而 `backend-2` ` 将收到大约 3/8 的请求。
`strategy` 字段用于指定负载均衡策略。 在这种情况下,我们为前两个服务使用 `wrr` 类型。
第三个服务,`backend-3`,使用最少连接负载均衡策略。这意味着请求将发送到活动连接最少的服务器。 我们为此服务指定了“leastconn”类型。
除上述所述的负载均衡策略外,Traefik 还支持其他负载均衡策略,例如随机、IP 哈希和基于 cookie 的负载均衡。我们可以使用“策略”字段和任何相关参数配置这些策略。 具体配置选项可能因我们所使用的策略而异。
— 04—
Traefik CRD 能够实现的价值?
Traefik CRD 为我们所构建的 Ingress 和 API 管理带来了诸多好处。以下是将它们纳入我们的工作流程的几个至关重要的原因,具体如下:
1、灵活性
使用 Traefik CRD,我们可以获得无与伦比的灵活性和对 Ingress 流量的细粒度控制。利用为我们的定制应用程序需求量身定制的高级路由、流量管理和安全功能。
2、兼容性
Traefik CRD 与 Traefik 的工具和功能生态系统无缝协作,使其非常适合我们现有的 Traefik 设置。
3、高级用例
Traefik CRD 使我们能够实现高级用例,例如,标准 Kubernetes Ingress 对象可能不支持的金丝雀部署、A/B 测试和速率限制。这使我们可以实施复杂的流量管理策略,以确保应用程序平稳运行。
4、易用性:使用标准 Kubernetes 清单文件很容易定义、配置和管理,遵循与其他 Kubernetes 资源相同的声明方法。
在本文中,我们深入研究了 Traefik 中的 Kubernetes CRD。我们讨论了 Kubernetes Ingress 限制以及 Traefik CRD 如何克服这些限制,提供了一个实际的负载均衡示例。
我们强调了 Traefik CRD 的好处,包括它们的灵活性和兼容性。无论我们是从事软件开发工作还是 DevOps 工作,我们都鼓励大家在 Kubernetes 部署中探索 Traefik CRD 的强大功能,以获得更健壮和可扩展的应用程序基础设施。
此外,CRD 不仅用于 Traefik Proxy,作为一种 Kubernetes 原生 API 管理解决方案,可简化 API 发布、安全和管理的 Traefik Hub 也适用。还利用原生 Kubernetes 结构,如 CRD、标签和选择器,还完全符合 GitOps 标准,可快速实现价值并提高用户的工作效率。
有关 Traefik 更多内容,大家可参考官网所示……
Adiós !