Istio Service Mash管理微服务

今天的文章通过Istio开源项目展示如何为Kubernetes管理的微服务提供可见性,弹性,安全性和控制。

服务是现代软件体系结构的核心。比起复杂庞大的整体,部署一系列模块化的小型(微型)服务能够使开发人员灵活地使用不同的语言、技术并能放缓节奏,并会有更高的生产力和更快的速度,特别是对于大团队,效果会更好。然而,随着微服务的采用,由于大型系统中存在大量的服务,就会出现新的问题,那就需要为每个服务处理一个复杂的问题,例如安全性,负载平衡,监控和速率限制。

Kubernetes和服务

Kubernetes 通过 Service 构造支持微服务架构。它允许开发人员将一组 Pod 的功能抽象出来,并通过定义良好的 API 将其展示给其他开发人员。它允许为这个抽象级别添加一个名称,并执行基本的L4负载平衡。但是它不能解决更高层次的问题,比如 L7 指标,流量分流,速率限制,断路等。

Istio团队在 GlueCon 2017大会上宣布,借助 Istio 通过 Service Mesh 框架从根本上解决了这些问题。开发人员可以实现微服务的核心逻辑,并让框架负责剩下的部分,如流量管理、服务发现、服务标识和安全以及策略实施。更好的是,对于现有的微服务,也可以这样做,而不用重写或重新编译它们的任何部分。Istio 使用 Envoy 作为其运行时代理组件,并提供一个允许全球跨领域政策执行和遥测收集的可扩展的中介层

当前版本的Istio是面向Kubernetes用户的,并且可以通过几行命令的安装方式进行打包,从而为Kubernetes中的微服务提供可视性,弹性,安全性和控制力。

在文章中,我们将看到由4个独立的微服务组成的简单应用程序。我们首先看看如何使用普通的Kubernetes部署应用程序。然后,我们将在不改变任何应用程序代码的情况下将完全相同的服务部署到Istio的群集中启用,并了解下我们该如何观察指标。

在后面的文章中,我们将重点介绍更高级的功能,如HTTP请求路由,策略,身份和安全管理。

示例应用程序:BookInfo

我们将使用一个简单的应用程序 BookInfo ,显示商店书籍的信息,评论和评分。该应用程序由四个以不同语言编写的微服务组成:

<img src="1.png"/>

因为这些微服务的容器镜像都可以在 Docker Hub 中找到,所以我们在Kubernetes中部署这个应用程序需要的就是 yaml 配置。 
值得注意的是,这些服务对 Kubernetes 和 Istio 没有依赖关系,但做了一个有趣的案例研究。特别是评论服务的众多服务,语言和版本使其成为一个有趣的 Service Mesh 示例。关于这个 例子 的更多信息可以在这里找到。

在Kubernetes中运行Bookinfo应用程序

在这篇文章中,我们将重点介绍应用的v1版本:

<img src="2.png"/>

使用Kubernetes进行部署非常简单,与部署其他服务无异。productpage 微服务的服务和部署资源如下所示:

apiVersion: v1
kind: Service
metadata:
name: productpage
labels:
app: productpage
spec:
type: NodePort
ports:
- port: 9080
name: http
selector:
app: productpage
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: productpage-v1
spec:
replicas: 1
template:
metadata:
labels:
app: productpage
track: stable
spec:
containers:
- name: productpage
image: istio/examples-bookinfo-productpage-v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080

如果我们想运行应用程序,我们需要部署的另外两个服务是详细信息和评论 v1 。我们目前不需要部署评级服务,因为评论服务 v1 不会使用它。其余的服务基本上与 productpage 遵循相同的模式。所有服务的yaml文件可以在这里 找到。

作为一个普通的Kubernetes应用程序运行服务:

kubectl apply -f bookinfo-v1.yaml

要从我们需要的NodePort地址的群集外部访问应用程序productpage服务

export BOOKINFO_URL=$(kubectl get po -l app=productpage -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc productpage -o jsonpath={.spec.ports[0].nodePort})

我们现在可以将浏览器指向http:// $ BOOKINFO_URL / productpage,并查看:

<img src="3.png"/>

使用 Istio 运行 Bookinfo 应用程序

现在我们已经看到了这个应用程序,我们稍微调整一下我们的部署,使其与Istio一起工作。 我们首先需要在我们的集群中安装Istio 。要查想看所有的指标和启用追踪功能,我们还可以安装可选的 Prometheus , Grafana 和 Zipkin 插件。 我们现在可以删除以前的应用程序,并使用完全相同的 yaml 文件再次启动 Bookinfo 应用程序,这次是 Istio :

kubectl delete -f bookinfo-v1.yaml
kubectl apply -f <(istioctl kube-inject -f bookinfo-v1.yaml)

需要注意,这次在创建部署之前我们使用 istioctl kube-inject 命令修改bookinfo-v1.yaml 文件。在这里 它记录注入 Envoy sidecar 到 Kubernetes pods 。因此,所有微服务都与Envoy sidecar 一起打包,管理服务的传入和传出流量

在Istio服务网格中,就像在普通的 Kubernetes 中一样,我们不会直接访问应用程序productpage,相反,我们希望在请求路径中使用 Envoy sidecar ,就像我们处理内部请求一样,以便我们可以使用 Istio 的管理功能(版本路由,断路器,策略等)来控制对 productpage 的外部调用。Istio 的 Ingress 控制器便用于此目的。

要使用 Istio Ingress控制器,我们需要为应用程序创建一个 Kubernetes Ingress 资源,并用 kubernetes.io/ingress.class 注释:“istio”,如下所示:

cat <<EOF | kubectl create -f -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: bookinfo
annotations:
kubernetes.io/ingress.class: "istio"
spec:
rules:
- http:
paths:
- path: /productpage
backend:
serviceName: productpage
servicePort: 9080
- path: /login
backend:
serviceName: productpage
servicePort: 9080
- path: /logout
backend:
serviceName: productpage
servicePort: 9080
EOF

Istio 和 Bookinfo app 的v1版本的结果部署如下所示:

<img src="4.png">

这次我们将使用 Istio Ingress 控制器的 NodePort 地址访问应用程序:

export BOOKINFO_URL=$(kubectl get po -l istio=ingress -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc istio-ingress -o jsonpath={.spec.ports[0].nodePort})

现在我们可以在 http:// $ BOOKINFO_URL / productpage 上看到页面,并再次看到正在运行的应用程序,而且与没有使用 Istio 的用户先前部署的应用应该没有什么不同。但是,现在应用程序正在 Istio 服务网格中运行,我们可以立即开始看到一些好处。

指标集合

我们从 Istio 开箱即可得到的第一件事就是在 Prometheus 中收集指标。这些指标由 Envoy 中的 Istio 过滤器生成,根据默认规则(可以自定义)收集,然后发送给 Prometheus 。指标可以在 Grafana 的 Istio 视图中可视化。请注意,尽管 Prometheus 是现成的默认指标后端,但 Istio 允许您使用其他的,我们将在以后的博客文章中演示。

为了演示,我们将开始运行以下命令来在应用程序上生成一些负载:

wrk -t1 -c1 -d20s http:// $ BOOKINFO_URL / productpage

我们获得 Grafana 的 NodePort URL:

export GRAFANA_URL=$(kubectl get po -l app=grafana -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc grafana -o jsonpath={.spec.ports[0].nodePort})

我们现在可以在浏览器打开 http:// $ GRAFANA_URL / dashboard / db / istio-dashboard ,并检查每个 Bookinfo 服务的各种性能指标:

<img src="5.png"/>

分布式跟踪

我们从Istio获得的下一个功能是使用Zipkin进行跟踪。我们获得它的NodePort URL:

export ZIPKIN_URL=$(kubectl get po -l app=zipkin -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc zipkin -o jsonpath={.spec.ports[0].nodePort})

现在我们可以通过浏览器打开 http:// $ ZIPKIN_URL / 来查看通过Bookinfo服务的请求跨度跟踪。

<img src="6.png">

尽管 Envoy 代理将跟踪跨度发送到 Zipkin 开箱即用,为了充分利用其功能,应用程序需要 Zipkin 获取到并转发一些头部以将各个跨度绑定在一起。有关详细信息,请参阅zipkin-tracing

指标整体总结

Istio 提供的指标不仅仅是一种便利。它们通过生成统一的度量标准来提供服务网格的一致视图。我们不必担心协调各种代理运行时发出的不同类型的指标,或者添加任意代理来收集传统的未配置的应用程序的指标。我们也不再需要依靠开发过程来正确地测试应用程序来生成度量标准。服务网格可以查看所有流量,甚至可以查看传统的“黑匣子”服务,并生成所有流量的度量标准。

概要

Google ,IBM 和 Lyft 自豪地宣布 Istio :一个开源项目,提供统一的连接,安全,管理和监控微服务的方。 目前的版本针对Kubernetes环境; 打算在未来几个月内为虚拟机和Cloud Foundry等其他环境增加支持。 Istio将流量管理添加到微服务中,并为增值功能(如安全性,监控,路由,连接管理和策略)创造了基础。 该软件使用来自Lyft的经过测试的特使代理构建,并提供对流量的可见性和控制,而不需要对应用程序代码进行任何更改。 Istio为CIO提供了强大的工具,可以在整个企业中实施安全性,政策和合规性要求。

作者:靳日阳,JFrog 研发工程师

具有多年软件开发经验;对Java主流技术、前沿框架都具有丰富的开发经验;擅长Linux服务器,对优化,部署等有深入研究,熟悉Jenkins,持续集成及交付,DevOps等。
欢迎转载,但转载请注明作者与出处。谢谢!

Istio Service Mash管理微服务的更多相关文章

  1. SpringCloud微服务实战——搭建企业级开发框架(九):使用Nacos发现、配置和管理微服务

    Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台,Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置 ...

  2. 9.Spring Cloud Config统一管理微服务配置

    Spring Cloud Config统一管理微服务配置 9.1. 为什么要统一管理微服务配置 9.2. Spring Cloud Config简介 Spring Cloud Config为分布式系统 ...

  3. springcloud(十二)-springcloud-config统一管理微服务配置

    1.为什么要统一管理微服务配置 对于传统的单体应用,常使用配置文件管理所有配置.例如一个SpringBoot开发的单体应用,可将配置内容放在application.yml文件中.如果需要切换环境,可设 ...

  4. SpringCloud Alibaba实战(7:nacos注册中心管理微服务)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经完成了Nacos Server的本地部署,这一节我们学习如何将Nac ...

  5. 与IBM的Lin Sun关于Istio 1.0和微服务的问答

    北京时间 7 月 31 日,Istio 正式发布了 1.0 版本,并表示已经可用于生产环境.该版本的主要新特性包括跨集群 mesh 支持.细粒度流量控制以及在一个 mesh 中增量推出 mutual ...

  6. Istio 知多少 | 下一代微服务的守护者

    1. 引言 在写完eShopOnContainers 知多少[12]:Envoy gateways后,就一直想进一步探索Service Mesh,最近刚在极客时间上学完<Service Mesh ...

  7. ELK-6.5.3学习笔记–使用filebeat管理微服务日志

    微服务日志打印. 转载于http://www.eryajf.net/2369.html 上边是输出了nginx日志,从而进行展示,以及各种绘图分析,而现在的需求是,要将微服务当中的日志汇总到elk当中 ...

  8. 为什么Dapr是比SpringCloud和Istio更优雅的微服务框架?

    Dapr 是微软主导的云原生开源项目,2019年10月首次发布,到正式发布 V1.0 版本的不到一年的时间内,github star 数达到了 1.2万(现在已经超过1.7万星),超过同期的 kube ...

  9. 后台管理微服务(二)——docker的使用

    1. docker概述 1.1 Docker是什么 Docker 是软件工业的集装箱技术 Docker 是一个容器引擎,docker提供了一套完整的容器解决方案. Docker 是一个能将开发的程序自 ...

随机推荐

  1. 3.Linux系统信息

    arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI ...

  2. luogu 3393 逃离僵尸岛

    题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...

  3. POJ 3670 DP LIS?

    权值为1~3 好了 此题是水题-- i表示到了第i个数,j表示结尾的数是j f[i][j]=min(f[i][j],f[i-1][k]+(a[i]!=j)) 1<=k<=j 最长上升的. ...

  4. 在cncc的最后几天的笔记

    数据库范式:http://blog.csdn.net/fg2006/article/details/6936439 数据库事务隔离级别:http://blog.csdn.net/fg2006/arti ...

  5. realm怎样支持hashmap

    realm不支持hashmap这种形式stackoverflow给出了解决方案http://stackoverflow.com/ques... class MyData extends RealmOb ...

  6. 以下三种下载方式有什么不同?如何用python模拟下载器下载?

    问题始于一个链接https://i1.pixiv.net/img-zip-...这个链接在浏览器打开,会直接下载一个不完整的zip文件 但是,使用下载器下载却是完整文件 而当我尝试使用python下载 ...

  7. UI Framework-1: UI Development Practices

    UI Development Practices Guidelines Principles for developing for Chrome. These best practices cente ...

  8. [POI2011]MET-Meteors(整体二分+树状数组)

    题意 给定一个环,每个节点有一个所属国家,k次事件,每次对[l,r]区间上的每个点点权加上一个值,求每个国家最早多少次操作之后所有点的点权和能达到一个值 题解 一个一个国家算会T.这题要用整体二分.我 ...

  9. Kubernetes安装配置(包括master和node)

    部署Kubernetes云计算平台,至少准备两台服务器,此处为4台,包括一台Docker仓库: Kubernetes Master节点:192.168.124.20 Kubernetes Node1节 ...

  10. Java基础学习总结(20)——基础语法

    一.标识符 二.关键字 三.JAVA基础数据类型 3.1. java常量 3.2. java变量 从本质上来讲,变量其实是内存里面的一小块区域,一个程序在运行的时候,实际上这个程序是位于内存里面,然后 ...