《Istio:service Mesh 快速入门与实践》
pilot的配置内容会被转换为数据面能够理解的格式,下发给数据面的sidecar,sidecar根据pilot指令,将定义信息转换为本地配置,完成控制行为的落地。
1、用户通过kubectl、istioctl 在k8s上创建crd资源,对istio控制平面发出指令
2、pilot监听crd中的cofnig、rbac、networking、authentication资源,检测到资源对象的变更之后,针对涉及的服务,发出指令给对应服务的sidecar
3、sidecar根据这些指令更新自身配置,根据配置修正通信行为
预检和汇报
1、用户将Mixer配置发送到k8s中
2、Mixer通过对k8s资源的监听,获知配置的变量
3、网格中的服务在妹子调用之前,都向Mixer发出预检请求,查看调用是否允许执行。每次调用之后,都发出报告信息,向Mixer汇报在调用过程中产生的监控跟踪数据
包含多个Adapter的组件,用来处理在Mixer中接受的预检和报告数据
证书管理
Sidecar就是Istio中的数据面,负责控制对网格控制的实际执行
理论上只要支持Envoy的xDS协议,类似的反向代理软件就都可以代替Envoy
Istio 的默认实现中,利用istio-init初始化容器中的iptables指令,对所在pod的流量进行劫持,从而接管pod中应用的通信过程,如此获得通信的控制权,控制面的控制目的最终得以实现。
同一个pod内的多个容器之间,网格栈、数据卷是共享的
CRD :CustomResourceDefinition
Istio安装过程中会进行CRD的初始化,CRD在注册成功之后,会建立一些基础对象,完成istio的初始化设置
用户利用Istio控制微服务通信,是通过向k8s提交crd资源的方式完成的,
Istio中的资源分为:
流量管理功能
virtual Service是一个控制中心:
定义一组条件,将符合该条件的流量按照在对象中配置的对应策略进行处理,最后将路由转到匹配的目标中。
首先经过的设施都是Gateway,描述了边缘接入设备的概念,包含对开放端口、主机名及可能存在的TLS证书的定义。
网络边缘的Ingress流量,会通过对应的Istio Ingress Gateway Controller 进入
网格内部的服务互访则通过虚拟的mesh网关进行(mesh网关代表网格内部的所有Sidecar)
VirtualService组成:
路由对象目前可以是HTTP、TCP或者TLS中的一个,分别针对不通的协议进行工作。每种路由对象都至少包含两部分:匹配条件和目的路由
例如:
HTTP Route包含:
各协议路由的目标定义是一致的,由destinationWeight 对象数据来完成,可以按照权重进行流量分配
目标对象,由subset和port 两个元素组成
subset 就是指服务的一个子集,在k8s中代表使用标签选择器区分的不同pod
流量就是经过多个对象的逐级处理,成功达到了pod
config.istio.io中的对象用于为Mixer 组件提供配置
Mixer提供了预检和报告这两个功能,和大量的适配器
处理过程:
经过Handler实例化之后的Adapter ,就具备了工作功能,
Envoy 传出的数据将会通过这些具体运行的Adapter的处理,得到预检结果,或者输出各种监控、日志及跟踪数据。
Template
对接收到的数据进行再加工。
进入Mixer中的数据都来自SIdecar
这一组API用于定义认证策略。
在网格级别、命名空间级别、服务级别都提供了认证策略的要求,
要求再内容中包含服务间的通信认证,以及终端认证
涉及到的对象
policay:用于指定服务一级的认证策略,由策略目标和认证方法组成
MeshPolicy
只能被命名为default,代表是所有网格内部应用的默认认证策略。
其余部分内容和policy一致
在istio中实现了一个和k8s相似的RBAC 基于角色的访问控制系统,
主要对象为Service和ServiceRoleBinding
ServiceRole
由一系列规则rules组成
每条规则都对应一条权限,描述了权限所对应的服务、服务路径及方法。
还包含一组可以进行自定义的约束。
ServiceRoleBinding
该对象用于将用户主体和ServiceRole进行绑定