Istio一之Envoy工作原理
在学习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工作原理相关推荐
- Istio调用链埋点原理剖析—是否真的“零修改”?
前言 在Istio的实践中最近经常被问到一个问题,使用Istio做调用链用户的业务代码是不是完全0侵入,到底要不要修改业务代码? 看官方介绍: Istio makes it easy to creat ...
- Istio调用链埋点原理剖析—是否真的“零修改”分享实录
戳蓝字"CSDN云计算"关注我们哦! 来自:容器魔方 作者: idouba 本文整理自华为Cloud BU技术专家在K8S技术社上 关于Istio调用链的分享. 前言 大家好,我是 ...
- istio简介和基础组件原理(服务网格Service Mesh)
全栈工程师开发手册 (作者:栾鹏) 架构系列文章 微服务对于每个功能的开发细化了,但是对与系统的管理复杂度增强了,尤其是网络流量的管理. 试想一下:黑名单,导流,加密,访问控制,流量监控,熔断,限速, ...
- 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...
- 深入理解Nginx工作原理
1 反向代理 1.1 概念 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给intern ...
- 高频开关电源原理_程控开关电源的工作原理
本文介绍了开关电源的工作原理以及它的特点. 程控开关电源要要比线性电源复杂得多. 下图是典型的开关电源工作原理图. 首先对 220 V/50Hz 的 AC 输入,通过桥式整流器进行整流 储能电容对整流 ...
- Servlet生命周期与工作原理
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
- java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?
近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...
- linux网络管理原理,Linux__网络管理(物理层 数据链路层 网络层工作原理)
千锋云计算逆战班11点后打卡 今天学习后,进行复习下,物理层 数据链路层 网络层 的工作原理 物理层关心的两件事情:1.信号 2.介质 先说信号:信号分为模拟信号和数字信号 模拟信号: 模拟信号,不 ...
最新文章
- 【图灵】12月书讯:新书多娇
- [YTU]_2535( C++复数运算符重载(+与))
- (转)光照模型及cg实现
- 《计算机导论》微软ibm,3《计算机导论》第1章_认识计算机.pdf
- matlab编程数字信号,MATLAB--数字信号实验.doc
- 在Apache服务器上安装SSL证书
- php $表达式,PHP表达式概念及实例详解
- java 方法注释_Java注释,java方法注释详解
- 基于arm嵌入式linux毕业设计,本科毕业论文--基于arm的嵌入式系统设计.doc
- 高中生该怎样自学编程?
- 喝咖啡的好处和坏处及注意事项
- java面向对象实验结论及心得_20162305 实验二 Java面向对象程序设计 实验报告
- 微信小程序快速创建wxml、js、json、wxss新文件
- 分形之koch曲线生成
- 传奇服务器最多登录人数设置,传奇服务器中如何设置角色升级经验值数量
- 树莓派python版本的串口通信设置
- 计算机系新年寄语,经典新年寄语(精选50句)
- 柔性机器人力控打磨与刚性机器人打磨的主要区别
- 静走天后宫,食购十四涌
- day12-基本搜索