部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0)

部署Bookinfo示例程序
 
在下载的Istio安装包的samples目录中包含了示例应用程序。
 
Bookinfo应用
 
部署一个样例应用,它由四个单独的微服务构成,用来演示多种 Istio 特性。这个应用模仿在线书店的一个分类,显示一本书的信息。页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。
Bookinfo 应用分为四个单独的微服务:
  • productpage :productpage 微服务会调用 details 和 reviews 两个微服务,用来生成页面。
  • details :这个微服务包含了书籍的信息。
  • reviews :这个微服务包含了书籍相关的评论。它还会调用 ratings 微服务。
  • ratings :ratings 微服务中包含了由书籍评价组成的评级信息。
reviews 微服务有 3 个版本:
  • v1 版本不会调用 ratings 服务。
  • v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
  • v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。
下图展示了这个应用的端到端架构。

Bookinfo 是一个异构应用,几个微服务是由不同的语言编写的。这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。
 
要在 Istio 中运行这一应用,无需对应用自身做出任何改变。我们只要简单的在 Istio 环境中对服务进行配置和运行,具体一点说就是把 Envoy sidecar 注入到每个服务之中。这个过程所需的具体命令和配置方法由运行时环境决定,而部署结果较为一致,如下图所示:

 
所有的微服务都和 Envoy sidecar 集成在一起,被集成服务所有的出入流量都被 sidecar 所劫持,这样就为外部控制准备了所需的 Hook,然后就可以利用 Istio 控制平面为应用提供服务路由、遥测数据收集以及策略实施等功能。
 
接下来可以根据 Istio 的运行环境,按照下面的讲解完成应用的部署。
 
先验证kubernetes 集群是否启用了 自动Sidecar 注入。
 
Sidecar 的自动注入
 
使用 Kubernetes 的 mutating webhook admission controller,可以进行 Sidecar 的自动注入。Kubernetes 1.9 以后的版本才具备这一能力。使用这一功能之前首先要检查 kube-apiserver 的进程,是否具备 admission-control 参数,并且这个参数的值中需要包含 MutatingAdmissionWebhook 以及 ValidatingAdmissionWebhook 两项,并且按照正确的顺序加载,这样才能启用 admissionregistration API:
[root@centos-110 ~]# kubectl api-versions | grep admissionregistration
admissionregistration.k8s.io/v1beta1
 
ps -ef | grep apiserver

 
确认kubernetes 集群已启用了自动Sidecar 注入。
 
部署bookinfo 服务
 
创建 book 命名空间(可选),也可以直接使用默认的 default 命名空间。
 
kubectl create ns book
 
给 book 命名空间设置标签:istio-injection=enabled:
$ kubectl label namespace book istio-injection=enabled 
$ kubectl get namespace -L istio-injection
 
[root@centos-110 ~]# kubectl get ns -L istio-injection
NAME           STATUS    AGE       ISTIO-INJECTION
book           Active    1d        enabled
default        Active    27d       
istio-system   Active    8d        disabled
kube-public    Active    27d       
kube-system    Active    27d       
weave          Active    21d  
 
如果集群使用的是自动 Sidecar 注入,只需简单的 kubectl 就能完成服务的部署。
[root@centos-110 istio-1.0.0]# kubectl apply -n book -f samples/bookinfo/platform/kube/bookinfo.yaml
service "details" created
deployment.extensions "details-v1" created
service "ratings" created
deployment.extensions "ratings-v1" created
service "reviews" created
deployment.extensions "reviews-v1" created
deployment.extensions "reviews-v2" created
deployment.extensions "reviews-v3" created
service "productpage" created
deployment.extensions "productpage-v1" created
 
上面的命令会启动全部的四个服务,其中也包括了 reviews 服务的三个版本(v1、v2 以及 v3)。
 
如果服务部署有问题,可以使用如下命令删除已经部署的服务。
kubectl delete -f samples/bookinfo/platform/kube/bookinfo.yaml -n book
 
确认所有的服务和Pods 都正常运行:
[root@centos-110 istio-1.0.0]# kubectl get svc -n book
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.103.243.183   <none>        9080/TCP   9s
productpage   ClusterIP   10.111.96.136    <none>        9080/TCP   7s
ratings       ClusterIP   10.111.136.187   <none>        9080/TCP   9s
reviews       ClusterIP   10.97.99.117     <none>        9080/TCP   8s
 
[root@centos-110 istio-1.0.0]# kubectl get pods -n book -o wide
NAME                           READY     STATUS    RESTARTS   AGE       IP             NODE
details-v1-6865b9b99d-4rpfs    2/2       Running   0          12m       10.244.2.140   centos-112
productpage-v1-f8c8fb8-9zlmb   2/2       Running   0          12m       10.244.2.150   centos-112
ratings-v1-77f657f55d-mvx9g    2/2       Running   0          12m       10.244.2.135   centos-112
reviews-v1-6b7f6db5c5-8jfq7    2/2       Running   0          12m       10.244.2.142   centos-112
reviews-v2-7ff5966b99-pfhz8    2/2       Running   0          12m       10.244.2.146   centos-112
reviews-v3-5df889bcff-vhk49    2/2       Running   0          12m       10.244.1.147   centos-111
 
验证Pod是否会自动注入Sidecar
kubectl describe pod productpage-v1-f8c8fb8-8dnjm -n book
 
被注入Sidecar的Pod 会有2个容器,多出了一个 istio-proxy 容器及其对应的存储卷。

 
或者通过如下命令查看pod 中是否有istio-proxy 容器:
[root@centos-110 ~]# kubectl get pod productpage-v1-f8c8fb8-8dnjm -o jsonpath='{.spec.containers[*].name}' -n book
productpage istio-proxy
 
输出结果显示pod 中有2个容器,分别为 productpage 和 istio-proxy。
 
可以禁用 book 命名空间的自动注入功能,然后检查新建 Pod 是不是就不带有 Sidecar 容器了。
 
确定入口IP和端口
 
执行以下命令以确定您的 Kubernetes 集群是否在支持外部负载均衡器的环境中运行。
 
[root@centos-110 ~]# kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)                                                                                                     AGE
istio-ingressgateway   NodePort   10.106.84.2   <none>        80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:32329/TCP,8060:32167/TCP,15030:31095/TCP,15031:30203/TCP   8d
 
如果 EXTERNAL-IP 设置了该值,则要求您的环境具有可用于 Ingress 网关的外部负载均衡器。如果 EXTERNAL-IP 值是 <none>(或一直是 <pending> ),则说明可能您的环境不支持为 ingress 网关提供外部负载均衡器的功能。在这种情况下,您可以使用 Service 的 node port 方式访问网关。
 
使用 kubectl patch 更新 istio-ingressgateway 服务网关类型
由于在我的kubernetes 集群环境中,不支持外部负载均衡器。因此,使用 node port 方式访问网关。
 
[root@centos-110 istio-1.0.0]# kubectl patch service istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}'
service "istio-ingressgateway" patched
 
给 Bookinfo 应用定义 ingress gateway
现在 Bookinfo 服务都已正常运行中,我们需要让kubernetes集群外部可以访问应用,如通过浏览器访问。Istio gateway 可以实现这一目的。
 
kubectl apply -n book -f samples/bookinfo/networking/bookinfo-gateway.yaml
 
输出结果:
gateway.networking.istio.io "bookinfo-gateway" created
 
确认gateway创建成功:
kubectl get gateway -n book
NAME               AGE
bookinfo-gateway   15h
 
也可以通过 istioctl 命令,验证 gateway和virtualservice 创建成功,具体命令如下所示:
 

 
前面,我们通过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}')
 
通过浏览器访问 ingress 服务
 
接下来就可以在浏览器的 URL 中使用 $INGRESS_HOST:$INGRESS_PORT(也就是 192.168.56.110:31380)进行访问,输入 http://192.168.56.110:31380/productpage 网址之后,显示信息如下:

 
如果刷新几次应用的页面,就会看到页面中会随机展示 reviews 服务的不同版本的效果(红色、黑色的星形或者没有显示)。reviews 服务出现这种情况是因为我们还没有使用 Istio 来控制版本的路由。
 
理解原理
Gateway 配置资源允许外部流量进入 Istio 服务网格,并使 Istio 的流量管理和策略功能可用于边缘服务。
在前面的步骤中,我们在 Istio 服务网格中创建了一个服务,并展示了如何将服务的 HTTP 端点暴露给外部流量。
 
=================================================
清理 Bookinfo 示例应用
结束对 Bookinfo 示例应用的体验之后,就可以使用下面的命令来完成应用的删除和清理了。
 
在 Kubernetes 环境中完成删除
1. 删除路由规则,并终结应用的 Pod
$ samples/bookinfo/platform/kube/cleanup.sh
 
* 确认应用已经关停 - 如果前面创建了namespace - book,则下面的命令也需要添加 -n book 参数。
$ istioctl get gateway #-- 此处应该已经没有 Gateway 
$ istioctl get virtualservices #-- 此处应该已经没有 VirtualService 
$ kubectl get pods #-- Bookinfo 的所有 Pod 应该都已经被删除
 
卸载 istio
使用kubectl 卸载 istio
kubectl delete -f install/kubernetes/istio-demo.yaml
 
手动清除额外的job 资源
kubectl -n istio-system delete job --all
 
删除CRD
kubectl delete -f install/kubernetes/helm/istio/templates/crds.yaml -n istio-system
 
参考链接:
注入 Istio sidecar
Install with helm
控制 Ingress 流量
Bookinfo 应用
Istio及Bookinfo示例程序安装试用笔记

部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0)的更多相关文章

  1. 基于Kubernetes集群部署skyDNS服务

    目录贴:Kubernetes学习系列 在之前几篇文章的基础,(Centos7部署Kubernetes集群.基于kubernetes集群部署DashBoard.为Kubernetes集群部署本地镜像仓库 ...

  2. 基于kubernetes集群部署DashBoard

    目录贴:Kubernetes学习系列 在之前一篇文章:Centos7部署Kubernetes集群,中已经搭建了基本的K8s集群,本文将在此基础之上继续搭建K8s DashBoard. 1.yaml文件 ...

  3. 安装istio v1.0 详细过程和步骤

      创建 istio 目录 [root@centos-110 ~]# mkdir istio [root@centos-110 ~]# cd istio   方案一: # 去下面的地址下载压缩包  # ...

  4. 二进制安装部署kubernetes集群---超详细教程

    本文收录在容器技术学习系列文章总目录 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建完成后整理的个人心得,分享给大家~~~ 本文所需的安装包,都上传在我的网盘中,需要的可以打赏博主一杯咖啡钱 ...

  5. 基于Kubernetess集群部署完整示例——Guestbook

    目录贴:Kubernetes学习系列 本文依赖环境:Centos7部署Kubernetes集群.基于Kubernetes集群部署skyDNS服务 该示例中,我们将创建一个redis-master.两个 ...

  6. K8s 二、(1、kubeadm部署Kubernetes集群)

    准备工作 满足安装 Docker 项目所需的要求,比如 64 位的 Linux 操作系统.3.10 及以上的内核版本: x86 或者 ARM 架构均可: 机器之间网络互通,这是将来容器之间网络互通的前 ...

  7. 为Kubernetes集群部署本地镜像仓库

    目录贴:Kubernetes学习系列 经过之前两篇文章:Centos7部署Kubernetes集群.基于kubernetes集群部署DashBoard,我们基本上已经能够在k8s的集群上部署一个应用了 ...

  8. Harbor快速部署到Kubernetes集群及登录问题解决

    Harbor(https://goharbor.io)是一个功能强大的容器镜像管理和服务系统,用于提供专有容器镜像服务.随着云原生架构的广泛使用,原来由VMWare开发的Harbor也加入了云原生基金 ...

  9. MindSpore部署图像分割示例程序

    MindSpore部署图像分割示例程序 本端侧图像分割Android示例程序使用Java实现,Java层主要通过Android Camera 2 API实现摄像头获取图像帧,进行相应的图像处理,之后调 ...

随机推荐

  1. Oier们的镜子(mirror)

    题解: 这题真是把我坑的很惨.. 题目看了很久才看懂.. 然后刚开始又没看见每个只能匹配一个这种条件 #include <bits/stdc++.h> using namespace st ...

  2. window与linux文件共享解决方案

    我的系统是windows7 x64,虚拟机上的linux系统是centos6.5 方法一: 1.在win7系统上建立一个用户 2.在f盘建立一个文件夹linuxshare,然后右击-属性-共享-高级共 ...

  3. spark批量写写数据到Hbase中(bulkload方式)

    1:为什么大批量数据集写入Hbase中,需要使用bulkload BulkLoad不会写WAL,也不会产生flush以及split. 如果我们大量调用PUT接口插入数据,可能会导致大量的GC操作.除了 ...

  4. lvs介绍

    1Linux集群及系统扩展的方式概述 集群是有多台服务器组织在一起,一起工作,因为单台服务器的并发响应能力是有限的,响应处理能力也是有限的所有有了集群的出现 在系统扩展有2种方法: 1 向上扩展:是指 ...

  5. Codeforces 911F Tree Destruction

    Tree Destruction 先把直径扣出来, 然后每个点都和直径的其中一端组合, 这样可以保证是最优的. #include<bits/stdc++.h> #define LL lon ...

  6. BZOJ1911 [Apio2010]特别行动队 - 动态规划 - 斜率优化

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 UPD(2018-04-01):用Latex重打了公式…… 题意概括 把一个整数序列划分成任意连续的段,使得划分出 ...

  7. P1057 传球游戏 dp

    题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:nn个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个 ...

  8. window.open 和showModalDialog的返回值

    方法: 1:  在父级页面 test.aspx 的点击<input type="button" id="btnShow" onclick="sh ...

  9. miniui中可以设置是否让页面进行分页 <div id="datagrid1" class="mini-datagrid" style="width:100%" allowAlternating="true" showpager="true"/> 就是设置showpager属性为true

    <div id="datagrid1" class="mini-datagrid" style="width:100%" allowA ...

  10. Scala-Unit5-Scala面对对象与模式匹配

    Java中的面向对象:万物皆对象. 我们要封装数据,定义模板等操作,素以我们需要面向对象. ====================================================== ...