istio是服务网格架构的一种
服务网格方案istio, linkerd, consul connect
服务网格架构如下图所示:
每个框相当于是一个app,旁边运行着一个sidecar,通过sidecar实现服务之间的交互,以及服务的熔断,故障修复,指标收集 监控,限流,访问控制,金丝雀发布等。
为啥用istio
有丰富的路由规则(virtual service)重试,故障注入,可对流量行为进行细粒度控制
可插入的策略层(支持插件)和配置API,支持访问控制。速率限制和配额
可以对出入集群入口出口所有流量的自动度量指标记录和追踪(在安装istio时启动jeager)
有强大的基于身份的验证和授权,在集群中实现安全的服务间通信。
可观察性
istio生成遥测数据,提供整个服务网格的可观测性
指标:istio基于 延迟 流量 错误 饱和生成了一系列服务指标,同时也为网格控制平面提供了更详细的指标。
分布式追踪: istio为每个服务生成了分布式追踪的span,ops可以理解网格内服务的depency和调用流程
访问日志:当流量进入网格服务时,istio可以生成每个请求的完整记录,包括源和目标的元数据。
istio架构演进
数据平面
由一组以sidecar方式部署的智能代理(envoy)组成。这些代理可以调节和控制服务之间的网格通信。
控制平面istiod
负责管理和配置代理来的路由流量,通过gateway中的selector中的label,匹配到比如ingressgateway-istio这个负责istio入栈流量的pod,从而将与gateway关联的virtual service中的route规则推送到这个运行了envoy的pod中去。
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: simple
spec:
gateways:
- simple #注明关联到gateway
hosts:
- simple.cncamp.io # 是转换到envoy中到domain,用于过滤,同时与gateway中到hosts必须相同
http:
- match:
- port: 80
route:
- destination:
host: simple.simple.svc.cluster.local #destination时对应一个service的域名,通过core-dns的dns记录,能够通过域名互通服务之间
port:
number: 80
---
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: simple
spec:
selector:
istio: ingressgateway #与ingressgateway-istio 这个pod关联将规则注入到改pod中,这个pod中运行了容器envoy
servers:
- hosts:
- simple.cncamp.io
port:
name: http-simple
number: 80 #对应listener的监听端口
protocol: HTTP
service and deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: simple
spec:
replicas: 1
selector:
matchLabels:
app: simple
template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "80"
labels:
app: simple
spec:
containers:
- name: simple
imagePullPolicy: Always
image: cncamp/httpserver:v1.0-metrics
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: simple
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: simple
通过crd资源的配置,以及gateway与ingressgateway-istio pod的关联,推送配置到envoy(增量更新),通过envoy的代理route中的destination(service 的域名)找到对应的service,负载均衡到pod上,envoy被注入到每个pod中,通过iptables规则捕获流量。注入sidecar到pod中并修改路由规则后,istio就能够调解所有流量。