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. 【DNN 系列】 下载安装

    1.下载 http://dotnetnuke.codeplex.com/releases/view/119857 2.安装 下载完毕 因为 IIS 7 采用了更安全的 web.config 管理机制, ...

  2. EasyUI--Alert()

    1.$.messager.alert(title, msg, icon, fn) 2 <script type="text/javascript"> $(functio ...

  3. 关于vsphere的 许可证配置问题

    exsi未获得许可情况: exsi的许可证: vcenter server 未获许可: vcenter server的许可证: 写在最后: 无所不能的中国人,百度一下  许可证 就什么多有了,佩服,佩 ...

  4. RSA不对称加密

    package sinRsa; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io ...

  5. Vue总结(二)

    原始引用:开发时使用开发版本,线上使用生产版本. 原始引用到html中,在浏览器中控制台输入Vue,输出一个函数就可以. defineProperties实现的数据绑定. //defineProper ...

  6. react 中间件相关的一些源码解析

    零.随便说说中间件 在react的使用中,我们可以将数据放到redux,甚至将一些数据相关的业务逻辑放到redux,这样可以简化我们组件,也更方便组件抽离.封装.复用,只是redux不能很好的处理异步 ...

  7. HDU-4310 Hero 贪心问题

    题目链接:https://cn.vjudge.net/problem/HDU-4310 题意 打dota,队友太菜,局势变成1vN.还好你开了挂,hp无限大(攻击却只有一点每秒-_-). 但是你并不想 ...

  8. HDU-2045 不容易系列之(3)—— LELE的RPG难题 找规律&递推

    题目链接:https://cn.vjudge.net/problem/HDU-2045 找规律 代码 #include <cstdio> long long num[51][2]; int ...

  9. java源码学习

    Collection List ArrayList LinkedList Vector Stack Set HashSet TreeSet Map HashMap TreeMap LinkedHash ...

  10. HTML学习----------DAY2第六节

    在 HTML 文档中,标题很重要. HTML 标题 标题(Heading)是通过 <h1> - <h6> 等标签进行定义的. <h1> 定义最大的标题.<h6 ...