前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linkerd 2.10将支持不透明端口

Linkerd 2.10将支持不透明端口

作者头像
CNCF
发布2021-03-15 15:32:55
7270
发布2021-03-15 15:32:55
举报
文章被收录于专栏:CNCF

作者:Charles Pretzer

Image Credit: Gilles Rolland-Monnet

即将发布的Linkerd 2.10版本增加了一个新的不透明(opaque)端口特性,进一步扩展了Linkerd为所有TCP流量提供零配置互TLS的能力。关于这一特性,在Slack和GitHub上的Linkerd社区已经提出了不少问题,因此本文将重点关注Linkerd实现这一功能的最重要的底层特性之一:协议检测。

协议检测,顾名思义,允许Linkerd自动检测TCP连接中使用的协议。Linkerd的设计原则之一是“正常工作”,协议检测是Linkerd如何实现这一目标的重要部分。

在本文中,你将了解什么是协议检测,这个微妙的特性如何为Linkerd提供如此强大的功能,以及即将到来的不透明端口特性将给Linkerd带来什么。

什么是协议检测?

简单地说,协议检测是通过检查连接上的流量来确定TCP连接上使用的协议的能力。

协议检测

Linkerd使用协议检测来避免要求用户指定协议。Linkered的代理仅仅执行协议检测来回答这个问题,而不是要求用户配置每个端口使用什么协议。

Linkerd的协议检测通过窥视客户端连接的前几个字节来获取关于流量的信息。这个实现有一些后果,我们将在下面讨论。

但首先,让我们回答为什么Linkerd首先关心任何协议这个问题。

可观察性、可靠性和安全性

我们通常将Linkerd的广泛特性分为三个部分:可观察性、可靠性和安全性。了解连接上使用的协议是这些类别的基础。

可观察性

Linkerd的可观测性特征的中心是检测流量。这种检测需要理解正在使用的协议,因为协议的知识可以提供丰富的指标。例如,知道一个连接使用HTTP,Linkerd就可以解析请求、响应和响应代码,并报告响应延迟、请求量和错误率等指标。这些指标非常有价值,在谷歌的SRE书中,它们被称为“黄金信号”的一部分。另一方面,如果Linkerd只知道一个连接是TCP,它就只能记录非常基本的信息,比如读写的字节数——没有进一步解释字节的能力。

安全性

相互TLS(Mutual TLS,mTLS)是Linkerd的核心特性。从Linkerd 2.9开始,所有网格端点之间的TCP流量默认由Linkerd代理进行mTLS处理。(有例外情况,请参阅下面关于跳过端口的部分。)

在这里,了解连接的协议同样至关重要。例如,如果连接已经TLS了(例如应用程序),没有理由重新TLS它。(严格地说,TLS是传输层协议,而不是像HTTP那样的应用层协议,但对于本文的目的来说,区别并不重要。)

可靠性

最后,了解底层连接的协议允许Linkerd提供复杂的可靠性特性。这里的一个例子是负载平衡。在不知道连接的协议的情况下,Linkerd被限制在平衡连接:一旦TCP连接建立到服务器,它就没有进一步操作该连接的能力。

然而,如果Linkerd知道一个连接是HTTP,它可以从连接平衡移动到请求平衡。Linkerd将跨端点建立一个连接池,并在这个连接池中平衡请求。由于它现在可以访问请求和响应,Linkerd在如何平衡请求方面可以非常复杂;事实上,它根据每个可能端点的最近性能来平衡请求(使用一种称为“指数加权移动平均”(EWMA)的指标),以避免缓慢端点带来尾部延迟。

(Linkerd也是Kubernetes内进行gRPC连接负载平衡[1]的一个简单解决方案。)

协议检测失败时

虽然协议检测被设计为允许Linkerd“正常工作”,但在某些情况下它不能:臭名昭著的服务器说话优先协议。这些协议(包括MySQL和SMTP等)的工作方式是让客户机建立连接,然后等待服务器响应。从TCP的角度来看,这是完全合法的行为,但这意味着Linkerd无法检测到协议,因为相关信息来自服务器,而不是客户机。

(为什么不简单地使用服务器的字节来检测协议?因为在协议检测时,Linkerd甚至还没有建立到服务器的连接。选择与哪个服务器通信是负载均衡器的功能,使用哪个负载均衡器是协议的功能。这是一个美味的、TCP风味的“鸡和蛋”问题。)

为了规避这种情况,Linkerd引入了跳过入站端(skip-inbound-ports)口和跳过出站端口(skip-outbound-ports)配置选项。这些选项指示Linkerd通过修改iptables规则,完全绕过某些端口的代理,Linkerd使用iptables规则通过它的边车代理为pod连接。例如,添加注释config.linkerd.io/skip-outbound-ports: 3306到工作负载的PodSpec指示Linkerd创建一个iptables规则,以确保Linkerd代理从不处理到端口3306(MySQL端口)的任何流量。类似地,注释config.linkerd.io/skip-inbound-ports: 3306将写一个iptables规则,这样代理就不会处理发送到它的MySQL流量。

跳过端口配置

这些选项为协议检测无法处理服务器说话优先协议提供了一种解决方案。然而,它们有一个显著的缺点:因为它们完全绕过了Linkerd代理,所以Linkerd不能应用mTLS或捕捉这些端口的任何指标。

Linkerd 2.10的不透明端口和改进的协议检测

为了解决跳过端口的缺陷,在即将发布的2.10版本中,Linkerd将添加不透明端口的概念(和相应的opaque-ports注释)。一个不透明的端口仅仅是一个Linkerd将代理而不执行协议检测的端口。虽然这种方法仍然需要配置,但将端口标记为不透明允许Linkerd应用mTLS并报告TCP级别的指标——这比完全跳过它有很大的改进。

不透明端口的配置

Linkerd 2.10还将改进协议检测的工作方式,使其“fail open”:如果协议检测代码在10秒后没有看到客户端字节,它将把连接视为TCP连接并继续,而不是像2.9中那样失败。这意味着,不使用不透明端口(或跳过端口)注释服服务器说话优先协议端口的最坏情况是10秒的连接延迟,而不是连接失败。

总结

协议检测是Linkerd最强大的功能之一,也是Linkerd“正常工作”原则的基础。虽然协议检测不是万灵药,但在Linkerd 2.10中引入不透明端口应该解决早期跳过端口特性的大部分缺点,并允许Linkerd采用者在整个Kubernetes环境中扩展mTLS,而不管协议是什么。

(想要尝试不透明的端口吗?你不必等待2.10的发布,因为该功能目前已经在edge发布版中可用!)

Linkerd适用于所有人

Linkerd是一个社区项目,由CNCF托管。Linkerd致力于开放治理。如果你有功能需求、问题或评论,我们欢迎你加入我们快速增长的社区!Linkerd托管在GitHub上,我们在Slack、Twitter和邮件列表上都有一个蓬勃发展的社区。来一起玩吧!

参考资料

[1]

Kubernetes内进行gRPC连接负载平衡: https://linkerd.io/2018/11/14/grpc-load-balancing-on-kubernetes-without-tears/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是协议检测?
  • 可观察性、可靠性和安全性
    • 可观察性
      • 安全性
        • 可靠性
        • 协议检测失败时
        • Linkerd 2.10的不透明端口和改进的协议检测
        • 总结
        • Linkerd适用于所有人
          • 参考资料
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档