Kubernetes (K8s) 中 Deployments, Pods, ReplicaSets, 和 Services 这几个核心概念以及它们之间的关联。
- Pod
- 是什么: Pod 是 Kubernetes 中最小的部署和管理单元。它代表集群中运行的一个或多个紧密耦合的容器化进程。Pod 内的容器共享网络 IP、存储卷(Volume)和一些 Linux 命名空间,它们可以像一个整体一样被管理和调度。
- 特点: Pod 是短暂的(ephemeral),其生命周期不固定。当 Pod 被删除或 Pod 内的容器崩溃时,Pod 就会消失。Kubernetes 不会尝试恢复一个失败的 Pod,而是创建一个新的 Pod 来替代它。
- ReplicaSet
- 是什么: ReplicaSet(副本集)确保任何时候集群中都有指定数量(replicas)的 Pod 副本在运行。它提供了高可用性和伸缩性。
- 作用: 你告诉 ReplicaSet 你想要 3 个运行 Nginx 的 Pod 副本,ReplicaSet 控制器会持续监控集群中的 Pod 数量。如果某个 Pod 意外终止,ReplicaSet 会自动创建一个新的 Pod 来维持期望的副本数。如果 Pod 数量超过了期望值,它会删除多余的 Pod。
- 关联: ReplicaSet 直接管理 Pod。它通过标签(Labels)选择器(Selector)来识别和管理它所控制的 Pod。
- Deployment
- 是什么: Deployment 是一个更高级别的抽象,它为 Pod 和 ReplicaSet 提供了声明式的更新能力。它允许你以声明的方式定义应用程序的期望状态(例如,运行多少个副本、使用哪个容器镜像、如何更新等),并由 Deployment 控制器负责将集群的当前状态逐步调整到期望状态。
- 作用: Deployment 的主要优势在于它支持滚动更新(Rolling Updates)和回滚(Rollback)。你可以通过修改 Deployment 的配置(如镜像版本)来触发更新,Deployment 会按照策略(如一次更新几个 Pod)逐步替换旧的 Pod 为新的 Pod,而无需停机。如果更新出现问题,可以轻松回滚到之前的版本。
- 关联: Deployment 管理 ReplicaSet。当你创建一个 Deployment 时,它会自动创建一个 ReplicaSet。这个 ReplicaSet 再去管理实际的 Pod。因此,Deployment 是一个两层控制器:Deployment 控制 ReplicaSet,ReplicaSet 控制 Pod。
- Service
- 是什么: Service 定义了一种抽象,它定义了一组 Pod 的逻辑集合和访问这组 Pod 的策略(通常是负载均衡)。Pod 的 IP 地址是动态分配的,当 Pod 因为失败或伸缩而被替换时,其 IP 地址会发生变化。Service 为这些动态的 Pod 提供了一个稳定的网络端点(IP 地址和端口)。
- 作用: 主要解决 Pod 的网络访问问题。它使得 Pod 之间可以互相发现和通信,也使得集群外部的应用或用户可以访问集群内部的服务。
- 关联: Service 通过标签(Labels)选择器(Selector)来找到它要访问的 Pod 集合。它不直接管理 Pod,而是根据选择器动态地维护一个 Pod IP 列表,并将流量分发给列表中的 Pod。
它们之间的关联(工作流程)
- 定义期望状态: 用户创建一个 Deployment 对象,定义了期望的应用状态(例如,运行 3 个 nginx:1.20 镜像的 Pod)。
- 创建 ReplicaSet: Deployment 控制器观察到新的 Deployment,会创建一个 ReplicaSet 对象,其期望副本数为 3。
- 管理 Pod: ReplicaSet 控制器观察到新的 ReplicaSet,会创建 3 个 Pod 对象,以满足期望的副本数。ReplicaSet 会持续监控这些 Pod,并确保始终有 3 个健康的 Pod 运行。
- 提供网络访问: 用户创建一个 Service 对象,该对象通过标签选择器(例如,app=nginx)关联到这 3 个 Pod。Service 为这组 Pod 提供一个稳定的虚拟 IP (ClusterIP) 和端口。
- 流量分发: 集群内外的其他组件或用户可以通过 Service 的 IP 和端口来访问这 3 个 Pod 提供的服务。Service 会自动将流量负载均衡到后端的 Pod 上。
- 更新与伸缩: 当用户需要更新应用(如镜像版本)或伸缩副本数时,只需修改 Deployment 对象。Deployment 控制器会相应地创建一个新的 ReplicaSet 来管理新版本的 Pod,并通过控制两个 ReplicaSet 的副本数来实现滚动更新,同时 Service 会自动将流量导向新的和旧的 Pod(在更新过程中),直到更新完成。
总结:
- Pod: 最小的运行单元,包含一个或多个容器。
- ReplicaSet: 确保指定数量的 Pod 副本稳定运行。
- Deployment: 更高级的控制器,管理 ReplicaSet,提供声明式更新(滚动更新、回滚)的能力。
- Service: 为 Pod 提供稳定的网络访问方式(负载均衡、服务发现)。
层级关系: Deployment -> ReplicaSet -> Pod。Service 通过标签选择器关联到 Pod(通常是由 Deployment/ReplicaSet 管理的 Pod)。