Server-Speaks-First 有点坑,Linkerd 2.10 中的协议检测和不透明端口
协议检测(Protocol detection
),顾名思义,允许 Linkerd
自动检测 TCP
连接中使用的协议。 Linkerd
的设计原则之一是“just work”
,协议检测是 Linkerd
如何实现这一目标的重要组成部分。
什么是协议检测?
简而言之,协议检测是通过检查连接上的流量来确定 TCP 连接上使用的协议的能力。
Linkerd
使用 Protocol detection
来避免要求用户指定协议。 Linkered
的代理不需要用户配置每个端口使用的协议,而是简单地执行协议检测来回答问题。
Linkerd
的 Protocol detection
通过查看客户端连接的前几个字节来获取有关流量的信息来工作。 这种实现有一些后果,我们将在下面介绍。
但首先,让我们首先回答为什么 Linkerd
关心任何协议的问题。
可观察性、可靠性和安全性
我们通常将 Linkerd
的广泛功能分为三类:可观察性(Observability
)、可靠性(reliability
)和安全性(security
)。 了解连接(connection
)上使用的协议是每个类别的基础。
可观察性
Linkerd
可观察性功能的核心是流量检测。 这种仪器需要了解正在使用的协议,因为协议的知识可以提供丰富的指标。 例如,知道连接正在使用 HTTP
,Linkerd
就可以解析请求、响应和响应代码,并报告响应延迟、请求量和错误率等指标。 这些指标非常有价值,以至于它们成为谷歌 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
将建立一个跨端点的连接池,并平衡这个池中的请求。 由于它现在可以访问 requests
和 responses
,Linkerd
在平衡请求方面可以非常复杂; 事实上,它根据每个可能端点的最近性能(使用称为“指数加权移动平均(exponentially weighted moving average
)”或 EWMA
的指标)来平衡请求,以避免从慢速端点引起尾部延迟(tail latency
)。
( Linkerd
也是 Kubernetes
中负载平衡 gRPC
连接的一个简单解决方案。)
当协议检测失败时
虽然协议检测旨在允许 Linkerd
“just work”
,但在某些情况下它不能:臭名昭著的服务器优先协议(server-speaks-first
)。 这些协议(包括 MySQL
和 SMTP
)通过让客户端建立连接然后等待服务器响应来工作。从 TCP
的角度来看,这是一种完全合法的行为,但这意味着 Linkerd
无法检测到协议,因为相关信息来自服务器,而不是客户端。
(为什么不简单地使用服务器的字节来检测协议?因为在检测协议的时候,Linkerd
甚至还没有建立到服务器的连接。选择与哪个服务器对话是负载均衡器的一个功能,而使用哪个负载均衡器是协议的一个功能。这是一个 delicious
、带有 TCP-flavored
的“先有鸡还是先有蛋(chicken-and-egg
)”问题。)
为了避免这种情况,Linkerd
引入了 skip-inbound-ports
和 skip-outbound-ports
配置选项。 这些选项指示 Linkerd
通过修改 Linkerd
用于通过其 sidecar
代理连接 pod
的 iptables
规则来完全绕过某些端口的代理。例如,将 annotation
config.linkerd.io/skip-outbound-ports: 3306
添加到工作负载的 PodSpec
指示 Linkerd
创建一个 iptables
规则,以确保 Linkerd
代理永远不会处理到端口 3306
(MySQL
端口)的任何流量 . 同样,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 detection
是 Linkerd
最强大的功能之一,也是 Linkerd
“just works”
原则的基础。虽然协议检测不是万灵药,但 Linkerd 2.10
中引入的 opaque-ports
应该解决早期 skip-ports
特性的大部分缺点,并允许 Linkerd
使用者在整个 Kubernetes
环境中扩展 mTLS
,而不管协议是什么。
我是为少
微信:uuhells123
公众号:黑客下午茶
加我微信(互相学习交流),关注公众号(获取更多学习资料~)
Server-Speaks-First 有点坑,Linkerd 2.10 中的协议检测和不透明端口的更多相关文章
- windows 10中使用命令行关掉占用指定端口的程序
通过netstat -ano与findstr命令结合查询到带有9080端口的监听信息,图中最后一列为监听程序的PID 通过tasklist命令与findstr命令结合查询到指定PID对应的应用程序 使 ...
- SQL SERVER 2012/2014 链接到 SQL SERVER 2000的各种坑
本文总结一下SQL SERVER 2012/2014链接到SQL SERVER 2000的各种坑,都是在实际应用中遇到的疑难杂症.可能会有人说怎么还在用SQL SERVER 2000,为什么不升级呢? ...
- Linkerd 2.10(Step by Step)—使用 Kustomize 自定义 Linkerd 的配置
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- Linkerd 2.10(Step by Step)—多集群通信
Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traef ...
- Linkerd 2.10(Step by Step)—将 GitOps 与 Linkerd 和 Argo CD 结合使用
Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traef ...
- Linkerd 2.10(Step by Step)—使用 Debug Sidecar,注入调试容器来捕获网络数据包
Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 部署 ...
- Linkerd 2.10(Step by Step)—3. 自动轮换控制平面 TLS &Webhook TLS 凭证
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- 升级10.11.6后CocoaPods的坑,之前10.11.4已经安装好的,居然没了Failed to locate Homebrew!
升级10.11.6后CocoaPods的坑,之前10.11.4已经安装好的,居然没了,用命令 sudo gem install cocoapod 装不上,换 sudo gem install -n/u ...
- ubuntu下搭建node server的几个坑
[ubuntu下搭建node server的几个坑] 1.环境变量 process.env.PORT需要使用 export PORT=80设置 windows下是set PORT=80 2.命令连结 ...
随机推荐
- 使用pdb进行Python调试
调试应用有时是一个不受欢迎的工作,当你长期编码之后,只希望写的代码顺利运行.但是,很多情况下,我们需要学习一个新的语言功能或者实验检测新的方法,从而去理解其中运行的机制原理. 即使不考虑这样的场景,调 ...
- Redis之Sentinel
Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的.可喜的是Redis从 2.8 ...
- 关于Word转Markdown的工具Typora安装及使用
简介 Typora是一款轻便简洁的Markdown编辑器,支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别.即时渲染使得你写Markdown就想是写Word文档一样流畅自如,不像其他编 ...
- bootstrap validate 验证插件 动态添加和动态删除验证项
//添加验证项 function addField(field, notEmptyMsg, othercon) { if (!othercon) { $("#gyssave").b ...
- centos7安装chrome+chromeDriver+Xvfb
安装chrome 创建yum源 # cd /etc/yum.repos.d/ # vim google-chrome.repo 创建yum源信息 [google-chrome] name=google ...
- 案例分享:Qt西门子机床人机界面以及数据看板定制(西门子通讯,mysql数据库,生产信息,参数信息,信息化看板,权限控制,播放器,二维图表,参数调试界面)
若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/118685521 长期持续带来更多项目与技术分享 ...
- SpringMVC(5)数据绑定-2
在SpringMVC(4)数据绑定-1中我们介绍了如何用@RequestParam来绑定数据,下面我们来看一下其它几个数据绑定注解的使用方法. 1.@PathVariable 用来绑定URL模板变量值 ...
- ARTS第七周
补上.瞎忙,看来还是效率的问题. 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至少一个技术技巧4.Share:分享 ...
- ARTS第三周
第三周.上周欠下了 赶紧补上,糟糕了 还有第四篇也得加紧了 难受. 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至 ...
- 续PA协商过程
续PA协商过程 当sw3的接口恢复之后会发生2中情况. ①sw3的G0/0/2口先发BPDU ②sw3的G0/0/3口先发BPDU sw3先发送BPDU sw3和sw1的交互过程: sw3的2口恢复后 ...