一、简介
Istio向应用中注入了istio-init和istio-proxy两个sidecar容器,Pilot-agent正是istio-proxy容器的启动命令入口。通过kubectl可以看到,在istio-proxy容器中一共有pilot-agent和Envoy两个进程,pilot-agent正是Envoy的父进程。
pilot-agent除了启动Envoy进程,还可以代理应用的健康检查,代理xDS请求,Local DNS服务,像kubelet一样支持WorkloadEntry的健康检查。
二、Pilot-agent的核心架构
(1) Envoy Agent:Envoy代理守护模块,主要职责是根据进程启动参数和环境变量等输入构建Envoy Bootstrap文件;然后运行子进程Envoy并负责等待其退出。
(2) xDS Proxy: 主要用来代理xDS请求,还支持把健康检查的结果上报给Istiod
(3)SDS 服务器:由Node Agent合并而来,是工作负载的证书提供者,通过SDS接口向Envoy提供证书,并且负责证书轮转。
(4)DNS服务器:处理本地应用DNS的解析请求针对虚拟机应用和ServiceEntry定义的服务网格外部服务。
(5) App Prober: 用来代理Kubelet的Readiness Probe和Liveness Probe,可以避免Envoy对流量进行拦截导致的健康检查失败问题。
(6) HealthChecker: 周期性执行健康检查,通过xDS Proxy将健康检查结果上报给Istiod。
三、Pilot-agent的原理
1.Envoy的启动
生成Bootstrap配置文件 ,准备Envoy参数列表 ,创建exec.Cmd启动对象,并且通过其Start方法启动Envoy进程。
2.Envoy异常退出流程
Envoy Agent执行清理工作,清理Boostrap文件,发送退出通知;Envoy Agent主线程监听退出通知队列,接收到退出通知后,自己主动退出,Pilot agent主进程结束。
3.优雅退出
Sidecar 优雅退出流程如下
1.Pilot-agent有个独立的信号处理线程,接收SIGTERM信号,然后通知Envoy Agent停止Envoy子进程
2.Envoy Agent模块接收到停止信号后,通知Envoy进程优雅地关闭监听器,然后Envoy Agent等待一段优雅删除时间,这时Envoy主动优雅地断开连接,最后发送强制杀掉Envoy进程的通知。
3.Envoy Proxy模块接收到强制删除Envoy进程通知后,如果Envoy进程还没有退出,则强制将其杀掉。
4.xDS代理
1.下游ADS服务器:接收Envoy的xDS请求,并透明地转发给上游请求处理模块,还将上游响应处理模块转发的xDS响应透明地转发给Envoy。
2.上游请求处理模块:单纯地将队列中的xDS请求按照顺序发送到上游的Istiod
3.上游响应处理模块:接收控制面Istiod发送回来的xDS响应,对NDS,PCDS,ECDS这三种资源做单独的拦截处理,将其余类型直接透明转发到下游ADS服务器。
5.证书管理
SDS工作形态有两种
1.工作负载mTLS证书被挂载到Sidecar容器时,SDS根据本地证书文件生成
SDS secret。
2.本地没有证书挂载,SDS作为客户端向Citadel发起createCertificate请求
Citadel CA处理createCertificate请求,为工作负载签发证书,然后把证书发送到SDS服务器
SDS先把证书缓存下来,并且负责证书的轮转;然后把工作负载证书转换成Envoy Secret,并且发送给Envoy
6.DNS服务器
本地DNS服务器负责应用的DNS解析,本地DNS服务器找不到DNS记录时,本地DNS服务器继续通过级联的方式向上游DNS服务发起解析请求。
知识总结
- 角色与功能:
- Pilot-agent主要负责生成Envoy代理的配置文件,并管理其生命周期。
- 它通过与Istio控制平面的交互,确保Envoy代理能够正确配置并高效运行。
- 策略网络:
- 作为Pilot-agent的核心部分,策略网络使用神经网络来表示和学习策略。
- 策略网络根据环境状态输出行动的概率分布,使得Pilot-agent能够基于过去的交互经验进行学习和调整策略。
- Envoy代理管理:
- Pilot-agent负责启动Envoy代理,并在其运行过程中进行监控和管理。
- 如果Envoy代理出错或配置发生变更,Pilot-agent会负责重启或重新加载Envoy代理。
- 配置生成:
- Pilot-agent根据Istio控制平面的指令和配置信息,生成Envoy代理所需的配置。
- 这些配置包括路由规则、服务定义、监听设置等,确保Envoy代理能够正确处理服务网格中的流量。
- 服务发现与流量管理:
- Pilot-agent与Istio的其他组件协同工作,实现服务发现功能。
- 它通过监听Kubernetes等注册中心的服务信息,将服务发现结果传递给Envoy代理,使Envoy能够正确地路由流量。
- 此外,Pilot-agent还参与流量管理功能,如A/B测试、金丝雀发布等,以及提供弹性功能,如超时、重试、熔断器等。
- 安全性:
- Pilot-agent还涉及服务之间的安全性管理。
- 它与Istio的证书颁发机构(CA)交互,为Envoy代理签发证书,确保服务之间的通信安全。
- 集成与扩展性:
- Pilot-agent作为Istio的一部分,与其他组件(如Istiod、Envoy等)紧密集成,共同构建服务网格的功能。
- 它也提供扩展性,允许用户根据具体需求进行定制和扩展。