Istio学习的开始(二):部署官方示例Bookinfo
2017-10-25
Bookinfo是Istio的官方示例应用。 我们已经在k8s集群上安装了Istio,本篇的目标是在k8s集群上将Bookinfo应用跑起来。
Bookinfo示例应用概述 #
Bookinfo这个示例应用由4个独立的微服务组成,Istio使用这个应用来演示Istio的Service Mesh的各种功能。 Bookinfo应用的端到端架构图如下:
- 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的架构图是下面这样的:
现在所有的微服务之间的调用都是通过Envoy sidecar,即图中小黑色长方形,微服务的sidecar组成了服务网格Service Mesh。
总结 #
通过本篇的学习,我们基本建立了如下概念:服务网格ServiceMesh实际上就是存在于微服务之间的网络,一般以轻量级的sidecar(边车)部署,负责管理微服务之间的流量,提高了微服务的弹性。Istio使服务网格的一种实现。