引言
在 Kubernetes(K8s)中,Pod、Deployment 和 Service 是最核心的三个概念。它们共同协作,实现了应用的部署、伸缩和访问。理解它们之间的关系,是掌握 K8s 的关键一步。
Pod:最小的部署单元
Pod 是 Kubernetes 中可创建和管理的最小计算单元。一个 Pod 可以包含一个或多个容器(如 Docker 容器),这些容器共享网络命名空间、存储卷和生命周期。
- 特点:Pod 内的容器可以通过 localhost 互相通信,共享挂载的存储。
- 使用场景:通常一个 Pod 运行一个主容器,也可搭配辅助容器(如日志收集、代理)。
- 注意:Pod 是临时的,一旦被删除或节点故障,就不会自动恢复。
Deployment:管理 Pod 的副本与更新
Deployment 是用于管理 Pod 副本集(ReplicaSet)的高级控制器。它定义了 Pod 的期望状态(如镜像版本、副本数量),并确保实际状态与之匹配。
- 核心功能:
- 创建和伸缩 ReplicaSet(进而管理 Pod 副本)。
- 滚动更新:逐步替换旧 Pod,实现零停机部署。
- 回滚:如果更新失败,可以快速回退到之前的版本。
- 关系:Deployment 管理 ReplicaSet,ReplicaSet 管理 Pod。你通常不直接创建 Pod,而是通过 Deployment 来声明式地管理。
Service:为 Pod 提供稳定访问入口
Pod 的 IP 地址是动态的,当 Pod 重建或伸缩时,IP 会变化。Service 定义了一组 Pod 的逻辑集合和访问策略,为这些 Pod 提供一个稳定的虚拟 IP(ClusterIP)和 DNS 名称。
- 类型:
- ClusterIP:集群内部访问(默认)。
- NodePort:通过每个节点的静态端口暴露服务。
- LoadBalancer:使用云厂商的负载均衡器对外暴露。
- 与 Pod 的关系:Service 通过标签选择器(Label Selector)匹配一组 Pod,并将流量负载均衡到这些 Pod 上。
三者协作关系
- Deployment 创建和管理 Pod:你定义一个 Deployment,指定容器镜像和副本数。Deployment 会创建 ReplicaSet,再由 ReplicaSet 创建并维护指定数量的 Pod。
- Service 暴露 Pod:你创建一个 Service,通过标签选择器选中 Deployment 管理的 Pod。Service 会为这些 Pod 提供统一的访问入口和负载均衡。
- 动态维护:当 Deployment 滚动更新时,旧的 Pod 被替换,新的 Pod 被创建。Service 会自动将流量路由到新的 Pod,因为它的选择器是基于标签的,不依赖具体 IP。
总结
- Pod:最小运行单元,包含一个或多个容器。
- Deployment:管理 Pod 的副本和更新,确保应用始终处于期望状态。
- Service:为 Pod 提供稳定的网络访问和负载均衡。
三者结合,实现了应用的高可用、可伸缩和易管理。理解它们的关系,有助于你更好地设计和运维 Kubernetes 集群。