简单来说,Kubernetes(k8s)和 Service Mesh 是互补的关系,而非替代。它们在不同的层级上工作,共同构成了云原生应用的基石。

我们可以用一个生动的比喻来理解:

  • Kubernetes 就像是国家的高速公路系统:它负责修建高质量的道路(节点/服务器)、设立交通规则(调度规则)、安装红绿灯和指示牌(服务发现、负载均衡),确保车辆(容器)能够从A点顺利地到达B点。它关心的是基础设施和调度

  • Service Mesh 就像是每辆车上的智能驾驶系统和交通控制中心:它不关心路本身修得怎么样,而是关心路上跑的车。它负责监控每辆车的健康状况(健康检查)、控制车速和流量(限流熔断)、防止车辆被劫持(mTLS加密)、记录车辆的行驶轨迹(分布式追踪)、以及处理车辆之间的通信协调(高级路由,如金丝雀发布)。它关心的是应用之间的网络通信


核心关系:互补与协作

  1. 层级不同

    • K8s 工作在基础设施层,是容器编排平台,管理应用的生命周期(部署、伸缩、重启)。

    • Service Mesh 工作在应用网络层,是应用间的通信基础设施,管理应用微服务之间的流量、安全和可观测性。

  2. 依赖关系

    • Service Mesh 通常 部署在 Kubernetes 之上。K8s 为 Service Mesh 提供了绝佳的运行环境,因为微服务天然地以容器的形式在 K8s 中运行和编排。可以说,K8s 的普及极大地推动了 Service Mesh 的发展。

    • 虽然 Service Mesh 理论上可以运行在其他平台(如虚拟机),但 k8s 是目前最主流、最自然的运行环境。

  3. 功能重叠与接管

    • K8s 本身提供了一些基础的网络功能,最核心的是服务发现(Service Discovery) 和负载均衡(Load Balancing)(通过 kube-proxy 和 Service 资源)。

    • Service Mesh 出现后,接管并增强了这部分网络功能。它会将自己的 Sidecar 代理(如 Envoy)注入到每个服务 Pod 中,流量不再直接通过 k8s 的 Service,而是被 Sidecar 劫持,从而能够实现更精细、更强大的控制。


主要区别

为了更清晰,我们从几个维度来对比它们的区别:

特性维度 Kubernetes (k8s) Service Mesh (e.g., Istio, Linkerd)
核心目标 容器编排:部署、管理、扩展应用 服务通信:管理服务间的网络通信
关注层级 基础设施层(Node, Pod, Container) 应用网络层(服务到服务的通信)
关键能力 调度、自愈、水平扩展、服务发现、基础负载均衡、配置管理 高级流量管理(金丝雀发布、故障注入)、可观测性(指标、日志、追踪)、增强安全(mTLS、细粒度策略)、弹性(熔断、重试、超时)
实现方式 通过 kube-proxy + CoreDNS 等核心组件 通过在每个 Pod 中注入 Sidecar 代理(如 Envoy)
对应用影响 无侵入:应用无需修改代码即可享受编排能力 通常无侵入:通过 Sidecar 实现功能,对业务代码透明(有时需少量注解)
运维角度 集群运维:关心节点、存储、网络插件等 应用运维/开发者:关心服务拓扑、API 延迟、错误率、安全策略等

一个具体的协作场景:金丝雀发布

假设你要为你的微服务 user-service 发布一个新版本(v2),并希望将 5% 的流量切到新版本进行测试。

  1. Kubernetes 的角色

    • 你使用 Deployment 部署了 user-service-v1 和 user-service-v2 两个版本的 Pod。

    • K8s 为它们创建了一个 Service named user-service。默认情况下,流量会以轮询(Round Robin)的方式随机打到 v1 和 v2 的 Pod 上。你无法精确控制流量比例

  2. Service Mesh 的角色

    • 你在集群中安装了 Istio。

    • 不直接使用 k8s 的 Service 来做负载均衡,而是定义 Istio 的 VirtualService 和 DestinationRule 资源。

    • 在 VirtualService 中,你可以编写如下规则:

      yaml

      http:
      - route:
        - destination:
            host: user-service
            subset: v1
          weight: 95  # 95% 流量去 v1
        - destination:
            host: user-service
            subset: v2
          weight: 5   # 5% 流量去 v2
    • Istio 的 Sidecar 代理(Envoy)会拦截所有进出 Pod 的流量,并精确地按照上述权重规则路由流量,完美实现了金丝雀发布。

总结

  • Kubernetes 是基石,解决了“如何运行和连接微服务”的问题。

  • Service Mesh 是增强,解决了“如何更好地管理、观察和保护微服务之间的通信”的问题。

当你的应用只有几个微服务时,K8s 自带的服务发现和负载均衡可能就足够了。但当服务数量增长到几十上百个,并对通信的可靠性、安全性、可观测性有了更高要求时,引入 Service Mesh 就变得非常必要。它从应用层面,为复杂的微服务架构提供了更强大的网络治理能力。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐