开发者学堂课程【云原生实践公开课:服务网格下的东西向与南北向流量管理实践】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/698/detail/12278
服务网格下的东西向与南北向流量管理实践
内容介绍:
一、为什么使用服务网格技术
二、什么是阿里云服务网格ASM
三、托管的服务网格ASM产品架构
四、托管模式下的优势
五、东西向与南北向流量管理
六、lstio入口网关的工作原理
七、Demo:定义东西向与南北向流量管理
八、用户在使用ASM时常见的问题
一、为什么使用服务网格技术
1."Dev/Ops/SRE团队将以统一的、声明的方式解决应用服务管理问题”
(1)控制平面层:托管控制面组件
(2)数据平面层:网格代理
(3)业务应用层:应用服务实例
随着功能增强,版本也会发生变化
随着版本变化,应用也要随之更新
由此可见,随着应用规模的增长,服务数量的不断增加,针对服务实现服务治理能力,依靠代码库这种方式会非常复杂。通过对服务治理能力的统一化、抽象化,变成一个独立的组件,就可以更好地支持更好地编程语言以及框架。帮助开发人员更
加关注到业务本身,不需要过多的关注服务治理组件上。
通过数据平面,可以更加详细的去观测网格数据化平面,通过控制平面去更好地管理操纵网格的行为。
二、什么是阿里云服务网格ASM
阿里云服务网格(Alibaba Cloud Service Mesh,简称ASM)提供了
- 一个全托管式的服务网格平台
- 兼容于社区lstio开源服务网格
- 用于简化服务的治理,包括:
- 服务调用之间的流量路由与拆分管理
- 服务间通信的认证安全
- 网格可观测性能力
目标:
尽可能地减轻开发与运维的工作负担,提升应用服务管理的能力
三、托管的服务网格ASM产品架构
保持兼容性,运行在阿里云上
1.控制平台:
声明式API/kubectl(兼容lstio):核心组件托管、精细化流量管理、零信任安
全、生命周期管理、网格诊断、混合部署。
扩展与集成:链路追踪、云企业网、OPA、WASM扩展、Prometheus监控、SPIFFE/SPIRE、日志服务、GitOps
2.数据平台:
阿里云VPC、其他公有云或IDC
ASM作为业内首个一个全托管式的服务网格平台,这个控制平面的组件时运行在阿里云的资源上。
通过托管的模式,可以很好的去兼容控制面的组件,架构非常灵活,也提升了结构的可观测性。很好的支持了数据面不同版本的 K8s的集群。
在扩展与集成方面,ASM也整合了阿里云服务的很多能力,包括可观测性服务能力,这里涉及到了链路追踪、日志服务、云企业网等等,能支持跨地域等问题。
在数据平面,在ASM也支持多种不同的集群设施,包括托管的和无服务器的k8s。
四、托管模式下的优势
1、托管的服务网格控制平面实例
高可用、免运维、内建安全最佳实践;开发人员可以更专注于业务应用而非基础设施运维。
2、增强的数据平面能力
优化整合阿里云中间件云产品,提供托管的链路追踪、监控、告警、日志等可观测能力。基于WebAssembly实现统一的代理可扩展能力。
3、跨集群跨区域的统一流量管理
一个网格实例可管理不同环境下的多个集群,结合阿里云云企业网等,轻松实现跨地域混合云应用流量统一管理。
4、支持多种基础设施的应用
支持容器应用和虚拟机应用间的流量管理,适合容器化上云的平滑迁移场景。
服务网格控制面组件与数据面K8s集群的生命周期管理解耦,以支持各自的升级维
护、更多版本的兼容
五、东西向与南北向流量管理
在老的单体应用架构中,我们几乎只处理南北流量,但是对于微服务,我们必须越来越多地处理数据中心内部的流量。对于单体应用来说,不同的组件之间通过调用应用内部的方法来通信。
边缘网关(Edge gateways)抽象了常见的流量协调功能,例如身份验证,日志记录和限流,但是在单体应用范围内进行的通信不需要这些活动。
在服务网格中,所谓的东西向流量管理就是指在数据面,集群内服务与服务之间流量的管理。与之相对应,南北向流量就是指集群外部的客户端连接到集群内的服
务,或者通过集群内的服务去访问集群外的服务。
1.公共网络:
公共IngressGateway、Proxy(sidcar)、Proxy(sidecar)
直接通过sidecar访问外部服务
2.私有网络:
私有IngressGateway、Service A、Service B
通过Egress Gateway将lstio 功能(例如监控和路由规则)应用于Egress流量。
Istio 网关的负载均衡作用:
典型的服务网格具有一个或多个负载均衡器,也称为网关(Gateway),它们从外
部网络终止 TLS 并允许流量进入网格。
然后,流量通过边车网关(Sidecar gateway)流经内部服务。应用程序使用外部服务的场景也很常见,可以直接调用外部服务,或者在某些部署中强制通过专用出口
网关(Egress Gateway)离开网格的所有流量。
Istio 具有入口网关的概念,它扮演网络入口点的角色,负责保护和控制来自集群外部的流量对集群的访问。
六、lstio入口网关的工作原理
传统上,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 上。
此外,Istio 的网关还扮演负载均衡和虚拟主机路由的角色。如图所示,可以看到默
认情况下 Istio 使用 Envoy 代理作为入口代理。
Envoy 是一个功能强大的服务到服务代理,但它也有负载均衡和路由的功能,可代理的流量包括从服务网格外部到其内部运行的服务,或者从集群内部服务到外部服务。
在前面章节中介绍的 Envoy 的所有功能也可以在入口网关中使用。
七、Demo:定义东西向与南北向流量管理
1、创建ASM实例
打开阿里云官网首页,在云计算产品,云计算基础里点击服务网格ASM进入官方首页。
2、添加集群到ASM实例
3. 点击管理控制台,点击创建新网格,输入实例信息
点击添加按钮,可以将集群添加到实例中去,出现所管理的集群,选
择与网络处于同一VPC的集群。
选中集群后,点确定
重要提示:
将选定集群加入服务网格后,不允许再使用类似于istlioctl等命令在该集群上安装、
lstio组件﹔否则将可能会导致该集群的网格能力不可用。一旦误操作之后。
请先从网格中移除该集群,然后再重新添加。
4.添加入口网关
根据自身需要选择相应的端口
5.部署应用到ASM实例
操作步骤:
(1) 登录容器服务控制台,在左侧导航栏中选择集群>命名空间。
(2) 在命名空间页面,从集群下拉列表中选择对应的集群。
(3) 在default命名空间的操作列,单击编辑。
(4) 在编辑命名空间对话框中,为该命名空间添加标签,单击添加。
(5) 从Github的Istio项目库中下载Bookinfo的YAML文件。
(6) 通过kubectl执行以下命令,将Bookinfo应用部署到ASM实例的集群中。
kubectl apply -f bookinfo.yaml
6.定义lstio资源
通过定义Istio资源,可以实现服务网格ASM的流量治理、鉴权以及安全保护等功能。
本文介绍如何定义虚拟服务、服务网关、目标规则这三种Istio资源,以实现相应的流量路由策略。
前提条件
- 创建至少一个ASM实例,并添加至少一个ACK集群到该实例中。详情请参见创
建ASM实例和添加集群到ASM实例。
- 部署应用到ASM实例的集群中,详情请参见部署应用到ASM实例。
- 在加入到ASM实例的ACK集群中部署入口网关,详情请参见添加入口网关服
务。
步骤一:定义Gateway资源
1. 登录ASM控制台。
2. 在左侧导航栏,选择服务网格 > 网格管理。
3. 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
4. 在网格详情页面左侧导航栏选择流量管理 > 网关规则,然后在右侧页面单击新建。
5. 在新建页面中,按以下步骤定义服务网关,然后单击确定。
(1)选择相应的命名空间。
本文以选择default命名空间为例。
(2)在文本框中,定义服务网关。可参考以下YAML定义,详情请参见Istio官方示例。
代码示例:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
6. 在网关规则页面可以看到新建的bookinfo-gateway网关。
步骤二:定义虚拟服务
1. 登录ASM控制台。
2. 在左侧导航栏,选择服务网格 > 网格管理。
3. 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
4. 在网格详情页面左侧导航栏选择流量管理 > 虚拟服务,然后在右侧页面单击新建。
5. 在新建页面,按以下步骤定义虚拟服务,然后单击确定。
(1)选择相应的命名空间。
本文以选择default命名空间为例。
(2)在文本框中,定义Istio虚拟服务。可参考以下YAML定义,详情请参见Istio官方示例。
代码示例:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
7、在虚拟服务页面可以看到新建的bookinfo服务。
步骤三:访问入口网关
1. 既可以从ASM控制台查看入口网关服务的IP地址,也可以按照如下步骤从容器服务控制台进行查看。
(1) 登录容器服务管理控制台。
(2) 在控制台左侧导航栏中,单击集群。
(3) 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的应用管理。
(4) 在集群管理页左侧导航栏中,选择网络 > 服务。
(5) 在服务页面,在命名空间下拉列表中选择istio-system,查看名为istio-ingressgateway服务所对应的外部端点信息,即是入口网关服务的IP地址。
2.在浏览器地址栏输入http://{入口网关服务的IP地址}/productpage,验证路由策略。
在虚拟服务中未定义Reviews微服务路由策略的情况下,3个版本之间默认的流量路由策略是轮询。因此持续刷新页面可以依次看到以下3个版本:
(1) v1版本不会调用Ratings服务。
(2) v2版本会调用Ratings服务,并使用1到5个黑色星形图标来显示评分信息。
(3) v3版本会调用Ratings服务,并使用1到5个红色星形图标来显示评分信息。
步骤四:定义目标规则
通过定义目标规则,可以指定微服务在多个节点间的负载均衡策略。
1. 在网格详情页面左侧导航栏选择流量管理 > 目标规则,然后在右侧页面单击新建。
2. 在新建页面中,按以下步骤定义目标规则,然后单击确定。
(1) 选择相应的命名空间,本文以选择default命名空间为例。
(2) 在文本框中,定义目标规则。可参考以下YAML定义,详情请参见Istio官方示例。
示例说明:定义Reviews的三个版本微服务的负载均衡策略分别为,轮询(ROUND ROBIN,未定义时的默认策略)、最少连接数(LEAST_CONN)和随机(RANDOM)。
代码示例:
apiVersion:
networking.istio.io/v1alpha3
kind:
DestinationRule
metadata:
name:
reviews
spec:
host:
reviews
subsets:
-
name:
v1
labels:
-
name:
v2
labels:
version:
v2
trafficPolicy:
loadBalancer:
simple:
LEAST_CONN
-
name:
v3
labels:
version:
v3
trafficPolicy:
loadBalancer:
simple:
RANDOM
3. 在目标规则页面可以看到新建的reviews目标规则。
步骤五:增加新的虚拟服务
增加虚拟服务,定义新的流量路由策略,从而实现在微服务的指定版本之间按照不同的权重分发流量。
1. 在网格详情页面左侧导航栏选择流量管理 > 虚拟服务,然后在右侧页面单击新建。
2. 在新建页面中,按以下步骤定义虚拟服务,然后单击确定。
(1) 选择相应的命名空间,本文以选择default命名空间为例。
(2) 在文本框中,定义虚拟服务。可参考以下YAML定义,详情请参见Istio官方示例。
示例说明:
将Reviews微服务的流量按照50%的权重分别指向v2和v3版本。
apiVersion:
networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
weight: 50
- destination:
host: reviews
subset: v3
weight: 50
4、在虚拟服务页签可以看到新建的reviews虚拟服务。
执行结果
在浏览器地址栏输入
http://{入口网关服务的IP地址}/productpage,持续刷新,可以看到Bookinfo应用页面在v2和v3之间等权重地轮流切换,显示为黑色星形图标或者红色星形图标。
详情可参考链接如下:
https://help.aliyun.com/document detail/149552.html
八、用户在使用ASM时常见的问题
1.为何不能在ASM实例中部署应用?
ASM控制台提供的Kubeconfig配置是用于连接ASM实例,并通过kubectl进行操作lstio CRD(自定义资源),例如虚拟服务virtualservice等。添加的ACK的操作保持不变,仍然使用ACK控制台提供的配置。
2.为何不能在ASM管理的集群中部署lstio的虚拟服务等CRD资源?
操作lstio资源是属于控制面,所以连接的Kubeconfig也是控制面提供的配置,使用方式与普通的kubeconfig—样
3.网格有自己的连接配置,如果不用这个连接配置,直接使用集群的连接配置是否也可操作istio资源?
如果想部署istio这些虚拟服务这些资源,必须到ASM平面。lstio CRD对应的资源只需要在控制平面保存就可以了,控制平面会将对应的规则转换成sidecar里的规则应用起来。