ServiceMesh--流量劫持
透明劫持的具体工作流程是这样,我们以 iptables 流量劫持方案为例:
Init 流程(编号为0的两条紫色虚线):在Pod启动时,通过Init Container特权容器,开启流量劫持并设置流量劫持规则(分为 Inbound 规则和 Outbound 规则)。注意这个流程时部署时进行,因为不是真实请求流量所以用的虚线表示。
Inbound流程(左边编号为1,2,3的黄色实现):Inbound请求,被 traffic interception 劫持,根据 Inbound规则请求被转发到Sidecar,然后Sidecar再转发给应用。这是用于劫持 Inbound流量,也就是外部访问当前应用的流量,使之在通过Sidecar再由Sidecar转发给应用。
Outbound流程(右边编号为4,5,6的黑色实现):应用发出的 Outbound 请求会被 traffic interception 劫持,根据 Outbound 规则请求被转发给 Sidecar,然后 Sidecar 处理之后将请求发送给目的地。这是用于劫持 Outbound 流量,也就是当前应用访问外部服务的流量,使之先通过Sidecar,然后由sidecar进行转发。
通过上述三个流程,我们就实现了让应用的 Inbound 请求和 Outbound 请求在运行时改变行为方式,在应用无感知的情况下实现了将流量劫持到 Sidecar 中。然后我们在 Sidecar 中就有机会为当前请求赋予各种能力,典型如服务发现/负载均衡/实施各种路由策略/认证/加密等一系列能力,从而实现了对应用的动态赋能。
透明劫持的最大优点是对代码无侵入:
- 业务应用在开始时无需关注各种功能的实现细节和调用方式,也不需要依赖SDK,这些能力会在运行时动态赋予
- 对于已有的应用,旧有代码可以无需改动就直接运行在service mesh上
- 从而避免修改代码,和相关的重新打包发布上线等复杂流程
- 另外透明劫持支持直连(不经过sidecar)/单跳(只经过一个Sidecar)/双跳(经过两个Sidecar),方便开发调试,容易实现和现有系统的兼容
透明劫持近乎完美的实现了我们要求的目标:在运行时为应用 动态赋能,应用无感知。
另外透明劫持还有一个比较隐蔽但是又非常关键的优点:不丢失重要信息。这指的是在透明劫持模式下,请求的原始目标地址和端口信息(original_dest)得以保留,让应用可以工作在特定协议应该绑定的端口上,从而更符合12 factor中”Port Binding”的要求,关于这一点的细节,可以见最后的花絮部分。
由于原始目标地址和端口信息(original_dest)得以保留,因此透明劫持容许服务在多个端口上绑定多个不同协议而Sidecar只需要一个端口就可以实现流量转发。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wshten@gmail.com
文章标题:ServiceMesh--流量劫持
本文作者:KevinTen
发布时间:2019-09-04, 00:00:00
最后更新:2019-09-04, 10:29:00
原始链接:http://github.com/kevinten10/2019/09/04/Cloud/servicemesh/Cloud-流量劫持/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。