Bookinfo是Istio的官方示例应用。 我们已经在k8s集群上安装了Istio,本篇的目标是在k8s集群上将Bookinfo应用跑起来。

Bookinfo示例应用概述

Bookinfo这个示例应用由4个独立的微服务组成,Istio使用这个应用来演示Istio的Service Mesh的各种功能。 Bookinfo应用的端到端架构图如下:

BookInfo Application without Istio

  • productpage微服务: 调用details微服务和reviews微服务来生成页面
  • details微服务: 包含图书的详细信息
  • reviews微服务: 提供图书的评论功能,也可以调用rating微服务给图书评级
  • ratings微服务: 提供图书的评级功能

另外还要注意到reviews微服务目前有3个版本:

  • v1不会调用ratings微服务
  • v2调用ratings微服务,并将评级显示1~5个黑色星星
  • v3调用ratings微服务,并将每个评级显示为1~5个红色星星

部署Bookinfo应用

下面我们将这个应用部署到k8s上。

进入istio安装包的解压目录:

1cd istio-0.2.9

部署应用:

 1kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)
 2service "details" created
 3deployment "details-v1" created
 4service "ratings" created
 5deployment "ratings-v1" created
 6service "reviews" created
 7deployment "reviews-v1" created
 8deployment "reviews-v2" created
 9deployment "reviews-v3" created
10service "productpage" created
11deployment "productpage-v1" created
12ingress "gateway" created
  • istioctl kube-inject命令用于在创建部署之前修改 bookinfo.yaml 文件,Envoy作为sidecar proxy注入。

接下来确认本次部署到k8s中的Service和Pod:

1kubectl get svc
2NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                          AGE
3details               ClusterIP   10.108.74.106   <none>        9080/TCP                         30m
4productpage           ClusterIP   10.101.224.78   <none>        9080/TCP                         30m
5ratings               ClusterIP   10.108.45.30    <none>        9080/TCP                         30m
6reviews               ClusterIP   10.100.169.78   <none>        9080/TCP                         30m
1kubectl get pod
2NAME                              READY     STATUS    RESTARTS   AGE
3details-v1-6fc98d6c9-dk2cr        2/2       Running   0          31m
4productpage-v1-6fc697bfcf-vtl2v   2/2       Running   0          31m
5ratings-v1-78546964bc-hc2jj       2/2       Running   0          31m
6reviews-v1-5b5d868bbc-l9b7p       2/2       Running   0          31m
7reviews-v2-867c49d8ff-bd8lj       2/2       Running   0          31m
8reviews-v3-7488499999-n8mnc       2/2       Running   0          31m

查看创建的ingress:

1kubectl get ingress
2NAME      HOSTS     ADDRESS   PORTS     AGE
3gateway   *                   80        32m

注意ADDRESS为空,这是因为我们本地k8s集群不支持的外部的负载均衡器。我们只能以NodePort的形式访问ingress:

1export GATEWAY_URL=$(kubectl get po -n istio-system -l istio=ingress -o 'jsonpath={.items[0].status.hostIP}'):$(kubectl get svc istio-ingress -n istio-system -o 'jsonpath={.spec.ports[0].nodePort}')
2echo $GATEWAY_URL
3192.168.61.11:30933

确认以http://${GATEWAY_URL}/productpage打开Bookinfo这个示例应用。

最后我们再来看一下这些微服务的Pod:

1kubectl get pod
2NAME                              READY     STATUS    RESTARTS   AGE
3details-v1-6fc98d6c9-dk2cr        2/2       Running   0          36m
4productpage-v1-6fc697bfcf-vtl2v   2/2       Running   0          36m
5ratings-v1-78546964bc-hc2jj       2/2       Running   0          36m
6reviews-v1-5b5d868bbc-l9b7p       2/2       Running   0          36m
7reviews-v2-867c49d8ff-bd8lj       2/2       Running   0          36m
8reviews-v3-7488499999-n8mnc       2/2       Running   0          36m

我们注意到每个Pod都是2个容器,例如productpage-v1-6fc697bfcf-vtl2v,查看bookinfo.yaml中只定义了istio/examples-bookinfo-productpage-v1:0.2.3这一个容器。

 1apiVersion: extensions/v1beta1
 2kind: Deployment
 3metadata:
 4  name: productpage-v1
 5spec:
 6  replicas: 1
 7  template:
 8    metadata:
 9      labels:
10        app: productpage
11        version: v1
12    spec:
13      containers:
14      - name: productpage
15        image: istio/examples-bookinfo-productpage-v1:0.2.3
16        imagePullPolicy: IfNotPresent
17        ports:
18        - containerPort: 9080

通过kubectl describe pod productpage-v1-6fc697bfcf-vtl2v查看,我们发现另外还多了一个istio-proxy的docker.io/istio/proxy_debug:0.2.9容器作为sidecar proxy是istio给注入的。

此时部署到k8s上的Bookinfo的架构图是下面这样的:

BookInfo Application with Istio

现在所有的微服务之间的调用都是通过Envoy sidecar,即图中小黑色长方形,微服务的sidecar组成了服务网格Service Mesh。

总结

通过本篇的学习,我们基本建立了如下概念:服务网格ServiceMesh实际上就是存在于微服务之间的网络,一般以轻量级的sidecar(边车)部署,负责管理微服务之间的流量,提高了微服务的弹性。Istio使服务网格的一种实现。

参考