《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——6. ASM Istio 模式架构设计(上)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——6. ASM Istio 模式架构设计(上)

近几年,企业基础设施云原生化的趋势越来越强烈,从最开始的IaaS化到现在的微服务化,客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度,也一直在高速的发展和演进中,这必然对客户对云原生网络的可观测性带来了极高的门槛和挑战。

 

为了提高云原生网络的可观测性,同时便于客户和前后线同学增加对业务链路的可读性,ACK产研和AES联合共建,合作开发ack net-exporter和云原生网络数据面可观测性系列,帮助客户和前后线同学了解云原生网络架构体系,简化对云原生网络的可观测性的门槛,优化客户运维和售后同学处理疑难问题的体验,提高云原生网络的链路的稳定性。image.png

图: 服务网格示例

image.png

图 Istio数据面示意图

 

Kubernetes的横空出现打破了底层服务器、底层网络等计算资源的界限,给业务的灵活部署、快速恢复、弹性伸缩,资源效率最大化带来了无限可能。

 

但是业务场景的‘贪婪’是无限的,随着微服务趋势大肆发展,业务上对于同一个service,不同版本和流量控制有着更精细化的颗粒度的需求,最好能实现Pod维度的流量控制,可观测性等等。这些在kubernetes上是无法实现的:

 

从流量角度,k8s最小控制维度是service其他比如金丝雀 等发布,借助各种ingress controller或者其他组件实现,并且这些也无法实现Pod之间流量和连接状态可观测性

k8s给服务微型化,小型化创造了条件如果前后端服务存在调用关心,他们如果使用共享通信库,则会在开发阶段就要求所有微服务使用相同逻辑语言和堆栈,这从某种程度上又大大限制微服务独立化,无法实现完全‘漠不关心’

将原来集成在同一个ECS上服务拆分成不同模块,这些模块之间调用涉及跨ECS等,那么必然需要在代码开发阶段需要考虑超时,重试,连接失败等逻辑机制,而这些与微服务最核心服务应用其实没有太大关系,但是开发工作往往耗费大量经历在逻辑设计上

 

那么,有没有办法实现上述和微服务的业务完全隔离呢?Istio的出现给这个带来了相对完美的解决方案,让应用这和开发者更加关注业务本身的开发迭代。Istio利用了k8s的Pod概念,会根据使用者的配置,在每个被注入的Pod部署时,自动注入istio-proxy 容器和initial 容器。

 

Initial容器的目的是通过修改Pod 单独网络命名空间的iptables规则,让需要代理的流量进入到istio-proxy 监听的端口,istio-proxy 监听出入 两个端口,根据网格配置,来实现对出入流量的代理实现和干预。而被同一个istio注入的载体,都被视为同一个服务网格之内,他们之间的调用已经脱离了service的层面,会命中相关的istio cluster配置的endpoint,这样我们就可以实现Pod维度的流量管理、观测性、安全性等配置。

 

1) Pod注入

ASM默认提供了一个Webhook控制器,可以将Sidecar代理自动添加到可用的Pod中。通过下面的命令可以看到ASM注入的集群有个 istio-sidecar-injector-1-15-3的mutatingwebhookconfiguration,查看webhook内容,可以看到其中一条就是有 istio-inject: enabled 标签的namespace  里的pod创建时候会自动注入。

image.pngimage.png

除了命名空间维度,还有Pod维度,其他注解方式等多种维度实现K8s集群是否被加入到Istio服务网格中。为了充分利用服务网格的所有特性,服务网格中ACK集群的应用Pod必须包含一个Sidecar代理。除了手动注入方式外,通常建议启用自动注入的方式来简化部署,ASM已经实现了注入配置的可视化操作,具体请见多种方式灵活开启自动注入

image.png

 

2) Pod流量转发

通过describe被注入的Pod,可以发现Pod中除了设置好的业务container,还多出两个容器:istio-proxy和init container:istio-init。这两个容器的镜像是一样的,只是运行的命令的不一样,这样的好处是只需要拉取一份镜像,节省了拉取镜像的时间。

image.png

 

3) Init Container

Init container 利用的是k8s的特性,一种具有特权的特殊容器,在Pod内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。每个Pod中可以包含多个容器和多个Init 容器。他与普通容器很像,但是有自己独特点:

 

多个init 容器是串行运行的。也就是说多个init 容器会依序运行,等上一个init 容器运行完毕结束后,才会开始运行下一个容器

只有等到所有init 容器全部运行结束退出后,业务容器才开始启动,在这之前,pod不会处于ready

如果Pod的Init 容器失败,kubelet 根据pod设置restartPolicy 进行相应action

 

既然现在了解了Init container的作用,那我们来看一下istio-init在启动的过程中做了哪些事情,可以通过下面的命令:

kubectl logs -n istio-inject productpage-v1-797d845774-dndmk -c istio-init

image.png

image.png

可以看到istio-init在启动过程中进行了一连串的iptables规则的生成和配置,比如出方向转发到15001端口;入方向转发到15006端口;访问15008端口,直接return不进行流量劫持等等。

 

那有什么办法可以自定义配置么?查看pod的信息可以看到相关配置的启动参数,也就通过相关规则实现了出入流量重定向到设置的端口。

image.png

 

-p: 所有出方向的流量被iptables重定向到15001端口

-z: 所有入方向的流量被iptables重定向到15006端口

-u: 用于排除用户ID为1337,可以视为envoy应用本身使用UID 1337

-m: 流量重定向模式,“REDIRECT” 或 “TPROXY”

-i: 重定向出方向的地址范围,“*” 表示重定向所有出站流量。

-x: 指将从重定向出方向中排除的IP 地址范围

-b: 重定向入站端口列表

-d: 重定向入站端口中排除的端口列表

 

我们从Pod的视角去观察,将Pod视为一个整体,里面有istio-proxy容器和业务容器APP container

入方向流量转发

image.png

 

根据上文的iptables 规则,我们可以归纳出被入方向代理转发的端口,比如80等,在Pod的网络命名空间netfilter模块经过流程是Client -> RREROUTING -> ISTIO_INBOUND -> ISTIO_IN_REDIRECT -> INPUT -> Envoy 15006(Inbound)-> OUTPUT -> ISTIO_OUTPUT -> POSTROUTING -> APP。这样就实现了入方向流量先被转发到sidecar容器后,在转发到业务容器的监听端口。其中在步骤5和6 之间,流量会按照设置好的istio规则进行处理。

 

出方向流量转发

image.png

 

根据上文的iptables 规则,我们可以归纳出被入方向代理转发的端口,比如80等,在Pod的网络命名空间netfilter模块经过流程是APP > OUTPUT -> ISTIO_OUTPUT -> ISTIO_REDIRECT -> Envoy 15001(Outbound)-> OUTPUT -> ISTIO_OUTPUT -> POSTROUTING -> DST。这样就实现了出方向流量先被转发到sidecar容器后,在转发到目的监听端口。其中在步骤d和e 之间,流量会按照设置好的istio规则进行处理。

入方向流量免转发

image.png

 

对于入方向的某些端口或者自定义端口,我们不需要它经过sidecar容器,iptables规则会设置将符合条件的入方向流量避免转发到15006端口,直接转发到业务容器监听端口 RREROUTING -> ISTIO_INBOUND -> INPUT -> APP。

 出方向流量免转发

image.png

 

对于出方向的某些端口或者自定义端口,我们不需要它经过sidecar容器,iptables规则会设置将符合条件的入方向流量避免转发到15001端口,直接离开Pod的网络命名空间 APP -> OUTPUT -> ISTIO_OUTPUT -> POSTROUTING -> DST。


更多精彩内容,欢迎观看:

《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——6. ASM Istio 模式架构设计(中):https://developer.aliyun.com/article/1221373?spm=a2c6h.13148508.setting.16.15f94f0eCydDfj


相关文章
|
28天前
|
机器学习/深度学习 Kubernetes Cloud Native
云原生技术演进之旅:从容器到服务网格
在云计算的浪潮中,云原生技术以其独特的灵活性和可扩展性引领了新的技术革命。本文将深入探讨云原生技术的发展脉络,从容器技术的突破,到Kubernetes的集群管理,再到服务网格的微服务通信解决方案,揭示云原生如何不断适应和塑造现代应用的需求。文章将通过数据支撑和案例分析,展示云原生技术在实际应用中的优势和挑战,并预测其未来的发展趋势。
34 1
|
1月前
|
人工智能 运维 Cloud Native
|
1月前
|
Kubernetes Cloud Native 持续交付
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
|
1月前
|
Kubernetes Cloud Native Docker
云原生架构的演进:从容器化到服务网格
本文深入探讨了云原生技术从最初的容器化技术,如Docker和Kubernetes,发展到现代的服务网格架构,如Istio。文章将通过分析云原生技术的演进路径,揭示其在处理微服务复杂性、流量管理和安全性方面的优势。我们将通过具体案例展示服务网格如何优化分布式系统的性能,并预测未来云原生技术的发展趋势。
25 2
|
2月前
|
Kubernetes Cloud Native 开发者
阿里云网络发布 alibaba-load-balancer-controller v1.2.0:开启云原生网关开源新篇章!敬请探索!
**阿里云发布开源版ALB控制器v1.2.0,对齐商业版ALB Ingress Controller v2.10.0。新版本增强了功能特性,提升了用户体验,并提供了最佳实践。功能更新包括自定义标签、QUIC协议支持、转发规则和安全策略等。此外,还引入了ReadinessGate实现滚动升级时的平滑上线和Prestop钩子确保平滑下线。用户可从GitHub获取开源代码,通过Docker Hub拉取镜像,开始使用alibaba-load-balancer-controller v1.2.0。**
189 3
阿里云网络发布 alibaba-load-balancer-controller v1.2.0:开启云原生网关开源新篇章!敬请探索!
|
2月前
|
Cloud Native 容器 Kubernetes
基于阿里云服务网格流量泳道的全链路流量管理(三):无侵入式的宽松模式泳道
本文简要讨论了使用流量泳道来实现全链路流量灰度管理的场景与方案,并回顾了阿里云服务网格 ASM 提供的严格与宽松两种模式的流量泳道、以及这两种模式各自的优势与挑战。接下来介绍了一种基于 OpenTelemetry 社区提出的 baggage 透传能力实现的无侵入式的宽松模式泳道,这种类型的流量泳道同时具有对业务代码侵入性低、同时保持宽松模式的灵活特性的特点。同时,我们还介绍了新的基于权重的流量引流策略,这种策略可以基于统一的流量匹配规则,将匹配到的流量以设定好的比例分发到不同的流量泳道。
73489 16
基于阿里云服务网格流量泳道的全链路流量管理(三):无侵入式的宽松模式泳道
|
28天前
|
运维 Kubernetes Cloud Native
云原生技术的未来演进:探索服务网格和无服务器架构的融合
随着企业数字化转型的不断深入,云原生技术已成为推动现代软件开发的关键力量。本文深入探讨了服务网格和无服务器架构这两大云原生技术趋势,分析了它们各自的优势以及未来可能的融合点。通过对比分析和案例研究,我们揭示了这两种技术如何互补并共同推进云原生生态系统的发展,同时指出了实践中面临的挑战和潜在的解决方案。 【7月更文挑战第22天】
|
1月前
|
人工智能 自然语言处理 安全
使用阿里云服务网格高效管理LLM流量:(一)流量路由
ASM支持通过LLMProvider和LLMRoute资源管理大型语言模型流量。LLMProvider负责注册LLM服务,LLMRoute负责设定流量规则,应用可灵活切换模型,满足不同场景需求。
|
1月前
|
Cloud Native 测试技术 开发者
阿里云服务网格ASM多集群实践(二):高效按需的应用多环境部署与全链路灰度发布
介绍服务网格ASM提出的一种多集群部署下的多环境部署与全链路灰度发布解决方案。
|
3月前
|
弹性计算 安全 微服务
【阿里云云原生专栏】容器网络技术前沿:阿里云Terway网络方案详解
【5月更文挑战第26天】阿里云Terway是高性能的容器网络方案,基于ECS的ENI实现,提供低延迟高吞吐的网络服务。它简化网络管理,实现安全隔离,并与阿里云服务无缝集成。Terway由CNI、Node和Controller组成,适用于微服务、混合云和多租户环境,为企业数字化转型中的复杂网络需求提供强大支持。
303 1

热门文章

最新文章