Istio 自动注入 Sidecar 实现原理
The single-responsibility principle (SRP) is a computer-programming principle that states that every module, class or function in a computer program should have responsibility over a single part of that program’s functionality, and it should encapsulate that part.
介绍
Istio 自动注入 Sidecar 指的是 Istio 会为用户在特定条件下(通常是在某个命名空间)创建的 Pod 添加一个 Proxy Sidecar。
Istio 架构上分为控制平面与数据平面。如下图所示,在数据平面, Istio 通过自动注入为每个 Pod 都添加了一个 Porxy:
为什么需要自动注入
按照常规的做法,要给 Pod 添加 Sidecar,需要在应用 Pod 的 YAML 文件的相应位置填写 Sidecar 的信息。Istio 可以使用这种方法吗?应该是可以的。但是这种方法似乎不那么优雅。
应用的开发者应该只关注业务逻辑,不需要关心系统中是否使用 Istio。自动注入做到了让 Istio 的运行对于应用透明(transparently)。
原理
Istio 使用了 K8s 中 Webhook 功能的来实现自动注入 Sidecar,下面是自动注入 Sidecar 流程时序图:
从图中可以清晰的看到整个流程中各个组件之间的调用关系。其中,重点是 Istiod,也就是 Webhook Server。
Istiod 在 :15017/inject
处理 webhook 请求,对应的处理函数为 func (wh *Webhook) serveInject(w http.ResponseWriter, r *http.Request)
。大致流程是:
- 从 w 中读取 Pod 信息
- 执行注入 Sidecar 的逻辑(istio/pkg/kube/inject/webhook.go:func injectPod)
- 将修改后的 Pod 信息写入 r
上面介绍了 Istiod 如何接受请求并处理,那 K8s 怎么知道将请求发送到哪个地方呢?答案是使用 K8s 中的 API 资源: MutatingAdmissionWebhook 。该资源通过 istioctl manifest install
命令注册到 K8s 集群。
总结
得益于 K8s 强大的 Webhook 功能,Istio 实现了用户无感的自动注入 Sidecar 功能。从中也能学习到,在关键的位置支持 hook 将大大的提升架构的灵活性,也体现了**开闭原则(The Open/Closed Principle, OCP)**的重要性。
参考资料
[1] https://istio.io/latest/docs/ops/configuration/mesh/injection-concepts/
[2] https://istio.io/latest/docs/setup/additional-setup/sidecar-injection/#automatic-sidecar-injection
[3] https://istio.io/latest/docs/ops/common-problems/injection/
Latest update:2022/04/26