Istio学习的开始(二):部署官方示例Bookinfo

2017-10-25 阅读: Istio

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安装包的解压目录:

cd istio-0.2.9

部署应用:

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

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

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

查看创建的ingress:

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

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

export 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}')
echo $GATEWAY_URL
192.168.61.11:30933

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

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

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

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

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: productpage-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: productpage
        version: v1
    spec:
      containers:
      - name: productpage
        image: istio/examples-bookinfo-productpage-v1:0.2.3
        imagePullPolicy: IfNotPresent
        ports:
        - 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。

参考

标题:Istio学习的开始(二):部署官方示例Bookinfo
本文链接:https://blog.frognew.com/2017/10/quick-istio-2.html
转载请注明出处。

目录