在学习istio前先了解两个术语服务网格(Service Mesh)和sidecar。
服务网格(Service Mesh):用于描述构成这些应用程序的微服务网络以及应用之间的交互。它的需求包括服务发现、负载均衡、故障恢复、指标收集和监控等。或者是更复杂运维需求,例如A/B测试、金丝雀发布、限流、访问控制和端到端认证等。服务网格如下图所示


SideCar:将应用程序的功能划分为单独的进程可以被视为 Sidecar 模式。Sidecar 模式允许您在应用程序旁边添加更多功能,而无需额外第三方组件配置或修改应用程序代码。就像连接了 Sidecar的三轮摩托车一样,在软件架构中, Sidecar 连接到父应用并且为其添加扩展或者增强功能。Sidecar应用与主应用程序松散耦合。它可以屏蔽不同编程语言的差异,统一实现微服务的可观察性、监控、日志记录、配置、断路器等功能。sidecar如下图所示

要实现服务网格管理,有多个工具可以支持,如下图所示,绿色表示横向对比时支持的突出能力。

为什么会选择istio呢?istio主要有如下突出优势:

  • 支持HTTP、gRPC、WebSocket和TCP流量的自动负载均衡。
  • 提供丰富的路由规则、重试、故障转移、故障注入能力,可以对流量进行细颗粒度的控制。
  • 对出入集群入口和出口中所有流量进行自动指标度量、日志记录和跟踪。
  • 提供强大的基于身份验证和授权的能力,实现集群中服务间通信安全。

Istio的三个核心特性是流量管理、安全、可观测性。

流量管理:Istio 简单的规则配置和流量路由允许您控制服务之间的流量和 API 调用过程。Istio 简化了服务级属性(如熔断器、超时和重试)的配置,并且让它轻而易举的执行重要的任务(如 A/B 测试、金丝雀发布和按流量百分比划分的分阶段发布)。

安全:Istio解放了开发人员,使其只需专注于应用程序级别的安全。Istio 提供了底层的安全通信通道,并为大规模的服务通信管理认证、授权和加密。有了 Istio,服务通信在默认情况下就是受保护的,可以让您在跨不同协议和运行时的情况下实施一致的策略——而所有这些都只需要很少甚至不需要修改应用程序。Istio 是独立于平台的,可以与 Kubernetes(或基础设施)的网络策略一起使用。但它更强大,能够在网络和应用层面保护pod到 pod 或者服务到服务之间的通信。

可观测:Istio 健壮的追踪、监控和日志特性让您能够深入的了解服务网格部署。
指标:istio基于4个监控的黄金指标(延迟、流量、错误、饱和)生成一系列的服务指标。
分布式追踪:istio为每个服务生成分布式追踪span,运维人员可以获取到网格内服务的依赖和调用流程。
访问日志:所有流入网格服务的请求,istio生成每个请求的完整记录,包括源、目标元数据。

istio包括数据平面和控制平面,数据平面由一组以sidecar方式部署的智能代理(Envoy)组成,这些代理可以调节和控制微服务以及Mixer之间所有的网络通信。控制平面负责管理和配置代理的流量,此外控制平面配置Mixer以实施策略和收集遥测数据。其中Envoy是非常关键的组成部分,主流的7层代理有多种工具支持,具体如下所示:

那为什么Istio会选择Envoy作为数据平面呢?主要是因为Envoy有如下优势:

性能:Envoy在提供极高吞吐量和低尾部延迟差异时,CPU和RAm消耗相对较少。
可扩展:Envoy在L4和L7都提供了丰富的可插拔过滤能力,让用户可以轻松添加开源版本中没有的能力。
API可配置:Envoy提供了一组可以通过控制平台服务实现的管理API,从而使得Envoy无需重新启动即可刷新配置。
另外,Envoy采用单进程多线程模式,建议Envoy配置的worker数量与Envoy所在的硬件线程数一致。上面介绍了Envoy的理论知识,接下来看看Envoy的配置。static_resource下面有三个关键配置,listener,route_config,cluster这里Listener监听10000端口号,route配置是如果请求是“/”那么发送的targetCluster进行处理(需要注意:Envoy中cluster的概念是一组IP地址的集合)

static_resources:listeners:- name: listener_0address:socket_address: { address: 0.0.0.0, port_value: 10000 }filter_chains:- filters:- name: envoy.http_connection_managerconfig:codec_type: autostat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: backenddomains:- "*"routes:- match:prefix: "/"route:cluster: targetClusterhttp_filters:- name: envoy.router

接着还需要定义cluster的信息,模版如下所示

clusters:
- name: targetClusterconnect_timeout: 0.25stype: STRICT_DNSdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINhosts: [{ socket_address: { address: 172.17.0.3, port_value: 80 }},{ socket_address: { address: 172.17.0.4, port_value: 80 }}]

介绍完Envoy的配置后,接下来通过一个实际例子来看看Envoy的工作过程。首先部署一个simple的服务。

apiVersion: apps/v1
kind: Deployment
metadata:name: simple
spec:replicas: 1selector:matchLabels:app: simpletemplate:metadata:annotations:prometheus.io/scrape: "true"prometheus.io/port: "80"labels:app: simplespec:containers:- name: simpleimagePullPolicy: Alwaysimage: cncamp/httpserver:v1.0-metricsports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: simple
spec:ports:- name: httpport: 80protocol: TCPtargetPort: 80selector:app: simple

Envoy服务自身的Deployment yaml文件,通过这个文件让Envoy服务启动。 Pod启动时加载静态的Envoy配置文件信息,配置文件信息通过configmap的形式mount到/etc/envoy目录下。

apiVersion: apps/v1
kind: Deployment
metadata:labels:run: envoyname: envoy
spec:replicas: 1selector:matchLabels:run: envoytemplate:metadata:labels:run: envoyspec:containers:- image: envoyproxy/envoy-devname: envoyvolumeMounts:- name: envoy-configmountPath: "/etc/envoy"readOnly: truevolumes:- name: envoy-configconfigMap:name: envoy-config

下面是Envoy的配置信息,配置信息里面的routes定义的也是“/”,cluster的address是simple,即当有请求发送到Envoy的10000端口时,请求的URL包含“/”,请求会被转发到simple这个service处理。即上面创建的service。Envoy的配置信息存放到ConfigMap中。

kubectl create configmap envoy-config --from-file=envoy-config.yaml

admin:address:socket_address: { address: 127.0.0.1, port_value: 9901 }static_resources:listeners:- name: listener_0address:socket_address: { address: 0.0.0.0, port_value: 10000 }filter_chains:- filters:- name: envoy.filters.network.http_connection_managertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerstat_prefix: ingress_httpcodec_type: AUTOroute_config:name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]routes:- match: { prefix: "/" }route: { cluster: some_service }http_filters:- name: envoy.filters.http.routertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Routerclusters:- name: some_serviceconnect_timeout: 0.25stype: LOGICAL_DNSlb_policy: ROUND_ROBINload_assignment:cluster_name: some_serviceendpoints:- lb_endpoints:- endpoint:address:socket_address:address: simpleport_value: 80

创建完成后,可以看到envoy的pod成功启动,此时访问envoy pod的IP地址+10000端口,和访问simple service的结果一致,说明当请求发到了envoy,envoy根据route配置将请求转发到后面的服务进行处理。结果如下图所示,启动的envoy pod的ip地址是10.20.1.119,访问该ip地址的1000端口,请求的URL是/hello,返回了请求响应信息,该响应信息和直接访问simple service的结果一致。

通过上面的例子演示了如果通过envoy完成代理转发请求的过程,更多关于envoy的配置说明可查看官网信息。

Istio一之Envoy工作原理相关推荐

  1. Istio调用链埋点原理剖析—是否真的“零修改”?

    前言 在Istio的实践中最近经常被问到一个问题,使用Istio做调用链用户的业务代码是不是完全0侵入,到底要不要修改业务代码? 看官方介绍: Istio makes it easy to creat ...

  2. Istio调用链埋点原理剖析—是否真的“零修改”分享实录

    戳蓝字"CSDN云计算"关注我们哦! 来自:容器魔方 作者: idouba 本文整理自华为Cloud BU技术专家在K8S技术社上 关于Istio调用链的分享. 前言 大家好,我是 ...

  3. istio简介和基础组件原理(服务网格Service Mesh)

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 微服务对于每个功能的开发细化了,但是对与系统的管理复杂度增强了,尤其是网络流量的管理. 试想一下:黑名单,导流,加密,访问控制,流量监控,熔断,限速, ...

  4. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...

  5. 深入理解Nginx工作原理

    1 反向代理 1.1 概念 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给intern ...

  6. 高频开关电源原理_程控开关电源的工作原理

    本文介绍了开关电源的工作原理以及它的特点. 程控开关电源要要比线性电源复杂得多. 下图是典型的开关电源工作原理图. 首先对 220 V/50Hz 的 AC 输入,通过桥式整流器进行整流 储能电容对整流 ...

  7. Servlet生命周期与工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  8. java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...

  9. linux网络管理原理,Linux__网络管理(物理层 数据链路层 网络层工作原理)

    千锋云计算逆战班11点后打卡 今天学习后,进行复习下,物理层 数据链路层  网络层 的工作原理 物理层关心的两件事情:1.信号 2.介质 先说信号:信号分为模拟信号和数字信号 模拟信号: 模拟信号,不 ...

最新文章

  1. 【图灵】12月书讯:新书多娇
  2. [YTU]_2535( C++复数运算符重载(+与))
  3. (转)光照模型及cg实现
  4. 《计算机导论》微软ibm,3《计算机导论》第1章_认识计算机.pdf
  5. matlab编程数字信号,MATLAB--数字信号实验.doc
  6. 在Apache服务器上安装SSL证书
  7. php $表达式,PHP表达式概念及实例详解
  8. java 方法注释_Java注释,java方法注释详解
  9. 基于arm嵌入式linux毕业设计,本科毕业论文--基于arm的嵌入式系统设计.doc
  10. 高中生该怎样自学编程?
  11. 喝咖啡的好处和坏处及注意事项
  12. java面向对象实验结论及心得_20162305 实验二 Java面向对象程序设计 实验报告
  13. 微信小程序快速创建wxml、js、json、wxss新文件
  14. 分形之koch曲线生成
  15. 传奇服务器最多登录人数设置,传奇服务器中如何设置角色升级经验值数量
  16. 树莓派python版本的串口通信设置
  17. 计算机系新年寄语,经典新年寄语(精选50句)
  18. 柔性机器人力控打磨与刚性机器人打磨的主要区别
  19. 静走天后宫,食购十四涌
  20. day12-基本搜索

热门文章

  1. python爬虫爬取王者荣耀官网全部装备图片(源码分享)
  2. Android判断后台服务(Service)是否运行
  3. 2022-2027年中国数码印花行业市场调研及未来发展趋势预测报告
  4. 基于matlab量化投资策略,【Matlab量化投资】支持向量机择时策略
  5. 元素浮动布局,微信聊天框
  6. 个人所得税年度应纳税额抵扣3600(0成本)
  7. 读书笔记:《把时间当做朋友》
  8. Sublime Text3 3143,3126 注册码,亲测可用!
  9. ECharts系列 - 地图 实例一
  10. JAVA日志MDC追踪快速定位问题源头