Pod 是运行应用实例的“容器”,而 Service 是访问这些 Pod 的“稳定网络门户”。
Pod(容器组)
1. 核心概念:
Pod 是 Kubernetes 中可以创建和管理的最小、最简单的计算单元。一个 Pod 代表集群上正在运行的一个工作负载实例。
2. 职责与特点:
托管容器:一个 Pod 通常封装一个或多个紧密相关的应用容器(例如,主应用容器和它的日志收集 sidecar 容器)。
** ephemeral (短暂的)**:Pod 是临时的、一次性的实体。它们可以被销毁、重建、调度到任何节点。Pod 的 IP 地址、主机名等都会随之改变。
拥有独立IP:每个 Pod 在被创建时会被分配一个唯一的集群内 IP 地址。
生命周期与应用一致:如果 Pod 中的容器崩溃或节点故障,Pod 会终止,并由控制器(如 Deployment)创建新的 Pod 来替换它。新的 Pod 将获得一个全新的 IP 地址。
3. 关键问题:
因为 Pod 是短暂且IP不固定的,所以不能直接依赖 Pod 的 IP 地址来访问服务。前端应用无法知道后端 Pod 的新 IP 是什么,这导致了服务的发现和访问问题。
Service(服务)
1. 核心概念:
Service 是一个抽象层,它定义了一组 Pod 的逻辑集合以及访问这组 Pod 的稳定策略。它解决了 Pod 的动态性和不可靠性带来的网络访问问题。
2. 职责与特点:
稳定的访问端点:Service 被分配一个固定的虚拟 IP 地址(ClusterIP),这个 IP 在 Service 的整个生命周期内都不会改变。
服务发现:Service 通过 Label Selector(标签选择器)来动态地识别和管理属于它的后端 Pod 集合。无论背后的 Pod 如何变化(IP改变、数量增减),Service 总能找到它们。
负载均衡:当有请求到达 Service 的虚拟 IP 时,Service 会自动将流量负载均衡到所有健康的、匹配标签的后端 Pod 上。
抽象细节:客户端(其他 Pod 或外部用户)不需要知道具体有多少个 Pod 或者它们的 IP 是什么,它们只需要访问 Service 的固定地址即可。
直观比喻
想象一个公司的客服部门:
Pod:就像是一个个具体的客服人员。
客服人员可能会请假、离职、换座位(Pod 被销毁、重建、IP改变)。
你很难直接记住每个客服的分机号(Pod IP)。
Service:就像是公司的总机号码或客服热线(一个固定的电话号码)。
这个总机号码是永远不变的(Service 的 ClusterIP)。
当你拨打这个总机号时,呼叫中心(Service 的负载均衡器)会自动帮你转接到一个当前空闲的、在线的客服人员(健康的 Pod)那里。
你完全不需要关心背后到底有多少客服、谁在接听。
对比总结表
特性 | Pod | Service |
---|---|---|
目的 | 运行应用容器 | 暴露和访问一组 Pod |
生命周期 | 短暂、易逝的(Ephemeral) | 稳定的(只要存在就需要) |
IP 地址 | 动态分配,会改变 | 静态分配(ClusterIP),固定不变 |
核心功能 | 托管应用进程 | 服务发现、负载均衡、提供稳定网络端点 |
如何关联 | - | 通过 selector 标签选择器关联到 Pod |
创建方式 | 通常由 Deployment、StatefulSet 等控制器创建和管理 | 直接由用户或 Helm 等工具创建 Service 资源 |
层级 | 计算和运行的基础单元 | 网络抽象层 |
工作流示例
你定义一个 Deployment,它负责创建和管理 3 个相同的 Pod(例如,你的 Web 应用服务器)。每个 Pod 都有标签
app: my-web-app
。你定义一个 Service,它的选择器
selector
设置为app: my-web-app
。Service 会自动发现所有带有
app: my-web-app
标签的 Pod,并将其作为自己的后端端点 (Endpoints)。集群内的其他应用(客户端)只需要访问这个 Service 的固定 IP 或域名(例如
my-web-app-service.default.svc.cluster.local
)。当客户端发起请求时,Service 负责将流量均匀地分发到背后的 3 个 Pod 上。如果其中一个 Pod 故障,Deployment 会创建一个新的,Service 会自动将新 Pod 纳入负载均衡池,整个过程对客户端完全透明。
总结
简单记住:
Pod 是干活的,但命短地址老变。
Service 是名片和调度员,提供一个固定联系方式,并负责把活派给后台干活的 Pod。
因此,在 Kubernetes 中,你几乎总是会同时使用 Pod(通过控制器)和 Service 来部署一个可访问、高可用的应用。