Kubernetes 网络: 关于k8s的 ingress 的工作流程
文章讲解了关于 ingress 和 ingress-controller 在k8s中的工作流程以及 nginx 配置修改后如何实现动态更新 nginx pod。
Ingress 和 Ingress-Controller
- Ingress: 指的是k8s中的一个 api 对象,一般用 yaml 配置。作用是定义请求如何转发到 service 的规则,可以理解为配置模板。
- Ingress-Controller: 具体实现反向代理及负载均衡的程序,对 ingress 定义的规则进行解析,根据配置的规则来实现请求转发。ingress-controller的形式都是一个 pod,里面跑着 daemon 程序和反向代理程序。daemon 负责不断监控集群的变化,根据 ingress 对象生成配置并应用新配置到反向代理,比如 nginx-ingress 就是动态生成 nginx 配置,动态更新 upstream,并在需要的时候 reload 程序应用新配置。
因此,ingress-controller 才是实现请求转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到 ingress-controller,而 ingress 对象是用来告诉 ingress-controller 该如何转发请求,比如哪些域名哪些 path 要转发到哪些服务等等。
Ingress-Controller 工作流程分析
整体工作模式架构图如下(只关注配置同步更新):
不考虑 nginx 状态收集等附件功能,nginx-ingress 模块在运行时主要包括三个主体:NginxController、Store、SyncQueue。其中,Store 主要负责从 kubernetes APIServer 收集运行时信息,感知各类资源(如 ingress、service等)的变化,并及时将更新事件消息(event)写入一个环形管道;SyncQueue 协程定期扫描 syncQueue 队列,发现有任务就执行更新操作,即借助 Store 完成最新运行数据的拉取,然后根据一定的规则产生新的 nginx 配置,(有些更新必须 reload,就本地写入新配置,执行 reload),然后执行动态更新操作,即构造 POST 数据,向本地 Nginx Lua 服务模块发送 post 请求,实现配置更新;NginxController 作为中间的联系者,监听 updateChannel,一旦收到配置更新事件,就向同步队列 syncQueue 里写入一个更新请求。