本示例部署一个名称为bookinfo的应用程序,该应用程序由四个单独的微服务组成,用于演示各种Istio功能。该应用程序用于显示书籍有关的信息,类似于在线书籍商店的单个目录条目。页面上显示的是书的说明,书的详细信息(ISBN,页数等)和一些书评。该应用程序是由多种多语言编写的,即微服务以不同的语言编写。值得注意的是,这些服务不依赖于Istio。Bookinfo应用程序分为四个单独的微服务:
- productpage:productpage微服务调用details和reviews微服务来填充页面。
- details:details微服务包含图书的详细信息。
- reviews:reviews微服务包含书评,它还调用ratings微服务。
- ratings:ratings微服务包含书的排名信息。
其中,reviews微服务提供了3个版本:
- 版本v1不调用ratings服务。
- 版本v2调用ratings服务,并将每个等级显示为1到5个黑星。
- 版本v3调用ratings服务,并将每个等级显示为1到5个红色星号。
该应用程序的端到端体系结构如下所示。
Bookinfo Application
1. 应用部署
使用Istio运行bookinfo application示例时,无需更改应用程序本身的任何内容。这里只需要在启用Istio的环境中进行配置和运行服务,并为每个服务注入Envoy Proxy辅助工具。所有微服务都将与Envoy sidecar打包在一起,该Envoy sidecar用于拦截对服务的入站和出站。基于Istio部署的bookinfo application结构如下:
Bookinfo Application
1.1. 部署示例应用
通过下面的步骤部署booking application示例应用:
- 默认情况,在Istio上部署安装应用使用自动Sidecar 注入。使用以下命令将托管应用程序的名称空间(此处为default)的标记为istio-injection=enabled:
$ kubectl label namespace default istio-injection=enabled
- 使用以下kubectl命令部署应用程序:
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
该命令将启动bookinfo应用程序体系结构图中显示的所有四个服务。评论服务的有3个版本,即v1,v2和v3。在实际部署中,随着时间的推移会部署新版本的微服务,而不是同时部署所有版本。
- 确认所有服务和Pod均已正确定义并正在运行:
$ kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE details 10.0.0.31 <none> 9080/TCP 6m kubernetes 10.0.0.1 <none> 443/TCP 7d productpage 10.0.0.120 <none> 9080/TCP 6m ratings 10.0.0.15 <none> 9080/TCP 6m reviews 10.0.0.170 <none> 9080/TCP 6m
和
$ kubectl get pods NAME READY STATUS RESTARTS AGE details-v1-1520924117-48z17 2/2 Running 0 6m productpage-v1-560495357-jk1lz 2/2 Running 0 6m ratings-v1-734492171-rnr5l 2/2 Running 0 6m reviews-v1-874083890-f0qf0 2/2 Running 0 6m reviews-v2-1343845940-b34q5 2/2 Running 0 6m reviews-v3-1813607990-8ch52 2/2 Running 0 6m
1.2. 创建入口网关
现在Bookinfo服务已启动并正在运行,还需要使该应用程序可以从Kubernetes集群外部访问。
- 定义应用程序的入口网关:
$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
- 确认网关已创建:
$ kubectl get gateway NAME AGE bookinfo-gateway 32s
2. 访问应用
通过下面的命令,将productpage微服务以NodePort模式暴露到Kubernetes集群外:
$ kubectl expose deployment/ productpage-v1 –type=NodePort
通过下面的命令,获取对外暴露的端口(这里为31532):
$ kubectl get svc
在浏览器地址中输入:http://{宿主机ip}:31532 浏览器将进入productpage页面:
3. 创建默认目标规则
在使用Istio控制Bookinfo版本路由之前,需要在目标规则中定义可用的版本,称为子集。运行以下命令为Bookinfo服务创建默认目标规则:
如果未启用双向TLS,请执行以下命令:
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
此YAML配置文件的内容如下:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: productpage spec: # 此host的名称对应于Kubernetes中服务的名称 host: productpage subsets: - name: v1 # 标签的键值对对应于Kubernetes中标签一致的pod labels: version: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews spec: host: reviews # reviews存在v1、v2和v3三个子集,分别对应于Kubernetes中三个Pod subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v3 labels: version: v3 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: ratings spec: host: ratings subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v2-mysql labels: version: v2-mysql - name: v2-mysql-vm labels: version: v2-mysql-vm --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: details spec: host: details subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 ---
如果确实启用了双向TLS,请执行以下命令:
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml
等待几秒钟,以便传播目标规则。可以使用以下命令显示目标规则:
$ kubectl get destinationrules -o yaml
4. 路由请求
在bookinfo示例中包含四个单独的微服务,每个微服务具有多个版本。reviews微服务有3个版本被部署并同时运行。在浏览器中访问Bookinfo应用,然后刷新几次,会注意到书评输出有时包含星级,有时则不。这是因为没有明确的默认服务版本可路由,Istio以循环方式将请求路由到所有可用版本。
4.1. 创建虚拟服务
为微服务设置默认版本的虚拟服务,从而实现将流量路由到特定的一个版本。在这种情况下,虚拟服务会将所有流量路由到特定版本下的每个微服务。在这里即可以通过kubectl创建虚拟服务,也可以通过小米的Naftis创建虚拟服务。
4.1.1. 通过kubectl创建
此处通过kubectl创建虚拟服务:
- 运行以下命令以应用虚拟服务:
$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
- 使用以下命令显示定义的路由:
$ kubectl get virtualservices -o yaml
下面是新路由定义的代码示例:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: # 定义名称为productpage的虚拟服务 name: productpage spec: hosts: - productpage http: - route: # 目的路由的主机为productpage,子集为v1 - destination: host: productpage subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v3 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - route: - destination: host: ratings subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: details spec: hosts: - details http: - route: - destination: host: details subset: v1
4.1.2. 通过Naftis创建
此处通过Naftis可视化创建虚拟服务:
- 登录Naftis,并在“服务管理”中定位到“productpage”微服务。
- 进入“productpage”微服务主页,点击右上角的“执行任务”。
- 进入“执行任务”页面后,点击RequestRouting类型的“创建任务”。
- 在“创建任务”页面,填写命名空间信息和各个微服务的主机和目标地址子集:
- Namespace:default
- Host:productpage DestinationSubset:v1
- Host:details DestinationSubset:v1
- Host:ratings DestinationSubset:v1
- Host:review3 DestinationSubset:v3
4.2. 测试新的路由配置
在浏览器中打开Bookinfo网站,多次刷新页面,页面中的评论部分均显示星级。这是因为将Istio配置为将评论服务的所有流量路由到了reviews:v3。
登录后评论
立即登录 注册