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:

Isio架构

为什么需要自动注入

按照常规的做法,要给 Pod 添加 Sidecar,需要在应用 Pod 的 YAML 文件的相应位置填写 Sidecar 的信息。Istio 可以使用这种方法吗?应该是可以的。但是这种方法似乎不那么优雅。

应用的开发者应该只关注业务逻辑,不需要关心系统中是否使用 Istio。自动注入做到了让 Istio 的运行对于应用透明(transparently)

原理

Istio 使用了 K8s 中 Webhook 功能的来实现自动注入 Sidecar,下面是自动注入 Sidecar 流程时序图:

webhook原理

从图中可以清晰的看到整个流程中各个组件之间的调用关系。其中,重点是 Istiod,也就是 Webhook Server。

Istiod 在 :15017/inject 处理 webhook 请求,对应的处理函数为 func (wh *Webhook) serveInject(w http.ResponseWriter, r *http.Request)。大致流程是:

  1. 从 w 中读取 Pod 信息
  2. 执行注入 Sidecar 的逻辑(istio/pkg/kube/inject/webhook.go:func injectPod)
  3. 将修改后的 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/

[4] https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#experimenting-with-admission-webhooks

Latest update:2022/04/26

© 2019 - 2024 · Thinking Cell · Theme Simpleness Powered by Hugo ·