K8s 服务网格:账单终将到来

微服务密集的 Kubernetes 环境越来越多地采用 Istio 和 Linkerd 之类的服务网格来提供 mTLS 加密、统一可观测性、流量整形和重试机制——但许多工程师质疑这些额外的复杂性、脆弱性和成本是否值得。评论者认为,对大多数组织来说,基础的 Kubernetes 网络、ingress 控制器或基于 SDN 的方案已经足够,而网格应被视为大型、复杂或高度受监管系统的专用工具,而不是默认选项。一个反复出现的主题是,架构选择往往既受组织失调和安全清单驱动,也受真实技术需求驱动。

讨论范围

  • 重点是 Kubernetes 服务网格(Istio、Linkerd 等)、它们在实践中的使用方式,以及它们是否值得其带来的复杂性和成本。
  • 许多评论将话题扩展到微服务 vs 单体、TLS/mTLS,以及组织因素。

微服务 vs 单体

  • 微服务会增加集群内流量;这主要是架构本身带来的结果,而不是服务网格特有的结果。
  • 支持微服务的观点:
    • 一旦你到了“数百名工程师”或拥有多个产品的规模,它就能支持独立团队部署、版本控制和扩展。
    • 让团队隔离相互冲突的依赖和运行时环境(例如 Python/pandas/numpy 版本冲突)。
  • 怀疑论观点:
    • 真正需要微服务的系统极少;很多时候它们是在弥补组织问题或虚荣心。
    • 强烈建议从单体或“模块化单体(modulith)”开始,只有在规模或依赖冲突确实要求时才拆分。

服务网格承诺提供什么

  • 常被提及的好处:
    • 在不同语言和团队之间提供统一的指标和可观测性。
    • 在整个集群范围内实现 mTLS 和“零信任”,而不必让每个团队都去学习 TLS/PKI。
    • 流量整形:带预算的重试、超时、速率限制、金丝雀/蓝绿部署、细粒度路由。
    • 更容易调试(按 Pod 捕获流量、L7 可见性)。
  • 有人认为,网格是实现规模化 mTLS 的唯一实用途径(例如用于 FedRAMP 环境)。

复杂性、成本与过度设计

  • 普遍强烈共识是,尤其是 Istio 非常复杂、资源消耗大、难以调试;一旦遇到生产问题,其文档也被认为很难理解。
  • 有报告称网格每个节点会消耗相当可观的 CPU;在小型集群上,它们可能挤占工作负载资源。
  • 许多人认为,Kubernetes 加上 ingress、NetworkPolicies,以及一个 CNI(通常再结合 eBPF 跟踪/可观测性)已经覆盖了大多数需求。
  • 网格被认为更多是在解决组织问题(TLS/指标不一致),而不是解决硬性的技术约束。

流量、性能与协议

  • Sidecar 代理会增加额外跳数,但通常只是真实网络跳数增加一次;其他副本是在同一节点上的内存中传输。
  • 大多数真实环境仍然使用 HTTP/JSON;也有一些 gRPC、GraphQL、SOAP。
  • 一些人指出,带宽很少是瓶颈;工程时间才是。

安全与 TLS/mTLS 争论

  • 一派观点:每个服务都应该自己支持 TLS,并使用内部 PKI——一旦理解了,这样更简单,也避免了网格开销。
  • 另一派观点:开发者经常错误配置 TLS(或者禁用验证);在网格中集中管理证书并强制执行更安全,也更易维护。
  • 对于集群内加密是否能真正缓解现实威胁,还是说更紧迫的是其他安全问题,存在分歧。

开发者体验与组织动态

  • 应用开发者抱怨 YAML 过多,基础设施细节“渗入”他们的工作;他们想要一个简单的“部署这个应用”的流程。
  • 基础设施/SRE 回应说,抽象天然会有泄漏;优秀团队会标准化平台,使一个“hello world”服务可以快速部署,但高可用、安全和合规带来的复杂性不会消失。
  • 许多人警告不要默认采用 Kubernetes 和网格,也不要出于简历/“信仰”原因采用;它们应该是“有时才用”的工具,只有在明确需要其具体收益时才引入。