专栏首页黑客下午茶Server-Speaks-First 有点坑,Linkerd 2.10 中的协议检测和不透明端口

Server-Speaks-First 有点坑,Linkerd 2.10 中的协议检测和不透明端口

来源于Linkerd官方博客

协议检测(Protocol detection),顾名思义,允许 Linkerd 自动检测 TCP 连接中使用的协议。 Linkerd 的设计原则之一是“just work”,协议检测是 Linkerd 如何实现这一目标的重要组成部分。

什么是协议检测?

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

Linkerd 使用 Protocol detection 来避免要求用户指定协议。 Linkered 的代理不需要用户配置每个端口使用的协议,而是简单地执行协议检测来回答问题。

LinkerdProtocol detection 通过查看客户端连接的前几个字节来获取有关流量的信息来工作。这种实现有一些后果,我们将在下面介绍。

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

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

我们通常将 Linkerd 的广泛功能分为三类:可观察性(Observability)、可靠性(reliability)和安全性(security)。了解连接(connection)上使用的协议是每个类别的基础。

可观察性

Linkerd 可观察性功能的核心是流量检测。这种仪器需要了解正在使用的协议,因为协议的知识可以提供丰富的指标。例如,知道连接正在使用 HTTPLinkerd 就可以解析请求、响应和响应代码,并报告响应延迟、请求量和错误率等指标。这些指标非常有价值,以至于它们成为谷歌 SRE 书中所谓的“黄金信号”的一部分。另一方面,如果 Linkerd 只知道连接是 TCP,则它仅限于记录非常基本的信息,例如读取和写入的字节数——无法进一步解释字节。

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

安全

双向 TLS (mTLS)Linkerd 的核心功能。从 Linkerd 2.9 开始,网状端点(meshed endpoints)之间的所有 TCP 流量默认由 Linkerd 代理进行 mTLS。(有一些警告 - 请参阅下面有关 skip-ports 的部分。)

在这里,再次了解连接的协议至关重要。例如,如果连接已经是 TLS 的(例如,通过应用程序),则没有理由重新 TLS。(严格来说,TLS 是一种传输层协议,而不是像 HTTP 那样的应用层协议,但就本文而言,两者之间的区别并不重要。)

可靠性

最后,了解底层连接的协议允许 Linkerd 提供复杂的可靠性功能。这里的一个例子是负载平衡。在不知道连接协议的情况下,Linkerd 仅限于平衡连接(balancing connections):一旦与服务器建立了 TCP 连接,它就无法进一步操作该连接。

但是,如果 Linkerd 知道连接是 HTTP,它可以从连接平衡(connection balancing)转移到请求平衡(request balancing)。Linkerd 将建立一个跨端点的连接池,并平衡这个池中的请求。由于它现在可以访问 requestsresponsesLinkerd 在平衡请求方面可以非常复杂;事实上,它根据每个可能端点的最近性能(使用称为“指数加权移动平均(exponentially weighted moving average)”或 EWMA 的指标)来平衡请求,以避免从慢速端点引起尾部延迟(tail latency)。

( Linkerd 也是 Kubernetes 中负载平衡 gRPC 连接的一个简单解决方案。)

当协议检测失败时

虽然协议检测旨在允许 Linkerd “just work”,但在某些情况下它不能:臭名昭著的服务器优先协议(server-speaks-first)。这些协议(包括 MySQLSMTP)通过让客户端建立连接然后等待服务器响应来工作。从 TCP 的角度来看,这是一种完全合法的行为,但这意味着 Linkerd 无法检测到协议,因为相关信息来自服务器,而不是客户端。

(为什么不简单地使用服务器的字节来检测协议?因为在检测协议的时候,Linkerd 甚至还没有建立到服务器的连接。选择与哪个服务器对话是负载均衡器的一个功能,而使用哪个负载均衡器是协议的一个功能。这是一个 delicious、带有 TCP-flavored 的“先有鸡还是先有蛋(chicken-and-egg)”问题。)

为了避免这种情况,Linkerd 引入了 skip-inbound-portsskip-outbound-ports 配置选项。这些选项指示 Linkerd 通过修改 Linkerd 用于通过其 sidecar 代理连接 podiptables 规则来完全绕过某些端口的代理。例如,将 annotation config.linkerd.io/skip-outbound-ports: 3306 添加到工作负载的 PodSpec 指示 Linkerd 创建一个 iptables 规则,以确保 Linkerd 代理永远不会处理到端口 3306MySQL 端口)的任何流量 . 同样,annotation config.linkerd.io/skip-inbound-ports: 3306 将编写一个 iptables 规则,以便代理永远不会处理发送给它的 MySQL 流量。

Skip Ports 配置

这些选项为 protocol detection 无法处理 server-speaks-first 协议提供了一种解决方法。然而,它们有一个明显的缺点:因为它们完全绕过 Linkerd 代理,Linkerd 无法应用 mTLS 或捕获这些端口的任何指标。

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

为了解决 skip-ports 的不足,在 2.10 版本中,Linkerd 将添加不透明端口(opaque ports)的概念(以及相应的 opaque-ports annotation)。不透明端口就是 Linkerd 将代理而不执行协议检测的端口。虽然这种方法仍然需要配置,但将端口标记为不透明允许 Linkerd 应用 mTLS 并报告 TCP-level metrics —— 这比完全跳过它是一个很大的改进。

Opaque Ports 配置

Linkerd 2.10 还将通过使其“fail open”来改进协议检测的工作方式:如果协议检测代码在 10 秒后没有看到客户端字节,它会将连接视为 TCP 连接并继续,而不是像 2.9 那样失败 . 这意味着不使用 opaque-ports(或 skip-ports)annotating server-speaks-first 端口的最坏情况行为是 10 秒的连接时间延迟,而不是连接失败。

总结

Protocol detectionLinkerd 最强大的功能之一,也是 Linkerd “just works” 原则的基础。虽然协议检测不是万灵药,但 Linkerd 2.10 中引入的 opaque-ports 应该解决早期 skip-ports 特性的大部分缺点,并允许 Linkerd 使用者在整个 Kubernetes 环境中扩展 mTLS,而不管协议是什么。

Refs

  • Protocol Detection and Opaque Ports in Linkerd
    • https://linkerd.io/2021/02/23/protocol-detection-and-opaque-ports-in-linkerd

本文分享自微信公众号 - 黑客下午茶(hi-weishao),作者:为少

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linkerd 2.10(Step by Step)—1. 将您的服务添加到 Linkerd

    为了让您的服务利用 Linkerd,它们还需要通过将 Linkerd 的数据平面代理(data plane proxy)注入到它们服务的 pod 中,从而进行网...

    为少
  • 详细了解 Linkerd 2.10 基础功能,一起步入 Service Mesh 微服务架构时代

    Linkerd 提供了许多功能,如:自动 mTLS、自动代理注入、分布式追踪、故障注入、高可用性、HTTP/2 和 gRPC 代理、负载均衡、多集群通信、重试和...

    为少
  • Linkerd 2.10将支持不透明端口

    即将发布的Linkerd 2.10版本增加了一个新的不透明(opaque)端口特性,进一步扩展了Linkerd为所有TCP流量提供零配置互TLS的能力。关于这一...

    CNCF
  • 扩展|让Linkerd 2.10变得更小更简单

    Linkerd是世界上最小、最简单的服务网格。自Linkerd 2.0以来,我们一直遵循极简主义、可组合性的哲学,并在现有的生态系统之上构建。这个想法可能看起来...

    CNCF
  • Linkerd 2.10(Step by Step)—将 GitOps 与 Linkerd 和 Argo CD 结合使用

    GitOps 是一种使用 Git 作为单一事实来源自动管理和交付 Kubernetes 基础设施和应用程序的方法。它通常利用一些软件代理来检测和协调 Git 中...

    为少
  • Linkerd 2.10(Step by Step)—使用 Linkerd 进行分布式跟踪

    在实践中使用分布式跟踪可能很复杂, 为了从高层次解释您得到了什么以及它是如何完成的, 我们整理了一个list of myths。

    为少
  • Linkerd 2.10(Step by Step)—多集群通信

    本指南将引导您安装和配置 Linkerd,以便两个集群可以与托管在两个集群上的服务通信。在本指南结束时,您将了解如何在不同集群上的服务之间分配流量。

    为少
  • Linkerd 2.10(Step by Step)—Ingress 流量

    从 Linkerd 2.9 版开始,有两种方式可以让 Linkerd 代理 与您的 Ingress Controller 一起运行。

    为少
  • Linkerd 2.10(Step by Step)—调试 502s

    当 Linkerd 代理在处理请求时遇到连接错误时,它通常会返回 HTTP 502(Bad Gateway)响应。由于缺乏可用信息,很难弄清楚为什么会发生这些错...

    为少
  • Linkerd 2.10(Step by Step)—导出指标

    按照设计,Linkerd 仅在较短的固定时间窗口(目前为 6 小时)内保留指标数据。这意味着如果 Linkerd 的指标数据对您很有价值,您可能希望将其导出到成...

    为少
  • Linkerd 2.10(Step by Step)—安装多集群组件

    Linkerd 中的多集群支持需要在默认控制平面安装之上进行额外的安装和配置。本指南将介绍此安装和配置以及您可能遇到的常见问题。

    为少
  • Linkerd 2.10(Step by Step)—使用 Helm 安装 Linkerd

    Linkerd 可以选择通过 Helm 安装,而不是使用 linkerd install 命令。

    为少
  • Linkerd 2.10(Step by Step)—使用每个路由指标调试 HTTP 应用程序

    这个演示是一个Ruby应用程序,可以帮助您管理书架。它由多个微服务组成,并通过 HTTP 使用 JSON 与其他服务通信。有三种服务:

    为少
  • Linkerd 2.10—使用 Debug Sidecar,注入调试容器来捕获网络数据包

    调试服务网格(service mesh)可能很困难。当某些东西不起作用时, 是代理(proxy)有问题吗?与应用程序(application)?与客户端(cli...

    为少
  • Linkerd 2.10(Step by Step)—手动轮换控制平面 TLS 凭证

    Linkerd 的自动 mTLS 功能 使用一组 TLS 凭据为代理生成 TLS 证书:信任锚、颁发者证书和私钥。信任锚的有效期有限:365 天(如果由 lin...

    为少
  • Linkerd最先进的Rust代理|Linkerd2-proxy

    部分由于Linkerd的性能数字和一流的安全审计报告,最近对Linkerd2-proxy(Linkerd使用的底层代理)的兴趣激增。作为一名Linkerd2维护...

    CNCF
  • Linkerd项目

    说明:Linkerd是一个服务网格,可为云原生应用程序增加可靠性、安全性和可见性。Linkerd是一个透明的服务网格,旨在通过透明地向所有服务间通信添加服务发现...

    CNCF
  • Linkerd 金丝雀部署与 A/B 测试

    本指南向您展示如何使用 Linkerd 和 Flagger 来自动化金丝雀部署与 A/B 测试。

    为少
  • (译)Linkerd v2:响应实际生产需求的新一代服务网格

    服务网格正成为现代云原生技术栈的重要成员。它把服务间通信(数据中心的惯用语中称之为东西向流量)的机制从应用代码迁移到了平台层,并提供了用于对通信进行度量和处理的...

    崔秀龙

扫码关注云+社区

领取腾讯云代金券