这个示例部署了一个用于演示多种 Istio 特性的应用,该应用由四个单独的微服务构成。 这个应用模仿在线书店的一个分类,显示一本书的信息。 页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。

Bookinfo 应用分为四个单独的微服务:

  • productpage. 这个微服务会调用 details 和 reviews 两个微服务,用来生成页面。
  • details. 这个微服务中包含了书籍的信息。
  • reviews. 这个微服务中包含了书籍相关的评论。它还会调用 ratings 微服务。
  • ratings. 这个微服务中包含了由书籍评价组成的评级信息。

reviews 微服务有 3 个版本:

  • v1 版本不会调用 ratings 服务。
  • v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
  • v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。

下图展示了这个应用的端到端架构。

Istio 部署Bookinfo 应用

 

Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。

 

二、部署应用

环境说明

操作系统:centos 7.6
主机名:k8s-master
ip地址:192.168.31.236
配置:2核2g

 

操作系统:centos 7.6
主机名:k8s-node01
ip地址:192.168.31.16
配置:2核4g

 

关于Istio 的安装,请参考链接:

https://www.cnblogs.com/xiao987334176/p/14236554.html

 

架构图

要在 Istio 中运行这一应用,无需对应用自身做出任何改变。 您只要简单的在 Istio 环境中对服务进行配置和运行,具体一点说就是把 Envoy sidecar 注入到每个服务之中。 最终的部署结果将如下图所示:

Istio 部署Bookinfo 应用

 

 所有的微服务都和 Envoy sidecar 集成在一起,被集成服务所有的出入流量都被 sidecar 所劫持,这样就为外部控制准备了所需的 Hook,然后就可以利用 Istio 控制平面为应用提供服务路由、遥测数据收集以及策略实施等功能。

 

启动应用服务

注意,按照官方文档,在2步中,启动了自动注入 Sidecar。这一步千万不要执行。

为什么呢?因为在后续步骤中,执行kubectl apply -f bookinfo.yaml之后,再次查看pod,使用命令:kubectl get pods

你会发现,一个pod都没有运行,是不是很绝望啊,这pod到底跑哪里去了呢???

 

1. 正确的做法是,使用手动注入Sidecar

kubectl apply -f <(istioctl kube-inject -f /usr/local/istio-1.8.1/samples/bookinfo/platform/kube/bookinfo.yaml)

 

2. 查看svc

[root@k8s-master ~]# kubectl get svc
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.1.1.81      <none>        9080/TCP   18m
kubernetes    ClusterIP   10.1.0.1       <none>        443/TCP    28m
productpage   ClusterIP   10.1.114.106   <none>        9080/TCP   18m
ratings       ClusterIP   10.1.231.95    <none>        9080/TCP   18m
reviews       ClusterIP   10.1.198.180   <none>        9080/TCP   18m

 

3. 查看pod

[root@k8s-master ~]# kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
details-v1-7c954bd65b-6wx2t      2/2     Running   0          18m
productpage-v1-6c47684d7-sxhkw   2/2     Running   0          18m
ratings-v1-7545898bd4-pjmm4      2/2     Running   0          18m
reviews-v1-5b676dc848-7tcjv      2/2     Running   0          18m
reviews-v2-5797d46b9-q4vrq       2/2     Running   0          18m
reviews-v3-86d796848b-gkbdt      2/2     Running   0          18m

注意:耐心等待几分钟,状态就会转换为Running

 

4. 要确认 Bookinfo 应用是否正在运行,请在某个 Pod 中用 curl 命令对应用发送请求,例如 ratings

kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"

输出:

<title>Simple Bookstore App</title>

 

确定 Ingress 的 IP 和端口

现在 Bookinfo 服务启动并运行中,您需要使应用程序可以从外部访问 Kubernetes 集群,例如使用浏览器。可以用 Istio Gateway 来实现这个目标。

 

1. 为应用程序定义 Ingress 网关:

kubectl apply -f /usr/local/istio-1.8.1/samples/bookinfo/networking/bookinfo-gateway.yaml

 

2. 确认网关创建完成

[root@k8s-master ~]# kubectl get gateway
NAME               AGE
bookinfo-gateway   61s

 

3. 根据文档设置访问网关的 INGRESS_HOST 和 INGRESS_PORT 变量。确认并设置。

在Istio 的安装文档中,我已经通过NodePort 方式来暴露istio-ingressgateway 服务,现在根据如下命令来获取 ingress ports:

export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')

 

获取 ingress IP 地址:

export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}')

 

设置 GATEWAY_URL:

[root@k8s-master ~]# export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
[root@k8s-master ~]# echo $GATEWAY_URL
192.168.31.16:32223

 

确认可以从集群外部访问应用

可以用 curl 命令来确认是否能够从集群外部访问 Bookinfo 应用程序:

curl -s http://${GATEWAY_URL}/productpage | grep -o "<title>.*</title>"

输出:

<title>Simple Bookstore App</title>

 

还可以用浏览器打开网址 http://$GATEWAY_URL/productpage,来浏览应用的 Web 页面。如果刷新几次应用的页面,就会看到 productpage 页面中会随机展示 reviews 服务的不同版本的效果(红色、黑色的星形或者没有显示)。reviews 服务出现这种情况是因为我们还没有使用 Istio 来控制版本的路由。

 

访问url

http://192.168.31.16:32223/productpage

 

效果如下:

Istio 部署Bookinfo 应用

 

 

如果刷新几次应用的页面,就会看到页面中会随机展示 reviews 服务的不同版本的效果(红色、黑色的星形或者没有显示)。reviews 服务出现这种情况是因为我们还没有使用 Istio 来控制版本的路由。

Istio 部署Bookinfo 应用

 

 

理解原理

Gateway 配置资源允许外部流量进入 Istio 服务网格,并使 Istio 的流量管理和策略功能可用于边缘服务。
在前面的步骤中,我们在 Istio 服务网格中创建了一个服务,并展示了如何将服务的 HTTP 端点暴露给外部流量。
 
 

应用默认目标规则

在使用 Istio 控制 Bookinfo 版本路由之前,您需要在目标规则中定义好可用的版本,命名为 subsets 。

运行以下命令为 Bookinfo 服务创建的默认的目标规则:

如果没有启用双向 TLS,请执行以下命令:

kubectl apply -f /usr/local/istio-1.8.1/samples/bookinfo/networking/destination-rule-all.yaml

等待几秒钟,以使目标规则生效。

您可以使用以下命令查看目标规则:

kubectl get destinationrules -o yaml

 

 

本文参考链接:

https://istio.io/latest/zh/docs/examples/bookinfo/

https://www.cnblogs.com/rickie/p/istio_kubernetes.html

 

相关文章: