开发者学堂课程【服务网格技术最佳实践:服务网格下的东西向与南北向流量管理实践】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/752/detail/13223
服务网格下的东西向与南北向流量管理实践
内容介绍:
八、定义 Istio 资源
九、常见问题
八、定义 istio 资源
1、步骤一:定义 Gateway 资源
在新建页面中,按以下步骤定义服务网关,然后单击确定。
(1)选择相应的命名空间。
本文以选择 default 命名空间为例。
(2)在文本框中,定义服务网关。可参考以下 YAML 定义,详情请参见 Istio 官方示例。
apiversion:networking. istio. io/vlalpha3
kind:Gateway
metadata:
name:bookinfo-gateway
spec:
selector:
istio:ingressgateway#use istio default controller servers:
-port:
number:80
name:http
protocol:HTTP
hosts:
-
‘’ * ‘’
在服务网关页签可以看到新建的 bookinfo-gateway 网关。
(3)通过前面介绍知道在 AMS 库里面可以定义用于描述路由规则的 istio gateway资源、istio virtualserve 资源,通过他描述一些路由规则。在控制面里面为了定义南北向的流量管理,去定义一个 istio gateway 的 CRD ,YAML 定义。拷贝好 YAML 之后,切换到服务网格控制平面这个板块,点击新建按钮,在新的窗口里面可以指定命名空间,并且输入 YAML 文件,在 YAML 里面可以看到定义一个 istio gateway 类型的 CRD 定义。
他暴露了一个8 0的端口,点击确定之后,就可以看到创建了一个名称为 bookinfo-getaway 的 CRD。
2、步骤二:定义虚拟服务
(1)登录 ASM 控制台。
(2)在左侧导航栏,选择服务网格>网格管理。
(3)在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
(4)在控制平面区域,单击虚拟服务页签,然后单击新建。
(5)在新建页面,按以下步骤定义虚拟服务,然后单击确定。
i.选择相应的命名空间。
本文以选择 default 命名空间为例。
ii.在文本框中,定义 Istio 虚拟服务。可参考以下 YAML 定义,详情请参见Istio 官方示例。
apiversion:networking. istio. io/vlalpha3
kind:VirtualService
metadata:
name:bookinfo
spec:
hosts:
-
‘’ * ‘’
gateways:
-bookinfo-gateway
http:
-match:
-uri:
exact:/productpage
-uri:
prefix:/static
-uri:
exact./lo
ʊ
in.
(6)第二步,切换文档可以看到第二步会定义一个虚拟服务,虚拟服务也是相当的方式,可以在服务网格的控制台里面去定义一个虚拟服务,命名空间是 default,在这个 API Serve 里面定义了一个,可以看到它绑定了 getaway 的就是刚才创建的 bookinfo getaway。他里面会定义一个 hppt 的路由规则,当访问 productpage 的时候,他就会定义 productpage 9080的一个端口上面去,点击确定,就可以完成虚拟服务的创建。
3、步骤三:访问入口网关
(1)既可以从 ASM 控制台查看入口网关服务的IP地址,也可以按照如下步骤从容器服务控制台进行查看。
i.登录容器服务管理控制台。
ii.在左侧导航栏,选择路由与负载均衡>服务。
iii.在服务(Service)页面,从集群下拉列表中选择部署入口网关的集群,然后在命名空间下拉列表中选择 istio-system。
iv.查看名为 istio-ingressgateway 服务所对应的外部端点信息,即是入口网关服务的IP地址。
(2)在浏览器地址栏输入 http://{入口网关服务的IP地址}/productpage. 验证路由策略。
在虚拟服务中未定义 Reviews 微服务路由策略的情况下,3个版本之间默认的流量路由策略是轮询。因此持续剧新页面可以依次看到以下3个版本:
。v1版本不会调用 Ratings 服务。
。v2版本会调用 Ratings 服务,并使用1到5个黑色星形图标来显示评分信息。
。v3版本会调用 Ratings 服务,并使用1到5个红色星形图标来显示评分信息。
(3)在虚拟服务和服务网关都定义好了之后,第三步就是访问入口网关。入口网关的地址既可以通过 ack 的控制台获取地址,也可以通过在 ASM 这个控制台可以看到入口网关的 IP 地址,copy 这个地址,然后去访问这个定义好的服务。看到了这个登录好的 Demo 应用,
通过入口网关南北向的流量管理,通过访问这个暴露的 newd balance,负载均衡的 IP 地址,入口网关的地址,通过输入 productpage 这个路径,可以访问到客户端服务。刷新之后可以看到,会看到右侧画面结果不同,意味着就是调用了不同的版本服务。
这个过程中证明了在 Demo 实例中南北向,通过入口网关看到只需要定义两个 YAML 文件,一个是虚拟服务,一个是 getaway 的 YAML 定义,就可以把南北向入口网关的流量进行串通。
4、步骤四:定义目标规则
通过定义目标规则,可以指定微服务在多个节点间的负载均衡策略。
(1)在控制平面区域,单击目标规则页签,然后单击新建。
(2)在新建页面中,按以下步骤定义目标规则,然后单击确定。
i.选择相应的命名空间。
本文以选择 default 命名空间为例。
ii.在文本框中,定义目标规则。可参考以下 YAML 定义,详情请参见 Istio 官方示例。
示例说明:定义 Reviews 的三个版本微服务的负载均衡策略分别为,轮询(ROUNDROBIN,未定义时的默认策略)、最少连接数(LEAST CONN)和随机(RANDOM)。
api Version:networking. istio. io/vlalpha3
kind:DestinationRule
metadata:
name:reviews
spec:
host:reviews
subsets:
-name:vi
labels:
version:v1
-name:v2
labels:
version:v2
trafficPolicy:
loadBalancer:
simple:LEAST
_CONN
-name:v3
labels:
在目标规则页签可以看到新建的 reviews 目标规则。
(3)接下来看一下东西向的流量管理。在前面已经定义好的入口网关,虚拟服务基础之上,为了支持东西向服务之间流量管理会在演示的 Demo 中会为 review 服务,他的两个版本是 virtual 2号,virtual 3号,会定义一个相应的路由规则。首先,在 ASM 控制平面托管侧会去为 review 服务,他的三个版本服务定义一个他的目标规则,叫 target rule。回到服务网格的控制台,在目标规则里面去创建一个命名空间 default,这里面会有 review 服务,review 服务会用来定义他的目标规则。
5、步骤五:增加新的虚拟服务
加虚拟服务,定义新的流量路由策略,从而实现在微服务的指定版本之间按照不同的权重分发流量。
(1)在控制平面区域,单击虚拟服务页签,然后单击新建。
(2)在新建页面中,按以下步骤定义虚拟服务,然后单击确定。
i.选择相应的命名空间。
本文以选择 default 命名空间为例。
ii.在文本框中,定义虚拟服务。可参考以下 YAML 定义,详情请参见 Istio 官方示例。
示例说明:将 Reviews 微服务的流量按照50%的权重分别指向 v2和 v3版本。
apiVersion:networking. istio. io/vlalpha3
kind:VirtualService
metadata:
name:reviews
spec:
hosts:
-reviews
http:
-route:
-destination:
host:reviews
subset:v2
weight:50
-destination:
host:reviews
subset:v3
weight:50
(3)创建完毕之后,下一步去定义一个新的虚拟服务,在这个新的虚拟服务里面,能够做的一个事情是把 review 服务的流量,按照50%的权重分别指向 virtual 2号、virtual 3号。就是说他的流量不能分到 virtual 1这个版本,而是以平均指向 virtual 2号、virtual 3号,这个管理。回到 ASM 控制台,新建一个新的虚拟服务,这个里面会定义 virtual 2和 virtual 3她们的权重分别是50比50。确定之后,访问一下 productpage 页面 。这个时候,无论我们刷新多少次,页面要不就是访问 virtual 2,黑色的星星,或者是红色的,表明 virtual 2号、 virtual 3在切换。这时 virtual 1的版本不会被访问,这是因为我们定义了路由规则。回到实例在看一下,在这个服务里面会看到 Review 服务会被调用,productpage 会去调。
入口是指从前面的浏览器访问到首页,这是一个南北向的流量管理。在东西向与南北向的流量管理,可以通过虚拟服务、路由规则、入口网关、CRD 来进行管理,我们的 demo 就到这。
九、常见问题
1、Q&A
?为何不能在 ASM 实例中部署应用?
?为何不能在 ASM 管理的集群中部署 Istio 的虚拟服务等 CRD 资源?
?网格有自己的连接配置,如果不用这个连接配置,直接使用集群的连接配置是否也可操作 istio 资源?
ASM 控制台提供的 Kubeconfig 配置是用于连接 ASM 实例,并通过 kubectl 进行操作 Istio CRD (自定义资源),例如虚拟服务 virtualservice 等。添加的 ACK 的操作保持不变,仍然使用 ACK 控制台提供的配置。
操作 Istio 资源是属于控制面,所以连接的 Kubeconfig 也是控制面提供的配置,使用方式与普通的 kubeconfig 一样。
Istio CRD 对应的资源只需要在控制平面保存就可以了,控制平面会将对应的规则转换成 sidecar 里的规则应用起来。
2、最后跟大家分享一下常见的一些问题,就是用户在使用 ASM 这个产品中,需要查的一些问题。举了三个最常见的问题,第一个三为何不能在 ASM 实例中部署应用?第二个是为什么不能在 ASM 管理的集群众部署 istio 的虚拟服务等 CRD 资源?第三个问题就是服务网格有自己的连接配置,如果不用这个连接配置,直接使用集群的连接配置是否也可操作 istio 资源呢?第三个其实跟第二个问题有些类似,这里面就跟大家强调一下 ASM 服务网格这个控制台提供的 Kubeconfig 配置是用于连接 ASM 实例,通过使用这个 Kubeconfig, 可以用 kubectl 命令来进行操作定义 istio 资源。在这个过程中可以观察到,要么在控制台上,要么通过 kubectl,kubectl 连的是 ASM Kubeconfig,操作虚拟服务的定义。添加的ACK集群操作方式不变,如果是部署一个应用,像部署一个 deployment service、K8s 这些资源仍然像 ACK 之前那样的方式去部署,这个操作方式没有任何变化。刚才讲到ASM 是一个托管的控制面,所以操作 istio 资源一定是在控制面这个范围,因此去定义 istio 这些虚拟服务、CRD 资源一定是在 ASM 的 kubeconfig 这个环境下去操作。所以说在 ASM 中,它本身定义的是这些控制资源,这些控制面的资源,他不能够部署应用,部署应用仍需要在 ACK 的 K8s 集群上面部署应用。如果想部署 istio 这些虚拟服务等 CRD 资源,必须在 ASM 实例里面去配置,所以说 istio CRD 对应的资源只需要在控制平面定义就好了。定义完之后控制平面组件,就是托管的这些组件,能够把这些定义好的路由规则转换成数据平面需要的格式下发到数据平面去。所以定义的 istio 资源只需要在 ASM 里面去定义,而不需要在数据面去定义了,所以这一点跟大家澄清一下,之前很多用户反馈一些问题。今天主题分享的内容就到此结束,非常感谢大家的收听,后面期待跟大家共同推进服务网格,谢谢大家。