Istio介绍
Istio用于介绍微服务架构下的流量管理。它在服务之间引入一个透明的代理层,负责对微服务的流量管理、安全性、弹性和监控等。Istio提供了良好的可观察性和平台无关性。
Istio可以弥补k8s在服务治理上的缺点。
负载均衡
流量管控度量
故障恢复
灰度发布
可观察性(observability):全链路追踪、监控、数据收集,通过控制后台全面了解上行下行流量。
熔断器
熔断器(断路器)是一种保护机制,常用于避免服务雪崩效应。当系统中某个下游服务(比如服务 C)出现故障或者响应时间过长时,上游服务(服务 A 和服务 B)会因为等待下游服务的响应而占用更多的系统资源,进而可能导致整个系统资源耗尽,出现雪崩效应。
在微服务架构中,在高并发情况下,如果请求数量达到一定极限(可以自己设置阈值),超出了设 置的阈值,断路器会自动开启服务保护功能,然后通过服务降级的方式返回一个友好的提示给客户端。 假设当 10 个请求中,有 10%失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调 远程服务。直到 10s 钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开。
Envoy
Envoy是一个高性能的开源代理,用于管理服务之间的通信。Envoy作为一个边车代理被部署在每一个微服务旁边(通常是在同一个pod内,和应用容器一起运行)。这些边车代理会拦截服务之间的所有网络流量,并负责执行 Istio 的各种策略和功能,比如负载均衡、流量路由、熔断器、限流、监控和安全功能等,还可以按照比例分配流量等(这里的流量指的是请求流量)。
Pilot:负责将流量路由规则下发给 Envoy 代理,控制服务之间的流量。它负责envoy的服务发现,同时提供流量管理(A/B测试,金丝雀发布等),以及弹性功能(超时、重试、熔断)
Telemetry/Mixer:负责与 Envoy 协作,收集流量的遥测数据。
Citadel(现在的 Istio Agent):负责生成证书,用于 Envoy 之间的 mTLS 加密通信。
Galley:它使得Istio可以和kubernetes一起工作,因为他可以将不同的配置数据转换为Istio可以理解的通用格式。
如图可以看出,Istio的架构可以分为控制平面和数据平面:
在数据平面,k8s通过注入的方式将envoy和Pilot-Agent注入到业务pod里。
Istio工作原理
1. 代理注入
2.iptables拦截出入的流量,而业务容器没有感知
3. 使用Pilot去找到服务注册表里的服务。Pilot 是 Istio 控制平面的一部分,负责服务发现。它会与 Kubernetes 等平台集成,获取所有服务和实例的信息,并将这些信息下发给每个 Envoy 代理,让它们知道如何与其他服务通信。
4.服务发起方的envoy通过配置的负载均衡策略选择服务实例,并连接对应的服务地址。上图中envoy从pilot中获取forecast服务的负载均衡配置,并执行负载均衡策略。
5.frontend 服务侧的 Envoy 从 Pilot 中获取流量治理规则,并根据该流量治理规则将不同特征的流量分发到 forecast 服务的 v1 或 v2 版本。
6.访问的时候通过envoy进行双向认证和通道加密,同时可以根据服务的身份进行授权管理。其中Pilot下发安全相关配置,Citadel管理证书和密钥。
7.通过将Envoy的数据发送到管理平面的Mixer组件,从而进行监控。监控数据可以发送给prometheus等。
8.通过 Mixer 连接后端服务来控制服务间的访问,判断对访问是放行还 是拒绝,进行流量控制和访问控制。
9.在网格的入口处有一个 Envoy 扮演入口网关的角色。
IngressGateway
作为一个服务网格,Istio需要有一个入口,就是IngressGateway。
Gally
一个配置管理工具,它以服务的形式运行,持续监控k8s中istio的配置资源,验证并分发这些配置,它通过 Kubernetes 的 ValidatingWebhook 机制来对配置进行验证,确保用户提交的 Istio 配置是有效的、正确的,并且符合 Istio 的预期行为。
Gally使得Istio可用与kubernetes之外的其他环境一起工作,因为它可以将不同的配置数据转化为Istio可以理解的通用格式。
Citadel
名字来源于堡垒,象征着安全和保护。它在 Istio 中负责安全功能,特别是身份认证和证书管理,保护服务间的通信安全。
Istio部署
环境变量:将istio的压缩文件解压,并在解压文件的同名文件下(istio-1.10.1)将本文件夹加入系统环境变量:
export PATH=$PWD/bin:$PATH
然后,将 istioctl 可执行文件从 /root/istio-1.10.1/bin/ 目录拷贝到系统的 /usr/bin/ 目录中,从而在终端中全局使用 istioctl 命令。
cp -ar /root/istio-1.10.1/bin/istioctl /usr/bin/
随后上传镜像到各个工作节点,然后在master节点执行:
istioctl install --set profile=demo -y
则可以看到三个pod被成功部署:engressgateway,ingressgateway和istiod
[root@master ~]# kubectl get pods -n istio-system -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
istio-egressgateway-798787bd74-kj7tr 1/1 Running 0 22h 10.244.104.12 node2 <none> <none>
istio-ingressgateway-5d6489bf96-ps5t5 1/1 Running 0 22h 10.244.166.189 node1 <none> <none>
istiod-7d58bfb8-xtfjd 1/1 Running 0 22h 10.244.104.9 node2 <none> <none>