使用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: productpagelabels:app: productpage
spec:type: NodePortports:- port: 9080name: httpselector:app: productpage
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: productpage-v1
spec:replicas: 1template:metadata:labels:app: productpagetrack: stablespec:containers:- name: productpageimage: istio/examples-bookinfo-productpage-v1imagePullPolicy: IfNotPresentports:- 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: bookinfoannotations:kubernetes.io/ingress.class: "istio"
spec:rules:- http:paths:- path: /productpagebackend:serviceName: productpageservicePort: 9080- path: /loginbackend:serviceName: productpageservicePort: 9080- path: /logoutbackend:serviceName: productpageservicePort: 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提供了强大的工具,可以在整个企业中实施安全性,政策和合规性要求。

转载于:https://blog.51cto.com/jfrogchina/2047909

使用Istio Service Mash管理微服务相关推荐

  1. Istio:一个用于微服务间通信的服务网格开源项目

    http://www.infoq.com/cn/news/2017/05/istio Istio:一个用于微服务间通信的服务网格开源项目 Google.IBM和Lyft开源了微服务管理.保护和监控框架 ...

  2. Nacos微服务注册发现、配置和管理微服务

    目录 Nacos介绍 什么是 Nacos? Nacos 地图 Nacos 生态图 Nacos 概念 地域 可用区 接入点 命名空间 配置 配置管理 配置项 配置集 配置集 ID 配置分组 配置快照 服 ...

  3. Catalog Service - 解析微软微服务架构eShopOnContainers(三)

    上一篇我们说了Identity Service,因为其基于IdentityServer4开发的,所以知识点不是很多,今天我们来看下Catalog Service,今后的讲解都会把不同的.重点的拿出来讲 ...

  4. 中国重汽微服务管理_springcloud微服务架构实战:商家管理微服务设计

    商家管理微服务设计 商家管理微服务是一个独立的RESTAPI应用,这个应用通过接口服务对外提供商家信息管理.商家权限管理和菜单资源管理等方面的功能. 商家管理微服务开发在merchant-restap ...

  5. python自助电影售票机_Spring Cloud版——电影售票系统六使用 Spring Cloud Config 统一管理微服务配置...

    一. 为什么要统一管理微服务配置 在传统的单体应用,常使用配置文件管理所有配置.比如,一个 Spring Boot 开发的单体应用,可将配置内容放在 application.yml 文件中.如果需要切 ...

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

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

  7. istio概述,与微服务、云原生、k8s的关系

    1.1简单介绍istio 与k8s紧密结合,适用于云原生场景,service mesh形态,服务治理的开放平台 服务治理,包括:连接.安全.策略执行和可观察性. 连接:通过配置的流量规则控制服务间的流 ...

  8. 后台系统可扩展性学习笔记(七)Service Discovery与微服务

    文章目录 应用层 微服务架构 服务注册查询 Service Discovery 客户端 Service Discovery DNS-SD DNS-based Service Discovery 服务端 ...

  9. Netflix如何在上万台机器中管理微服务?(史上最全)

    疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 < Java 高并发 三部曲 > 面试必备 + 大厂必备 + 涨薪必备 疯狂创客圈 经典图书 : <N ...

最新文章

  1. Windows Server 2012 RS 配置IIS8.0+发布网站
  2. Spring Boot: Tuning your Undertow application for throughput--转
  3. 真正开始记录自己学习技术过程的点滴
  4. python实现一种检测postgresql数据库是否已经连接且为主节点的办法
  5. [置顶] SQL注入安全分析
  6. wxpy 实现微信机器人
  7. ButtonRenderer
  8. python去重复元素_Python实现去除列表中重复元素的方法总结【7种方法】
  9. java retry 设置上限_java-如何设置Spring Retry模板重试最大尝试次数:无限
  10. PostgreSQL学习的九层宝塔
  11. Css学习总结(5)——CSS常见布局方式
  12. RQNOJ 342 最不听话的机器人:网格dp
  13. Java排序算法——插入排序
  14. 独立开发一个完整的小程序,你想知道的流程
  15. DSP6678 中断程序
  16. 计算机科学与技术导论结课报告,计算机科学与技术导论课程报告.doc
  17. 前端工程师简历怎么写
  18. selenium网页截图总结
  19. 未能打开这台计算机的策略组对象,Windows7 组策略错误:“未能打开这台计算机上的组策略对象。您可能没有合适的权限。”...
  20. Simulation of Wrinkled Surfaces Revisited

热门文章

  1. 原子搜索优化算法ASO
  2. winform串口通过SCPI协议与数控电源M8811通信
  3. 华为设备配置| 高级ACL| 对五元组做配置
  4. 双11狂热背后的冷思考:传统零售的大数据、智能化转型才刚刚开始
  5. 镜头常用术语,参数说明和镜头焦距选择方法
  6. Python之父要退休了
  7. auc计算公式_图解机器学习的准确率、精准率、召回率、F1、ROC曲线、AUC曲线
  8. (附源码)php企业招聘网站 毕业设计222219
  9. Vue项目的记录(一)
  10. java 获取xml所有节点_获取XML下的所有节点(父节点及子节点)