istio流量管理:非侵入式流量治理
在服务治理中,流量管理是一个广泛的话题,一般情况下,常用的包括:
- 动态修改服务访问的负载均衡策略,比如根据某个请求特征做会话保持;
- 同一个服务有多版本管理,将一部分流量切到某个版本上;
- 对服务进行保护,例如限制并发连接数、限制请求数、隔离故障服务实例等;
- 动态修改服务中的内容,或者模拟一个服务运行故障等。
在Istio中实现这些服务治理功能时无须修改任何应用的代码。较之微服务的SDK方式,Istio以一种更轻便、透明的方式向用户提供了这些功能。用户可以用自己喜欢的任意语言和框架进行开发,专注于自己的业务,完全不用嵌入任何治理逻辑。只要应用运行在Istio的基础设施上,就可以使用这些治理能力。
总结Istio流量治理的目标:以基础设施的方式提供给用户非侵入的流量治理能力,用户只需关注自己的业务逻辑开发,无须关注服务访问管理。
istio流量治理的核心组件Pilot
在istio1.8中,istio的分为 envoy
(数据平面) 、istiod
(控制平面) 、addons
(管理插件) 及 istioctl
(命令行工具,用于安装、配置、诊断分析等操作)组成。
Pilot是Istio控制平面流量管理的核心组件,管理和配置部署在Istio服务网格中的所有Envoy代理实例。
pilot-discovery为envoy sidecar提供服务发现,用于路由及流量的管理。通过kubernetes CRD资源获取网格的配置信息将其转换为xDS接口的标准数据格式后,通过gRPC分发至相关的envoy sidecar
Pilot组件包含工作在控制平面中的 pilot-discovery
和工作与数据平面的pilot-agent
与Envoy(istio-proxy)
pilot-discovery主要完成如下功能:
- 从service registry中获取服务信息
- 从apiserver中获取配置信息。
- 将服务信息与配置信息适配为xDS接口的标准数据格式,通过xDS api完成配置分发。
pilot-agent 主要完成如下功能
基于kubernetes apiserver为envoy初始化可用的boostrap配置文件并启动envoy。
管理监控envoy的云兄状态及配置重载。
envoy
- 每个sidecar中的envoy是由pilot-agent基于生产的bootstrap配置进行启动,并根据指定的pilot地址,通过xDS api动态获取配置。
- sidecar形式的envoy通过流量拦截机制为应用程序实现入站和出站的代理功能。
Pilot的实现
在istio中的管理策略都是基于Kubernetes CRD的实现,其中有关于流量管理的CRD资源包括 VirtualService
EnvoyFilter
Gateway
ServiceEntry
Sidecar
DestinationRule
WorkloadEntry
WorkloadGroup
。reference istio-networking-crd-resouces
VirtualServices:用于定义路由,可以理解为envoy的
listener
=>filter
=>route_config
DestinationRule:用于定义集群,可以理解为envoy 的 cluster
Gateway:用于定义作用于
istio-ingress-gateway
ServiceEntry:用于定义出站的路由,作用于
istio-egress-gateway
EnvoyFilter:为envoy添加过滤器或过滤器链。
Sidecar:用于定义运行在sidecar之上的envoy配置。
Virtual Services和 Destination Rules是Istio流量路由功能的核心组件
istio流量流程概要
在控制面会经过如下流程:
- (1)管理员通过命令行或者API创建流量规则;
- (2)Pilot将流量规则转换为Envoy的标准格式;
- (3)Pilot将规则下发给Envoy。
在数据面会经过如下流程:
- (1)Envoy拦截Pod上本地容器的Inbound流量和Outbound流量;
- (2)在流量经过Envoy时执行对应的流量规则,对流量进行治理。
路由规则 :Virtual Services
VirtualServices
是istio用于在其运行平台Kubernetes定义的配置,用来影响流量的路由规则;其本质就是为集群中envoy提供路由配置的。
VirtualServices名词解释
VirtualServices中一些流量路由定义的关键术语。
Services:服务的唯一应用名称的单位,在Kubernetes之上 Services通常为Kubernetes Services资源。
Source:在上文中,下游发起请求的客户端服务。
Host:客户端请求服务时使用的地址
Service versions:service允许的不同版本的子集(通常为流量管理中的概念,如AB等)每个Service都有一个包含所有实例的默认版本。
VirtualServices资源说明
VirtualServices中主要有这些配置用于配置流量的路由定义。 reference virtual services
hosts:string[] 目标主机,可以是带有统配符的DNS Name或IP
gateways:string[],这些资源生效的网关和sidecar的名称。默认为名称空间级别,跨名称空间使用
<gateway namespace>/<gateway name>
mesh
默认值,表示生效与网格内所有sidecar仅应用于Gateway,该字段设置为Gateway的名称。
忽略此字段:将应用于网格内部所有的sidecar
http: HTTP协议流量的路由规则表。
- match:[] 匹配的条件。一个列表内单项内容的条件具有AND,整个列表的条件为OR。
- name:
- uri:匹配值区分大小写
exact:
精确匹配。prefix
:用于前缀匹配。regex
:基于正则表达式匹配。
- method:HTTP方法,参数与uri相同。
- ...
- route:[] 设置的http流量的转发规则
- destination:请求转发到的唯一标识符。
- host:允许平台及ServiceEntry的服务名称,Kubernetes中为短名称
reviews.default.svc.cluster.local
- subset,在DestinationRule中定义的子集
- port:可选,公开服务的端口
- host:允许平台及ServiceEntry的服务名称,Kubernetes中为短名称
- weight:转发流量的比例0-100 ,各目标的和应为100。
- headers:操作头规则。
- destination:请求转发到的唯一标识符。
- redirect:重定向规则
- delegate:只能在
Route
和Redirect
为空时设置,委托的VirtualServices
名称 - rewrite:重写HTTP URI。
- timeout:HTTP请求超时,默认禁用。
- retries:HTTP请求重试策略。
- fault:故障注入
- mirror:流量镜像
- mirrorPercentage:对应mirror的比例
- headers:操作http头的规则
- ...
- match:[] 匹配的条件。一个列表内单项内容的条件具有AND,整个列表的条件为OR。
tcp:TCP流量的路由规则的有序列表
exportTo:允许
VirtualServices
其他名称空间的sidecar与gateway使用。
VirtualServices配置实例
基于HTTP header的请求,将请求为/ratings/v2/
路径,并且请求头包含 end-user
值为jason
。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings-route
spec:
hosts:
- ratings.prod.svc.cluster.local
http:
- match:
- headers:
end-user:
exact: jason
uri:
prefix: "/ratings/v2/"
ignoreUriCase: true # 是否区分大小写,仅exact和prefix生效。
route:
- destination:
host: ratings.prod.svc.cluster.local
委托其他virtualServices处理
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "bookinfo.com"
gateways:
- mygateway
http:
- match:
- uri:
prefix: "/productpage"
delegate:
name: productpage
namespace: nsA
- match:
- uri:
prefix: "/reviews"
delegate:
name: reviews
namespace: nsB
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
namespace: nsA
spec:
http:
- match:
- uri:
prefix: "/productpage/v1/"
route:
- destination:
host: productpage-v1.nsA.svc.cluster.local
- route:
- destination:
host: productpage.nsA.svc.cluster.local
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
namespace: nsB
spec:
http:
- route:
- destination:
host: reviews.nsB.svc.cluster.local
目标规则:DestinationRule
DestinationRule定义在完成路由配置后应用于服务流量的策略,即如何将流量调度至集群内,可以理解为DestinationRule定义的是envoy中的cluster。应用的内容也是envoy中cluster段的配置,如负载均衡配置,sidecar连接值及离群检测。
DestinationRule字段说明
- host: 注册表中的服务名称,kubernetes平台中使用短名称
- trafficPolicy:应用的流量策略。
- loadBalancer:使用的负载均衡算法,
- simple
- ROUND_ROBIN
- LEAST_CONN
- RANDOM
- PASSTHROUGH
- simple
- connectionPool:一致性hash
- outlierDetection:离群值检测
- consecutiveGatewayErrors:满足502 503 504 错误数弹出。
- consecutive5xxErrors: 满足5xx错误数弹出。
- interval:探测时间间隔
- baseEjectionTime:最小逐出时间。主机被驱逐的时间等于
baseEjectionTime
* 退出次数。 - maxEjectionPercent:最大驱逐比例,默认10%。
- minHealthPercent:最少健康比例,默认为0%
- tls
- portLevelSettings
- loadBalancer:使用的负载均衡算法,
- subsets:[] 服务各个版本命名集。
- name:子集的名称
- labels:标签过滤器
- trafficPolicy:子集流量策略,继承DestinationRule级别流量策略。
- exportTo:跨名称空间使用。
DestinationRule配置实例
基于服务子集的配置
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_CONN
subsets:
- name: testversionv3
labels:
version: v3
- name: testversionv2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
配置离群值
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews-cb-policy
spec:
host: reviews.prod.svc.cluster.local
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http2MaxRequests: 1000
maxRequestsPerConnection: 10
outlierDetection:
consecutiveErrors: 7
interval: 5m
baseEjectionTime: 15m
集群网关入口:Gateway
Istio还提供了一种配置模型 Istio Gateway。Gateway
与 KubernetesIngress
相比,Gateway有高度的定制化与灵活性,并且允许将Istio功能应用于集群流量入口。
Gateway中运行的程序为envoy,它从控制平面接收相应的配置,并完成相关流量的传输;Gateway资源只负责网络入口点的相关功能,具体的路由实现则由VirtualService完成。
Gateway 配置说明
Gateway定义了一个集群入口的负载均衡器,该负载均衡为运行在网格的边缘代理,负责将外部流量引入集群的内部。
Gateway资源生效于Ingress
| Egress
Envoy Pod的标签选择器,使用selector定义:selector: app=istio-ingressgateway
。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: study-gateway
namespace: default
spec:
selector: # 基于名称空间中匹配pod的标签从而生效的应用
app: istio-ingressgateway # 标签可以是一个或多个
servers: # 描述对应的envoy的lintener的配置。
- port: # 设置envoy lintener
number: 90 # 端口号 (Required)
targetPort: # 可选 (Optional)
name: envoy_end # 分配给端口的标签。
protocol: HTTP # 端口服务协议,HTTP|HTTPS|GRPC|HTTP2|MONGO|TCP|TLS
hosts: [ "*" , "text.studyenvoy.com" ] # 设置dnsName 可选的名称空间,*|.
tls: # 与TLS相关的选项集 (Optional)
name: # 服务器的可选名称,必须唯一 (Optional)
Gateway配置实例
基于istio Bookinfo示例的Gateway资源清单。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
这里可以看到istio-ingress-gateway的pod的标签 app=istio-ingressgateway
[root@master01 ~]# kubectl get pods -n istio-system --show-labels
NAME READY STATUS RESTARTS AGE LABELS
istio-ingressgateway-78b47bc88b-xqqpn 1/1 Running 0 22d app=istio-ingressgateway,
chart=gateways,
heritage=Tiller, install.operator.istio.io/owning-resource=unknown,
istio.io/rev=default,istio=ingressgateway,
operator.istio.io/component=IngressGateways,
pod-template-hash=78b47bc88b,
release=istio,service.istio.io/canonical-name=istio-ingressgateway,
service.istio.io/canonical-revision=latest
外部服务引入配置:ServiceEntry
在Istio中提供了ServiceEntry,可将网格外的服务加入网格中,像网格内的服务一样进行管理。
在实现上就是把外部服务加入 Istio 的服务发现,这些外部服务因为各种原因不能被直接注册到网格中。
ServiceEntry字段说明
- host:与ServiceEntry关联的主机
- addresses:与服务关联的虚拟IP地址。
- ports:
- number:服务的端口。
- protocol:服务公开的协议。HTTP|HTTPS|GRPC|HTTP2|MONGO|TCP| TLS之一。
- targetPort:目标端口号。
- location:
MESH_EXTERNAL
|MESH_INTERNAL
,决定是网格内部还是外部。 - resolution:服务发现机制。
- NONE:
- STATIC:指定静态IP地址。
- DNS:通过DNS发现。
- endpoints:服务关联的端点,
workloadSelector
与endpoints
二选一。 - exportTo:共享其他名称空间
- subjectAltNames:如指定,将验证服务器证书的使用者备用名称是否与指定值之一匹配。
使用istio ingress gateway 配置一个网格外部的应用
部署应用程序
准备一个后端的应用
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpend-deply
namespace: kube-system
labels:
app: httpend-deply
spec:
replicas: 1
selector:
matchLabels:
app: httpend-deply
template:
metadata:
namespace: kube-system
name: httpend-deply
labels:
app: httpend-deply
spec:
containers:
- name: envoy-end
image: sealloong/envoy-end
imagePullPolicy: IfNotPresent
livenessProbe:
initialDelaySeconds: 3 # 首次探测延迟时间
periodSeconds: 2 # 定期重试
failureThreshold: 1 # 失败重试次数
httpGet:
port: 90
path: ping
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: envoy-end
labels:
app: envoy-end
namespace: kube-system
spec:
type: NodePort # nodeport是为了验证服务是否正常
ports:
- port: 90
name: envoy-end
targetPort: 90
nodePort: 30102
selector:
app: httpend-deply
应用Gateway和VirtualServices
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: envoyend-gateway
namespace: kube-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 1090
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: envoy-end
namespace: kube-system
spec:
hosts:
- "*"
gateways:
- envoyend-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: envoy-end
port:
number: 1090
应用DestinationRule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: envoy-end
namespace: kube-system
spec:
host: envoy-end
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
应用ServiceEntry
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: envoy-end
namespace: kube-system
spec:
hosts:
- "envoy-end"
ports:
- number: 90
name: http
protocol: HTTP
location: MESH_EXTERNAL
resolution: DNS
istio流量管理:非侵入式流量治理的更多相关文章
- 支付宝开源非侵入式 Android 自动化测试工具 Soloπ
Soloπ(SoloPi)是支付宝开源的一个无线化.非侵入式的Android自动化测试工具,公测版拥有录制回放.性能测试.一机多控三项主要功能,能为测试开发人员节省宝贵时间. 本文是SoloPi团队关 ...
- BlockCanary 一个轻量的,非侵入式的性能监控组件(阿里)
开发者博客: BlockCanary — 轻松找出Android App界面卡顿元凶 开源代码:moduth/blockcanary BlockCanary对主线程操作进行了完全透明的监控,并能输出有 ...
- 使用phpAnalysis打造PHP应用非侵入式性能分析器
使用phpAnalysis打造PHP应用非侵入式性能分析器,查找PHP性能瓶颈. 什么是phpAnalysis phpAnalysis是一款轻量级非侵入式PHP应用性能分析器,适用于开发.测试及生产环 ...
- Spring学习(1):侵入式与非侵入式,轻量级与重量级
一. 引言 在阅读spring相关资料,都会提到Spring是非侵入式编程模型,轻量级框架,那么就有必要了解下这些概念. 二. 侵入式与非侵入式 非侵入式:使用一个新的技术不会或者基本不改变原有代码结 ...
- 非侵入式JavaScript(Unobtrusive javaScript)理解
转载自 https://my.oschina.net/leegq/blog/279750 在Web的早期阶段,也就是在jQuery出现以前,在同一个文件中混杂JavaScript代码和HTML标记是非 ...
- MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式
MVC的验证(模型注解和非侵入式脚本的结合使用) @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...
- Spring 侵入式和非侵入式
1.非侵入式的技术体现 允许在应用系统中自由选择和组装Spring框架的各个功能模块,并且不强制要求应用系统的类必须从Spring框架的系统API的某个类来继承或者实现某个接口. 2.如何实现非侵入式 ...
- Spring框架是一种非侵入式的轻量级框架
摘自<Spring框架技术> Spring框架是一种非侵入式的轻量级框架 1.非侵入式的技术体现 允许在应用系统中自由选择和组装Spring框架的各个功能模块,并且不强制要求应用系统的类必 ...
- 侵入式&非侵入式
侵入式设计 引入了框架,对现有的类的结构有影响:即需要实现或继承某些特定类. 例如:Struts框架 非侵入式设计 引入了框架,对现有的类结构没有影响. 例如:Hibernate框架 / Spring ...
随机推荐
- python那些需要知道的事儿——内存泄漏
啥,内存也会泄露?漏了咋补?我的内存会不会越漏越小?咋一听到内存泄漏,本喵的脑子蹦出无数想法,所以到底啥是内存泄漏! 一.垃圾回收机制(GC)机制 在理解内存泄漏之前,需要补充一个知识,即GC机制(也 ...
- MySQL数据库高级二:索引优化
索引优化非常的重要 1.预热 java开发 DBA培训很少,需要经验磨练 索引优化的效果非常好 左外连接 MySQL没有全连接 7种join一定要会写 具体见武林的例子 union的字段顺序要相同 6 ...
- 05_pytorch的Tensor操作
05_pytorch的Tensor操作 目录 一.引言 二.tensor的基础操作 2.1 创建tensor 2.2 常用tensor操作 2.2.1 调整tensor的形状 2.2.2 添加或压缩t ...
- Civil3d中 如何用管轴线的变坡点桩号控制其他纵断面数据的显示?
如何用管轴线的变坡点桩号控制其他纵断面数据的显示?如下图所示: 主要进行两步操作,下面以地面高程为例. 第1步: 右键纵断面图,打开纵断面图特性对话框,选择"标注栏"选项卡,分别设 ...
- JAVAEE_Servlet_11_GetAndPost
Get请求和Post请求 * Get请求 和 Post请求各方面分析 - 什么情况下浏览器发送的是Get请求? 1. 通过浏览器的地址栏输入地址,所访问的URL都是get请求,如果以post定义,那么 ...
- G - Number Transformation(BFS+素数)
In this problem, you are given an integer number s. You can transform any integer number A to anothe ...
- Redis系统学习之SpringBoot集成Redis操作API(集成SpringDataRedis及其分析)
SpringDataRedis调用Redis底层解读 在SpringBoot2.X之前还是直接使用的官方推荐的Jedis连接的Redis 在2.X之后换为了lettuce Jedis:采用直接连接,多 ...
- php异常及错误信息捕获并记录日志实现方法全解析
php异常处理 什么是异常? PHP 5 提供了一种新的面向对象的错误处理方法.异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程.这种情况称为异常. 当异常被触发时,通常会发生: 当前代码 ...
- 【ShardingSphere】ShardingSphere学习(二)-核心概念-SQL
逻辑表 水平拆分的数据库(表)的相同逻辑和数据结构表的总称. 例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order. 真实表 在分片的数 ...
- 「跬步千里」详解 Java 内存模型与原子性、可见性、有序性
文题 "跬步千里" 主要是为了凸显这篇文章的基础性与重要性(狗头),并发编程这块的知识也确实主要围绕着 JMM 和三大性质来展开. 全文脉络如下: 1)为什么要学习并发编程? 2) ...