Istio 网关之南北向流量管理

头图.png

作者 | 王夕宁  阿里巴巴高级技术专家

参与阿里巴巴云原生公众号文末留言互动,有机会获得赠书福利!

本文摘自于由阿里云高级技术专家王夕宁撰写的《Istio 服务网格技术解析与实践》一书,文章介绍将集群外部的客户端连接到集群内运行的服务,以及如何从集群内的服务访问集群外部的任何服务,即通常所说的南北向流量管理。其中介绍了 Istio 在南北向流量方面的路由控制能力,引出 Istio 网关的概念及其工作原理。

本文文末汇集并整理了近期 Istio 的相关问题并特邀王夕宁老师进行解答,希望能够对大家有所帮助~

Istio 网关

网络社区中有一个术语 Ingress,是指入口请求到集群内服务的流量管理。Ingress 指的是源自本地网络之外的流量,指向本地集群网络中的端点。此流量首先路由到公开的入口点,以便通过执行一些本地网络的规则和策略来确认哪些流量被允许进入。如果流量未通过这些入口点,则无法与集群内的任何服务连接。如果入口点允许流量进入,则将其代理到本地网络中的合适节点。Istio 对入口流量的管理是由 Istio 网关进行的。

Istio 网关的工作原理

传统上,Kubernetes 使用 Ingress 控制器来处理从外部进入集群的流量。使用 Istio 时,情况不再如此。Istio 网关用新的 Gateway 资源和 VirtualServices 资源来控制入口流量,它们协同工作以将流量路由到网格中。在网格内部不需要 Gateways,因为服务可以通过集群本地服务名称相互访问。

那么 Istio 网关是怎样工作的?请求如何到达它想要的应用程序?基本步骤如下:

1.客户端在特定端口上发出请求;
2.负载均衡器在这个端口上进行侦听,并将请求转发到集群中(在相同或新的端口);
3.在集群内部,请求被路由到 Istio IngressGateway 服务所侦听的负载均衡器转发过来的端口上;
4.Istio IngressGateway 服务将请求(在相同或新的端口)转发到对应的 pod 上;
5.在 IngressGateway pod 上会配置 Gateway 资源和 VirtualService 资源定义。Gateway 会配置端口、协议以及相关安全证书。VirtualService 的路由配置信息用于找到正确的服务;
6.Istio IngressGateway pod 会根据路由配置信息将请求路由到对应的应用服务上;
7.应用服务将请求路由到对应的应用 pod 上。

1.png
(tio 网关的工作原理)

Istio 网关的负载均衡作用

典型的服务网格具有一个或多个负载均衡器,也称为网关(Gateway),它们从外部网络终止 TLS 并允许流量进入网格。然后,流量通过边车网关(Sidecar gateway)流经内部服务。应用程序使用外部服务的场景也很常见,可以直接调用外部服务,或者在某些部署中强制通过专用出口网关(Egress Gateway)离开网格的所有流量。

Istio 具有入口网关的概念,它扮演网络入口点的角色,负责保护和控制来自集群外部的流量对集群的访问。

2.png
(网关在网格中的使用情况)

此外,Istio 的网关还扮演负载均衡和虚拟主机路由的角色。如图所示,可以看到默认情况下 Istio 使用 Envoy 代理作为入口代理。Envoy 是一个功能强大的服务到服务代理,但它也有负载均衡和路由的功能,可代理的流量包括从服务网格外部到其内部运行的服务,或者从集群内部服务到外部服务。在前面章节中介绍的 Envoy 的所有功能也可以在入口网关中使用。

3.png
(Istio 的入口网关服务)

对于入口流量管理,你可能会问:为什么不直接使用 Kubernetes Ingress API?

  • 第一个原因,Kubernetes Ingress 是一个面向 HTTP 工作负载的非常简单的规范。有 Kubernetes Ingress 的实现(如 Nginx、Heptio Contour 等),但每个都适用于 HTTP 流量。实际上,Ingress 规范只将端口 80 和端口 443 视为入口点。这严重限制了集群运维人员可以允许进入服务网格的流量类型。例如,如果你有 Kafka 工作负载,则可能希望向这些消息代理公开直接 TCP 连接;
  • 第二个原因,Kubernetes Ingress API 无法表达 Istio 的路由需求。Ingress 没有通用的方法来指定复杂的流量路由规则,如流量拆分或流量镜像等。这个领域缺乏规范会导致每个供应商重新设想如何更好地为每种类型的 Ingress 实现(如 HAProxy、Nginx 等)做好配置管理。Ingress 试图在不同的 HTTP 代理之间取一个公共的交集,因此只能支持最基本的 HTTP 路由;
  • 最后一个原因,由于事前没有明确规定,大多数供应商的选择是通过部署上的定制注释来做配置。供应商之间的注释各不相同,并且不可移植,如果 Istio 继续延续这种趋势,那么就会有更多的注释来解释 Envoy 作为边缘网关的所有功能。

Istio 网关通过将 L4-L6 配置与 L7 配置分离克服了 Ingress 的这些缺点。Istio 网关只用于配置 L4-L6 功能(例如,对外公开的端口、TLS 配置),所有主流的 L7 代理均以统一的方式实现了这些功能。然后,通过在 Gateway 上绑定 VirtualService 的方式,可以使用标准的 Istio 规则来控制进入 Gateway 的 HTTP 和 TCP 流量。负载均衡器可以手动配置或通过服务自动配置其类型,例如 type: LoadBalancer。在这种情况下,由于并非所有云都支持自动配置,假设手动配置负载均衡器以将流量转发到 IngressGateway Service 正在侦听的端口。例如如下的负载均衡器正在监听以下端口:

  • HTTP:端口 80,将流量转发到端口 30080;
  • HTTPS:端口 443,将流量转发到端口 30443;
  • MySQL:端口 3306,将流量转发到端口 30306 确保负载均衡器配置转发到所有工作节点。这将确保即使某些节点关闭也会转发流量。

入口网关服务

IngressGateway 服务(入口网关服务)必须监听上节介绍的所有端口,以便能够将流量转发到 IngressGateway pod 上。Kubernetes 服务不是“真正的”服务,该请求将由 Kubernetes 提供的 kube-proxy 转发到具有运行对应 pod 的节点上。在节点上,IP table 配置将请求转发到适当的 pod:

ports:- name: http2nodePort: 30000port: 80protocol: TCP- name: httpsnodePort: 30443port: 443protocol: TCP- name: mysqlnodePort: 30306port: 3306protocol: TCP

入口网关部署

IngressGateway 部署是一个基于 Envoy 代理的封装,它的配置方式与服务网格中使用的 Sidecar 配置相同(实际上是同样的容器镜像)。当我们创建或更改一个 Gateway 或 VirtualService 时,Istio Pilot 控制器会检测到这些变更,并将这些变更信息转换为 Envoy 配置,然后将 Envoy 配置信息发送给相关 Envoy 代理,包括内部的 Envoy 和 IngressGateway 中的 Envoy。

注意:这里不要混淆 IngressGateway 与 Gateway,Gateway 资源是用于配置 IngressGateway 的一种 Kubernetes 的自定义资源。

由于不必在 Kubernetes pod 或部署中声明容器端口,因此我们不必在 IngressGateway Deployment 中声明端口。但是,如果查看部署内部,可以看到声明的许多端口。另外,在 IngressGateway 部署中需要关注 SSL 证书,为了能够访问 Gateway 资源内的证书,请确保已正确加载这些证书。

网关资源

网关资源用来配置 Envoy 的端口,前面的示例中已经使用该服务公开了三个端口,因此需要在 Envoy 中处理这些端口。此外,可以通过声明一个或多个 Gateways 来支持多端口能力。下面的示例中使用单个 Gateway,但可以分为两个或三个分别定义:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: default-gatewaynamespace: istio-system
spec:selector:istio: ingressgatewayservers:- hosts:- '*'port:name: httpnumber: 80protocol: HTTP- hosts:- '*'port:name: httpsnumber: 443protocol: HTTPStls:mode: SIMPLEprivateKey: /etc/istio/ingressgateway-certs/tls.keyserverCertificate: /etc/istio/ingressgateway-certs/tls.crt- hosts: # For TCP routing this fields seems to be ignored, but it is matched- '*'  # with the VirtualService, I use * since it will match anything.port:name: mysqlnumber: 3306protocol: TCP

网关虚拟服务

VirtualService 资源与 Gateway 资源相互配合支持 Envoy 的配置。下面是一个支持 HTTP 服务的网关虚拟服务的基本配置:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: counter
spec:gateways:- default-gateway.istio-system.svc.cluster.localhosts:- counter.lab.example.comhttp:- match:- uri:prefix: /route:- destination:host: counterport:number: 80

现在,当我们添加一个 Gateway 和一个 VirtualService 时,路由已在 Envoy 配置中创建。要查看此内容,你可以使用如下命令:

kubectl port-forward istio-ingressgateway-xxxx-yyyy-n istio-system 15000

调试入口网关

调试网络问题有时很困难,所以这里总结一些有用的命令用于调试。端口转发到第一个 istio-ingressgateway pod:

kubectl -n istio-system port-forward $(kubectl -n istio-system get pods 
-listio=ingressgateway -o=jsonpath="{.items[0].metadata.name}") 15000

然后,可以从端口转发的入口网关 pod 中获得 http 路由:

Curl --silent http://localhost:15000/config_dump |jq .configs[3].dynamic_route_configs[].route_config.virtual_hosts[]

4.png
(端口转发的入口网关 pod)

查看上述端口转发的入口网关 pod 的日志信息:

kubectl -n istio-system logs $(kubectl -n istio-system get pods 
-listio=ingressgateway -o=jsonpath="{.items[0].metadata.name}") --tail=300

查看 Pilot pod 的日志信息:

kubectl -n istio-system logs $(kubectl -n istio-system get pods 
-listio=pilot -o=jsonpath="{.items[0].metadata.name}") discovery --tail=300

当启动端口转发到入口网关 istio-ingressgateway 之后,可以执行更多操作以获取更多信息,例如:

  • 需要查看 Envoy 侦听器,请点击网址:http://localhost:15000/listeners;
  • 需要打开更详细的日志记录,请点击网址:http://localhost:15000/logging;
  • 可以在根目录 http://localhost:15000/ 中找到更多信息。

《Istio服务网格技术解析与实战》读者可免费体验 ASM 产品进行学习!点击了解阿里云服务网格产品 ASM:
www.aliyun.com/product/servicemesh

作者简介

王夕宁 阿里云高级技术专家,阿里云服务网格产品 ASM 及 Istio on Kubernetes 技术负责人,专注于 Kubernetes、云原生、服务网格等领域。曾在 IBM 中国开发中心工作,担任过专利技术评审委员会主席,拥有 40 多项相关领域的国际技术专利。《Istio 服务网格解析与实战》一书由其撰写,详细介绍了 Istio 的基本原理与开发实战,包含大量精选案例和参考代码可以下载,可快速入门 Istio 开发。Gartner 认为,2020 年服务网格将成为所有领先的容器管理系统的标配技术。本书适合所有对微服务和云原生感兴趣的读者,推荐大家对本书进行深入的阅读。

关于 Istio 的一些 Q&A

Q1:Istio 在实际生产环境实践中都会遇到哪些瓶颈,常见的优化手段又都有哪些?
A1:阿里云之所以推出服务网格 ASM 这个产品,就是把过去一两年支持客户使用 Istio 的过程中遇到的太多问题,总结成了经验并落地到产品中。所以多关注下这个产品的能力就会看到具体解决了哪些问题。在此就不一一赘述了。

Q2:Istio 会导致性能消耗增加吗?
A2:这个问题需要一个上下文,这就像问 Java 虚拟机会导致性能消耗吗。任何解耦总会带来一定的通信消耗。建议使用 Istio 前先判断下自己的应用是否适合解耦、服务化以及容器化,然后再看是否适合采用 Istio 的哪些功能。

Q3:Service Mesh 是很好的工具,但是痛点也很明显,引入 Istio 会让运维更加复杂,阿里云服务网格产品 ASM 这方面有做什么改进?
A3:阿里云服务网格 ASM 提供了一个全托管式的服务网格平台,兼容于社区 Istio 开源服务网格,用于简化服务的治理,并提供了简单易用的控制台,托管模式下让用户解脱控制面的复杂管理,极大地减轻开发与运维的工作负担。具体可以参考这个入门教程了解一下:https://help.aliyun.com/document_detail/149552.html

Q4:最近在研究 Istio,有真正落地使用的例子吗?
A4:过去一两年我们已经支持了大量客户使用 Istio,譬如有客户使用 Istio 流量管理来做应用的灰度发布,有客户使用它的统一的声明式的方式来管理入口网关,包括入口网关的 tls 透传功能、tls 终止以及动态加载证书的能力等等。

Q5:目前阿里服务网格产品 ASM 针对 Istio 采用什么样的监控?
A5:阿里云服务网格 ASM 的可观测性能力从三个维度提供了不同的能力,包括:

  • 日志:每一个 Sidecar 代理和入口网关的访问日志及分析报表,可以参考:https://help.aliyun.com/document_detail/162798.html;
  • 跟踪:集成了阿里云链路追踪服务 Tracing Analysis,为分布式应用的开发者提供了完整的调用链路还原、调用请求量统计、链路拓扑、应用依赖分析等能力,可以参考:https://help.aliyun.com/document_detail/149551.html;
  • 监控:集成了 ARMS Prometheus 及 Grafana Dashboard 的能力,这部分的文档正在输出,请持续关注产品的文档:https://help.aliyun.com/product/147365.html。

Q6:阿里的 ASM 的 Proxy 会采用 MOSN 吗?期待 MOSN 成为 Istio 可选数据平面之一。
A6:阿里云服务网格 ASM 从一开始的设计就是兼容于社区 Istio 开源服务网格,只要符合与 Istio 控制面规约要求的数据面代理,从理论上都是可以支持的。当然一个新代理的适配是需要一定量的开发工作,这儿我们也想了解下客户对于这方面的诉求。

Q7:Istio 也有类似 Linkerd 的 mutls 功能吗?
A7:Istio 默认已经提供了双向 tls 认证的功能,而且支持渐进式,包括 permissive 和 strict 两种方式。

- 赠书福利 -

5.png

《Istio 服务网格技术解析与实践》- 机械工业出版社赞助

5 月 15 日 11:00 前在阿里巴巴云原生公众号留言区分享你在学习 Istio 技术的踩坑经验、或者对新技术的更新、迭代有何独特的个人见解,精选留言点赞前 3 名各送出此书一本!

课程推荐

为了更多开发者能够享受到 Serverless 带来的红利,这一次,我们集结了 10+ 位阿里巴巴 Serverless 领域技术专家,打造出最适合开发者入门的 Serverless 公开课,让你即学即用,轻松拥抱云计算的新范式——Serverless。

点击即可免费观看课程:https://developer.aliyun.com/learning/roadmap/serverless

“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想在边缘运行计算机视觉程序?先来迎接挑战!

作者 | alwaysAI翻译 | 火火酱~,责编 | 晋兆雨出品 | CSDN云计算头图 | 付费下载于视觉中国人工智能可以让计算机聪明地行动,并且在真实环境中快速做出决策,同时收获相对理想的效果。当然,这个概括性的定义较为宽泛和模糊&#xf…

企业微信_通讯录管理,获取部门列表部门成员及详情

企业微信H5_通讯录管理,获取部门列表部门成员及详情 文章目录一、POSTMAN调试1. 获取access_token2. 获取部门列表3. 获取部门成员4. 获取部门成员详情5. 获取成员详情二、实战演练2.1. 获取部门列表2.2. 获取部门成员2.3. 获取部门成员详情2.4. 获取人员详情三、代码讲解3.1.…

【深度学习】基于 Alluxio 数据缓存的性能优化

作者 | 车漾(阿里云高级技术专家)、顾荣(南京大学 副研究员) 导读:Alluxio 项目诞生于 UC Berkeley AMP 实验室,自开源以来经过 7 年的不断开发迭代,支撑大数据处理场景的数据统一管理和高效缓…

企业微信H5_身份验证,PC网站企业微信扫码授权登录

企业微信H5_身份验证,PC网站企业微信扫码授权登录 文章目录一、扫码登录配置1. 企业微信扫码登录接入流程2. 企业微信扫码登录接入流程拆解3. 开启网页授权登录二、实战演练2.1. 用户发起流程2.2. 构造授权链接2.3. 显示扫码二维码2.4. 用户扫码2.5. 用户确认登录2.6. 回调前端…

深根固柢 云起磐石——移动云大云磐石服务器重磅推出

中国移动云能力中心在2020年中国移动全球合作伙伴大会移动云分论坛上,发布了新型自研软硬融合弹性计算架构——大云磐石服务器。该架构以自主设计的可编程芯片HyperCard和轻量级Hypervisor为核心,将存储、网络虚拟化能力卸载到硬件芯片,彻底突…

面向大数据与云计算调度挑战的阿里经济体核心调度系统

编者按 伏羲(Fuxi)是十年前最初创立飞天平台时的三大服务之一(分布式存储 Pangu,分布式计算 MaxCompute,分布式调度 Fuxi),当时的设计初衷是为了解决大规模分布式资源的调度问题(本…

企业微信_读取成员(获取用户详情)

接上一篇:企业微信H5_身份验证,H5应用网页授权登录获取身份 这篇获取用户详情信息,是在上一篇(我们已经获取到用户的简要信息)基础上做的。 文章目录一、官网文档1. 阅读官网文档2. 接口地址和参数3. 重点说明二、实战演练三、代码讲解3.1. 获…

智算中心新基建 浪潮首发智算中心操作系统

2020年11月25日,“远见卓实 践所未见”浪潮云海创新论坛2020在济南召开。会议分享了浪潮对于前沿科技的创新洞见,并以扎实可靠的落地实践为用户呈现技术的商业价值。 会上,浪潮全球首发智算中心操作系统,信通院、OIF、Globaldata…

新基建来了!5G边缘计算如何展现勃勃生机?

最近“新基建”是个热词,那么新基建到底是什么?与之紧密相关的5G何去何从?这给边缘计算带来了什么机遇?边缘计算的生态产业链条是怎样的?它的典型特征和经济效益是什么?本文将为大家带来分享。 新基建是什…

企业微信H5_网页jssdk调用,ticket签名config及示例

文章目录一、验证域名归属校验1. 阅读文档2. 配置公网域名3. 登录企业微信管控台4. 选择自建应用5. 网页授权及JS-SDK6. 填写公网域名7.下载校验文件8. 校验文件移动9. 启动前端项目10. 浏览器校验11. 域名校验12. 应用主页二、前端代码实战2.1. 引入JS文件2.2.权限验证配置三、…

十强决赛即将拉开帷幕!TECHSPARK星星之火IT创新大赛诚邀您观赛

11月28日,作为湾区创见网络安全大会的重磅环节,TECHSPARK星星之火IT创新大赛十强决赛将拉开帷幕。在本次十强决赛中,参赛公司将进行项目路演,评委将按照技术、产品、市场与客户等维度进行评分,并最终评选出冠亚季军。获…

阿里云容器服务发布 Knative 托管服务

作者 | 何淋波、丁海洋、陈有坤 业界要闻 阿里云容器服务发布 Knative 托管服务 Knative 是 Kubernetes 生态最流行的 Serverless 编排框架。可 Knative 的 Controller 和依赖的网关这些常驻实例需要支付额外的 IaaS 成本和运维成本,这给应用的 Serverless 化带来…

企业微信H5_网页jssdk调用 判断当前客户端版本是否支持指定JS接口

接上一篇:企业微信H5_网页jssdk调用,ticket签名config及示例https://gblfy.blog.csdn.net/article/details/123170569 文章目录一、接入环境1. 阅读文档2. 接入要求二、前端接入和调试2.1. 代码效果2.2. 实战演练2.3. 信息分析2.4. 真实用途三、源码分享…

Apache RocketMQ 的 Service Mesh 开源之旅

作者 | 凌楚 阿里巴巴开发工程师 导读:自 19 年底开始,支持 Apache RocketMQ 的 Network Filter 历时 4 个月的 Code Review(Pull Request),于本月正式合入 CNCF Envoy 官方社区(RocketMQ Proxy Filter 官…

企业微信H5_网页jssdk调用 config和agentconfig的区别

文章目录一、文档阅读1. 企业微信JS-SDK作用2. config 接口注入权限3. agentConfig注入应用的权限二、二者区别1.引入js不同2. 参数个数不一样3. 获取应用的jsapi_ticket4. 支持的接口5. 效果演示三、源码分享3.1. 后端源码3.2. 前端源码一、文档阅读 1. 企业微信JS-SDK作用 …

阿里云飞天洛神2.0:开放弹性的云网络NFV平台

云网络架构 阿里云操作系统叫飞天,云网络平台称为洛神。作为飞天系统的核心组件,洛神平台支撑了超大规模租户、超大规模虚拟机的高性能云网络。 洛神平台由很多网络设备组成,在架构上主要可以分为两类:虚拟交换机AVS和各种网关设…

深源恒际医疗票据OCR落地九省市 服务范围覆盖过半市场

近年来,我国健康险市场规模持续保持高增长。银保监会最新统计数据显示,2019年中国健康险业务原保险保费收入6564亿元,同比增长29.75%。同时,随着民众风险保障意识的不断提升,未来健康险仍有巨大的潜在增长空间。据天风…

企业微信H5_网页jssdk调用 agentconfig选人选照片等案例演示

文章目录一、验证域名归属校验1. 阅读文档2. 配置公网域名3. 登录企业微信管控台4. 选择自建应用5. 网页授权及JS-SDK6. 填写公网域名7.下载校验文件8. 校验文件移动9. 启动前端项目10. 浏览器校验11. 域名校验12. 应用主页二、前端代码实战2.1. 引入JS文件2.2.权限验证配置三、…

Flink 1.10 细粒度资源管理解析

相信不少读者在开发 Flink 应用时或多或少会遇到在内存调优方面的问题,比如在我们生产环境中遇到最多的 TaskManager 在容器化环境下占用超出容器限制的内存而被 YARN/Mesos kill 掉[1],再比如使用 heap-based StateBackend 情况下 State 过大导致 GC 频…

一文告诉你雾计算与云计算的区别及对物联网的价值!

作者 | Victoria Puzhevich翻译 | 风车云马,责编 | 晋兆雨出品 | CSDN云计算头图 | 付费下载于视觉中国雾计算是一种分布式计算结构。将数据和应用程序等资源放置在数据源和云之间的逻辑位置。雾计算的优点之一是让许多用户同时连接到互联网上。从本质上说&#xff…