您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Istio+K8s,微服务的双剑合璧

时间:2020-08-08 10:49:47  来源:  作者:

转载于:https://mp.weixin.qq.com/s/dLSYkBH4wNwq2o2eTuVPAw

作者:jartto

本节篇幅较长,我们主要围绕以下几点来展开:

  • 什么是服务网格?
  • 初识 Istio
  • 核心特性
  • 流程架构
  • 核心模块
  • Envoy 进阶
  • 方案畅想

对许多公司来说,Docker 和 Kubernetes 这样的工具已经解决了部署问题,或者说几乎解决了。但他们还没有解决运行时的问题,这就是服务网格(Service Mesh)的由来。

什么是服务网格?

服务网格(Service Mesh)用来描述组成这些应用程序的微服务网络以及它们之间的交互。

它是一个用于保证服务间安全、快速、可靠通信的网络代理组件,是随着微服务和云原生应用兴起而诞生的基础设施层。

它通常以轻量级网络代理的方式同应用部署在一起。比如 Sidecar 方式,如下图所示:

Istio+K8s,微服务的双剑合璧

 

我们对上图做个解释:Service Mesh 设计一般划分为两个模块,控制面和数据面。对于应用来说,所有流量都会经过数据面进行转发。

顺利转发的前提:数据面需要知道转发的目标地址,目标地址本身是由一些业务逻辑来决定的(例如服务发现)。

所以自然而然地,我们可以推断控制面需要负责管理数据面能正常运行所需要的一些配置:

  • 需要知道某次请求转发去哪里:服务发现配置。
  • 外部流量进入需要判断是否已经达到服务流量上限:限流配置。
  • 依赖服务返回错误时,需要能够执行相应的熔断逻辑:熔断配置。

Serivce Mesh 可以看作是一个位于 TCP/IP 之上的网络模型,抽象了服务间可靠通信的机制。

但与 TCP 不同,它是面向应用的,为应用提供了统一的可视化和控制。

Service Mesh 具有如下优点:

  • 屏蔽分布式系统通信的复杂性(负载均衡、服务发现、认证授权、监控追踪、流量控制等等),服务只用关注业务逻辑。
  • 真正的语言无关,服务可以用任何语言编写,只需和 Service Mesh 通信即可。
  • 对应用透明,Service Mesh 组件可以单独升级。

Service Mesh 目前也面临一些挑战:

  • Service Mesh 组件以代理模式计算并转发请求,一定程度上会降低通信系统性能,并增加系统资源开销。
  • Service Mesh 组件接管了网络流量,因此服务的整体稳定性依赖于 Service Mesh,同时额外引入的大量 Service Mesh 服务实例的运维和管理也是一个挑战。

随着服务网格的规模和复杂性不断的增长,它将会变得越来越难以理解和管理。

Service Mesh 的需求包括服务发现、负载均衡、故障恢复、度量和监控等。

Service Mesh 通常还有更复杂的运维需求,比如 A/B 测试、金丝雀发布、速率限制、访问控制和端到端认证。

Service Mesh 的出现,弥补了 Kubernetes 在微服务的连接、管理和监控方面的短板,为 Kubernetes 提供更好的应用和服务管理。

Istio+K8s,微服务的双剑合璧

 

因此,Service Mesh 的代表 Istio 一经推出,就被认为是可以和 Kubernetes 形成双剑合璧效果的微服务管理的利器,受到了业界的推崇。

Istio 提供了对整个服务网格的行为洞察和操作控制的能力,以及一个完整的满足微服务应用各种需求的解决方案。

Istio 主要采用一种一致的方式来保护、连接和监控微服务,降低了管理微服务部署的复杂性。

初识 Istio

Istio 发音「意丝帝欧」,重音在意上。官方给出的 Istio 的总结,简单明了:

Istio lets you connect, secure, control, and observe services.

连接、安全、控制和观测服务。

Istio+K8s,微服务的双剑合璧

 

简单来说,Istio 针对现有的服务网格,提供一种简单的方式将连接、安全、控制和观测的模块,与应用程序或服务隔离开来,从而开发人员可以将更多的精力放在核心的业务逻辑上。

以下是 Istio 的核心功能:

  • HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡。
  • 通过丰富的路由规则、重试、故障转移和故障注入,可以对流量行为进行细粒度控制。
  • 可插入的策略层和配置 API,支持访问控制、速率限制和配额。
  • 对出入集群入口和出口中所有流量的自动度量指标、日志记录和追踪。
  • 通过强大的基于身份的验证和授权,在集群中实现安全的服务间通信。

从较高的层面来说,Istio 有助于降低这些部署的复杂性,并减轻开发团队的压力。

它是一个完全开源的服务网格,作为透明的一层接入到现有的分布式应用程序里。它也是一个平台,拥有可以集成任何日志、遥测和策略系统的 API 接口。

Istio 多样化的特性使我们能够成功且高效地运行分布式微服务架构,并提供保护、连接和监控微服务的统一方法。

核心特性

Istio 以统一的方式提供了许多跨服务网格的关键功能:

Istio+K8s,微服务的双剑合璧

 

①流量管理

Istio 简单的规则配置和流量路由允许我们控制服务之间的流量和 API 调用过程。

Istio 简化了服务级属性(如熔断器、超时和重试)的配置,并且让它轻而易举的执行重要的任务(如 A/B 测试、金丝雀发布和按流量百分比划分的分阶段发布)。

有了更好的对流量的可视性和开箱即用的故障恢复特性,我们就可以在问题产生之前捕获它们,无论面对什么情况都可以使调用更可靠,网络更健壮。

②安全

Istio 的安全特性解放了开发人员,使其只需要专注于应用程序级别的安全。

Istio 提供了底层的安全通信通道,并为大规模的服务通信管理认证、授权和加密。

有了 Istio,服务通信在默认情况下就是受保护的,可以在跨不同协议和运行时的情况下实施一致的策略,而所有这些都只需要很少甚至不需要修改应用程序。

Istio 是独立于平台的,可以与 Kubernetes(或基础设施)的网络策略一起使用。

但它更强大,能够在网络和应用层面保护 Pod 到 Pod 或者服务到服务之间的通信。

③可观察性

Istio 健壮的追踪、监控和日志特性让我们能够深入的了解服务网格部署。通过 Istio 的监控能力,可以真正的了解到服务的性能是如何影响上游和下游的。

而它的定制 Dashboard 提供了对所有服务性能的可视化能力,并让我们看到它如何影响其他进程。

Istio 的 Mixer 组件负责策略控制和遥测数据收集。它提供了后端抽象和中介,将一部分 Istio与后端的基础设施实现细节隔离开来,并为运维人员提供了对网格与后端基础实施之间交互的细粒度控制。

所有这些特性都使我们能够更有效地设置、监控和加强服务的 SLO。当然,底线是我们可以快速有效地检测到并修复出现的问题。

④平台支持

Istio 独立于平台,被设计为可以在各种环境中运行,包括跨云、内部环境、Kubernetes、Mesos 等等。

我们可以在 Kubernetes 或是装有 Consul 的 Nomad 环境上部署 Istio。

Istio 目前支持:

  • Kubernetes 上的服务部署。
  • 基于 Consul 的服务注册。
  • 服务运行在独立的虚拟机上。

⑤整合和定制

Istio 的策略实施组件可以扩展和定制,与现有的 ACL、日志、监控、配额、审查等解决方案集成。

流程架构

Istio 服务网格逻辑上分为数据平面(Control Plane)和控制平面(Data Plane),架构图如下所示:

Istio+K8s,微服务的双剑合璧

 

数据平面(Data Plane)

由一组以 Sidecar 方式部署的智能代理 Envoy 组成。Envoy 被部署为 Sidecar,和对应服务在同一个 Kubernetes pod 中。

这允许 Istio 将大量关于流量行为的信号作为属性提取出来,而这些属性又可以在 Mixer 中用于执行策略决策,并发送给监控系统,以提供整个网格行为的信息。

这些代理可以调节和控制微服务及 Mixer 之间所有的网络通信。

控制平面(Control Plane)

负责管理和配置代理来路由流量,此外配置 Mixer 以实施策略和收集遥测数据。

主要包含如下几部分内容:

  • Mixer:策略和请求追踪。
  • Pilot:提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。
  • Citadel:分发 TLS 证书到智能代理。
  • Sidecar injector:可以允许向应用中无侵入的添加功能,避免为了满足第三方需求而添加额外的代码。

核心模块

上文提到了很多技术名词,我们需要重点解释一下:

①什么是 Sidecar 模式?

Sidecar 是一种将应用功能从应用本身剥离出来作为单独进程的设计模式,可以允许向应用中无侵入的添加功能,避免为了满足第三方需求而添加额外的代码。

在软件架构中,Sidecar 附加到主应用,或者叫父应用上,以扩展、增强功能特性,同时 Sidecar 与主应用是松耦合的。

Sidecar 是一种单节点多容器的应用设计形式,主张以额外的容器来扩展或增强主容器。

②Envoy 的作用是什么?

Envoy 是一个独立的进程,旨在与每个应用程序服务器一起运行。

所有 Envoy组成了一个透明的通信网格,其中每个应用程序发送和接收来自本地主机的消息,并且不需要知道网络拓扑。

与传统的服务通信服务的库方法相比,进程外架构有两个实质性好处:

  • Envoy 支持任何编程语言写的服务。只用部署一个 Envoy 就可以在 JAVA、C++、Go、phpPython 等服务间形成网格。
  • 任何使用过大型面向服务的体系结构的人都知道,部署库升级可能会非常痛苦。Envoy 可以在整个基础设施中迅速部署和升级。

Envoy 以透明的方式弥合了面向服务的体系结构使用多个应用程序框架和语言的情况。

③Mixer

Mixer 是一个独立于平台的组件,负责在服务网格上执行访问控制和使用策略,并从 Envoy 代理和其他服务收集遥测数据,代理提取请求级属性,发送到 Mixer 进行评估。有关属性提取和策略评估的更多信息,请参见 Mixer 配置。

Mixer 中包括一个灵活的插件模型,使其能够接入到各种主机环境和基础设施后端,从这些细节中抽象出 Envoy 代理和 Istio 管理的服务。

④Pilot

控制面中负责流量管理的组件为 Pilot,它为 Envoy Sidecar 提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。

它将控制流量行为的高级路由规则转换为特定于 Envoy 的配置,并在运行时将它们传播到 Sidecar。

⑤Istio 如何保证服务通信的安全?

Istio 以可扩缩的方式管理微服务间通信的身份验证、授权和加密。Istio 提供基础的安全通信渠道,使开发者可以专注于应用层级的安全。

Istio 可以增强微服务及其通信(包括服务到服务和最终用户到服务的通信)的安全性,且不需要更改服务代码。

它为每个服务提供基于角色的强大身份机制,以实现跨集群、跨云端的互操作性。

如果我们结合使用 Istio 与 Kubernetes(或基础架构)网络政策,Pod 到 Pod 或者服务到服务的通信在网络层和应用层都将安全无虞。

Istio 以 google 的深度防御策略为基础构建而成,以确保微服务通信的安全。

当我们在 Google Cloud 中使用 Istio 时,Google 的基础架构可让我们构建真正安全的应用部署。

Istio 可确保服务通信在默认情况下是安全的,并且我们可以跨不同协议和运行时一致地实施安全政策,而只需对应用稍作调整,甚至无需调整。

Envoy 进阶

Istio 使用 Envoy 代理的扩展版本,Envoy 是以 C++ 开发的高性能代理,用于调解服务网格中所有服务的所有入站和出站流量。

Envoy 的许多内置功能被 Istio 发扬光大,例如:

  • 动态服务发现
  • 负载均衡
  • TLS 终止
  • HTTP2 & gRPC 代理
  • 熔断器
  • 健康检查、基于百分比流量拆分的灰度发布
  • 故障注入
  • 丰富的度量指标

Envoy 分为主线程、工作线程、文件刷新线程,其中主线程就是负责工作线程和文件刷新线程的管理和调度。

而工作线程主要负责监听、过滤和转发,工作线程里面会包含一个监听器,如果收到一个请求之后会通过过滤链来进行数据过滤。

前面两个都是非阻塞的,唯一一个阻塞的是这种 IO 操作的,会不断地把内存里面一些缓存进行落盘。

总结来说,我们可以围绕如下五方面:

①服务的动态注册和发现

Envoy 可以选择使用一组分层的动态配置 API 来进行集中管理。

这些层为 Envoy 提供了动态更新,后端群集的主机、后端群集本身、HTTP 路由、侦听套接字和通信加密。

为了实现更简单的部署,后端主机发现可以通过 DNS 解析 (甚至完全跳过) 完成,层也可以替换为静态配置文件。

②健康检查

构建 Envoy 网格的建议方法是将服务发现视为最终一致的过程。Envoy 包括一个运行状况检查子系统,该子系统可以选择对上游服务集群执行主动运行状况检查。

然后,Envoy 使用服务发现和运行状况检查信息的联合来确定健康的负载均衡服务器。Envoy 还支持通过异常检测子系统进行被动运行状况检查。

③高级负载均衡

分布式系统中不同组件之间的负载平衡是一个复杂的问题。

由于 Envoy 是一个独立的代理而不是库,因此它能够在一个位置实现高级负载平衡技术,并使任何应用程序都可以访问。

目前 Envoy 包括支持自动重试、断路、通过外部速率限制服务限制全局速率、请求隐藏和异常值检测。未来计划为 Request Racing 提供支持。

④前端/边缘系统代理支持

虽然 Envoy 主要是为服务通信系统而设计的,但对前端/边缘系统也是很有用的,如:可观测性、管理、相同的服务发现和负载平衡算法等。

Envoy 包含足够的功能,使其可用作大多数 Web 应用服务用例的边缘代理。这包括作为 TLS 的终点、HTTP/1.1 和 HTTP/2 支持,以及 HTTP L7 路由。

⑤最好的观察统计能力

Envoy 的首要目标是使网络透明。但是在网络级别和应用程序级都无法避免的容易出现问题。

Envoy 包含了对所有子系统的强有力的统计支持。statsd 和其他兼容的数据提供程序是当前支持的统计接收器,插入不同的统计接收器也并不困难。

Envoy 可以通过管理端口查看统计信息,还支持通过第三方供应商进行分布式追踪。

方案畅想

应用上面的原理,我们可以有很多具体的方案应用于日常开发。

方案一:应用 Istio 改造微服务

模仿在线书店的一个分类,显示一本书的信息。页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。

应用的端到端架构:Bookinfo 应用中的几个微服务是由不同的语言编写的。

这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。

Istio+K8s,微服务的双剑合璧

 

用 Istio 改造后架构如下:要在 Istio 中运行这一应用,无需对应用自身做出任何改变。我们只需要把 Envoy Sidecar 注入到每个服务之中。

最终的部署结果将如下图所示:

Istio+K8s,微服务的双剑合璧

 

所有的微服务都和 Envoy Sidecar 集成在一起,被集成服务所有的出入流量都被 Sidecar 所劫持。

这样就为外部控制准备了所需的 Hook,然后就可以利用 Istio 控制平面为应用提供服务路由、遥测数据收集以及策略实施等功能。

方案二:用 Istio 改造 CI/CD 流程

Istio+K8s,微服务的双剑合璧

 

对上述流程图简单解释一下:

  • 通过 Docker 对代码进行容器化处理。
  • 通过 Gitlab 托管代码。
  • Jenkins 监听 Gitlab 下的代码,触发自动构建,并执行 Kustomize 文件。
  • Kustomize 通过配置文件,设置了 Istio 的配置(染色识别、流量分发),并启动 K8s 部署应用。
  • 最终我们通过 Rancher 来对多容器进行界面化管理。
  • 打开浏览器进行访问。

看到这里,相信你也了解了,我们实现了一个前端多容器化部署的案例。

它有什么意义呢?

  • 首先,当然是环境隔离了,研发每人一个容器开发,互不干扰。
  • 其次,我们可以做很多小流量、灰度发布等事情。
  • 自动化部署,一站式的流程体验。

如果你对容器化还不太了解,请先看看前面两篇文章:

  • Docker 边学边用
  • 一文了解 Kubernetes

Istio 还是有很多可圈可点的地方,相信看到这里你也有了更全面的认识。如果你想深入了解,不妨仔细研究官方示例,并且在实际项目中不断打磨。



Tags:K8s   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
背景:目前prometheus 给pod的内存告警阀值设置的85%,由于JVM 设置最高申请内存为pod limit 的75%,通过arthas-boot查看到堆内存和元空间占用内存之和跟prometheus告警值不同。...【详细内容】
2021-09-16  Tags: K8s  点击:(104)  评论:(0)  加入收藏
近期由于工作原因,在项目支持的过程中,进行了一次K8S的基础环境部署,云平台一直是公司的重要底座,而我由于一系列原因,一直没有亲自尝试,通过本次的机会,让我重新做了一遍,也找到了...【详细内容】
2021-09-09  Tags: K8s  点击:(90)  评论:(0)  加入收藏
概述谷歌云使用先进的 Andromeda 网络来实现 VPC 内实例之间的相互访问,以及 Google Kubernetes Engine (GKE) 的 Pod 的跨节点互访,避免了配置静态路由或者 Overlay 网络带来...【详细内容】
2021-08-20  Tags: K8s  点击:(103)  评论:(0)  加入收藏
1.创建yaml模板 kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml 2.修改模板 vim web.yamlapiVersion: apps/v1kind: Deploymentmetadata:label...【详细内容】
2021-07-20  Tags: K8s  点击:(160)  评论:(0)  加入收藏
Jenkins 是目前最常用的持续集成工具,拥有近50%的市场份额,他还是很多技术团队的第一个使用的自动化工具。由此可见他的重要性!这份Jenkins宝典从入门介绍到结合Docker+SpringC...【详细内容】
2021-06-09  Tags: K8s  点击:(145)  评论:(0)  加入收藏
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具。这个工具能通过两条指令完成一个 kubernetes 集群的部署:# 创建一个 Master 节点$ kubeadm init # 将一...【详细内容】
2021-04-29  Tags: K8s  点击:(276)  评论:(0)  加入收藏
K8S 网络设计与实现是在学习 K8S 网络过程中总结的内容。本文按照 K8S 网络设计原则、Pod 内部网络、Pod 之间网络等几个步骤讲解 K8S 复杂的网络架构。 图片出自:《你女儿也...【详细内容】
2021-04-01  Tags: K8s  点击:(266)  评论:(0)  加入收藏
记录在 ubuntu-20.04.2-live-server系统上通过rancher安装k8s的过程。0. 更换阿里云软件源为了保障下载速度,将ubuntu软件源替换为阿里云软件源。如果网络通畅,可跳过。0.1....【详细内容】
2021-03-26  Tags: K8s  点击:(324)  评论:(0)  加入收藏
1.创建一个简单的应用程序在安装好Docker后,现在让我们来创建一个简单的应用程序。我们先创建一个简单的Node.js Web应用,然后将它打包到镜像中。该应用可以接受HTTP请求并返...【详细内容】
2021-03-10  Tags: K8s  点击:(219)  评论:(0)  加入收藏
一、日志收集的需求背景:• 业务发展越来越庞大,服务器越来越多​ • 各种访问日志、应用日志、错误日志量越来越多​ • 开发人员排查问题,需要到服务器上查日志,...【详细内容】
2021-03-05  Tags: K8s  点击:(189)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条