k8s --- resource: Pod, ReplicaSet and Deployment
k8s --- resource: Pod, ReplicaSet and Deployment
- Pod
- ReplicaSet
- Deployment
- Example
Pod
Pod 是 Kubernetes 中能够被创建和管理的最小、最简单的可部署单元。
角色:
- 就像公司里的单个员工,是具体干活的人。
功能:- 一个 Pod 封装了一个或多个应用容器、存储资源、唯一的网络 IP 以及运行选项。
特点:
- 生命短暂:Pod 是“易逝的”。它可能因为节点故障、资源不足或被更新而随时被销毁。就像员工可能会离职一样。
- IP 可变:Pod 重启或重建后,会获得一个新的 IP 地址。
- 最小单元:你很少会直接直接创建独立的 Pod,因为它的生命周期太不稳定了

声明一个Nginx pod的Yaml文件:
apiVersion: v1
kind: Pod
metadata:name: nginx-pod
spec:containers:- name: nginximage: nginx:1.19
ReplicaSet
ReplicaSet 的核心作用是确保指定数量的、完全相同的 Pod 副本始终处于运行状态。
角色:
- 就像公司里的部门经理,他不亲自干活,但他负责确保他这个岗位(比如“前端开发工程师”)始终有足够数量的员工在岗。
功能:
- 维持副本数:它通过一个标签选择器来识别它管理的 Pod。你告诉它 replicas: 3,它就会不断地检查,确保任何时候都有恰好 3 个匹配的 Pod 在运行。
- 故障恢复:如果一个 Pod 崩溃了(员工生病了),ReplicaSet 会检测到并立即创建一个新的 Pod 来替代它(招聘新员工)。
特点:
- 只负责数量:它只关心 Pod 的数量,不关心 Pod 的版本更新等复杂操作。
- 通常不直接使用:就像你不会直接去跟经理沟通,你通常不直接创建 ReplicaSet,而是通过它的上司——Deployment。
声明一个确保始终有 3 个 Nginx Pod 的 ReplicaSet的Yaml文件:
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: nginx-replicaset
spec:replicas: 3 # 经理的目标:维持3个员工selector: # 经理的识别标准:身上有标签 `app: nginx`matchLabels:app: nginxtemplate: # 经理的招聘模板:新员工长这样metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.19
Deployment
Deployment 为 Pod 和 ReplicaSet 提供声明式更新,是管理无状态应用的首选对象。
角色:
- 就像公司里的总监,他负责一个完整的业务应用(比如“电商网站前端”)。
功能:
- 管理 ReplicaSet:他手下管理着经理(ReplicaSet)。
- 提供滚动更新:当需要升级应用版本时(比如从 Nginx 1.19 升级到 1.20),Deployment 会创建一个新的 ReplicaSet(新经理),并逐步增加新 Pod 的数量、减少旧 Pod 的数量,实现零停机部署。
- 轻松回滚:如果新版本有问题,总监可以一键将应用回滚到之前的版本。
- 版本记录:每次更新都会留下记录,方便追踪。
特点:
- 最常用:这是我们部署无状态应用时最常用、最推荐的资源对象
一个部署 Nginx 的 Deployment,ReplicaSet数量为3,支持滚动更新
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.19 # 更新这个镜像版本,Deployment就会触发滚动更新ports:- containerPort: 80
Example
通常情况下,部署一个服务是通过定义Deployment的方式来部署

场景演绎:
初始状态:你创建一个 Deployment,指定 replicas: 3,镜像为 nginx:1.19
- Deployment 开始工作,他创建了一个 ReplicaSet A来管理这 3 个 Pod
- ReplicaSet A根据模板创建了 3 个 nginx:1.19 的 Pod
进行滚动更新:你将 Deployment 的镜像改为 nginx:1.20 (replicas: 3依然为3)
- Deployment 创建了一个新的 ReplicaSet B,并设定其目标副本为 1
- ReplicaSet B创建了 1 个新的 nginx:1.20 的 Pod
- Depolyement 逐步将ReplicaSet A的副本数减至 2,将ReplicaSet B的副本数增至 2,直到最后ReplicaSet A 的副本数为 0,ReplicaSet B 的副本数为 3
- 最终结果:所有 Pod 都升级到了新版本,整个过程服务不中断
Pod 发生故障:
- 其中一个 Pod 员工崩溃了
- ReplicaSet B检测到管理的 Pod 数量只有 2 个,与期望的 3 个不符
- ReplicaSet B立即创建一个新的 Pod,使总数恢复为 3
