k8s --- resource: Pod, ReplicaSet and Deployment

k8s --- resource: Pod, ReplicaSet and Deployment

Pod

Pod 是 Kubernetes 中能够被创建和管理的最小、最简单的可部署单元。

角色:

  • 就像公司里的单个员工,是具体干活的人。
    功能:
  • 一个 Pod 封装了一个或多个应用容器、存储资源、唯一的网络 IP 以及运行选项。

特点:

  • 生命短暂:Pod 是"易逝的"。它可能因为节点故障、资源不足或被更新而随时被销毁。就像员工可能会离职一样。
  • IP 可变:Pod 重启或重建后,会获得一个新的 IP 地址。
  • 最小单元:你很少会直接直接创建独立的 Pod,因为它的生命周期太不稳定了

声明一个Nginx pod的Yaml文件:

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.19

ReplicaSet

ReplicaSet 的核心作用是确保指定数量的、完全相同的 Pod 副本始终处于运行状态。

角色:

  • 就像公司里的部门经理,他不亲自干活,但他负责确保他这个岗位(比如"前端开发工程师")始终有足够数量的员工在岗。

功能:

  • 维持副本数:它通过一个标签选择器来识别它管理的 Pod。你告诉它 replicas: 3,它就会不断地检查,确保任何时候都有恰好 3 个匹配的 Pod 在运行。
  • 故障恢复:如果一个 Pod 崩溃了(员工生病了),ReplicaSet 会检测到并立即创建一个新的 Pod 来替代它(招聘新员工)。

特点:

  • 只负责数量:它只关心 Pod 的数量,不关心 Pod 的版本更新等复杂操作。
  • 通常不直接使用:就像你不会直接去跟经理沟通,你通常不直接创建 ReplicaSet,而是通过它的上司------Deployment。

声明一个确保始终有 3 个 Nginx Pod 的 ReplicaSet的Yaml文件:

yaml 复制代码
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
spec:
  replicas: 3 # 经理的目标:维持3个员工
  selector: # 经理的识别标准:身上有标签 `app: nginx`
    matchLabels:
      app: nginx
  template: # 经理的招聘模板:新员工长这样
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19

Deployment

Deployment 为 Pod 和 ReplicaSet 提供声明式更新,是管理无状态应用的首选对象。

角色:

  • 就像公司里的总监,他负责一个完整的业务应用(比如"电商网站前端")。

功能:

  • 管理 ReplicaSet:他手下管理着经理(ReplicaSet)。
  • 提供滚动更新:当需要升级应用版本时(比如从 Nginx 1.19 升级到 1.20),Deployment 会创建一个新的 ReplicaSet(新经理),并逐步增加新 Pod 的数量、减少旧 Pod 的数量,实现零停机部署。
  • 轻松回滚:如果新版本有问题,总监可以一键将应用回滚到之前的版本。
  • 版本记录:每次更新都会留下记录,方便追踪。

特点:

  • 最常用:这是我们部署无状态应用时最常用、最推荐的资源对象

一个部署 Nginx 的 Deployment,ReplicaSet数量为3,支持滚动更新

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 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
相关推荐
Candice_jy6 小时前
vscode运行ipynb文件:使用docker中的虚拟环境
服务器·ide·vscode·python·docker·容器·编辑器
CS创新实验室8 小时前
从穿孔卡片到云原生:批处理系统的不朽演进与核心思想
云原生·操作系统·批处理
檐下翻书1738 小时前
Spring Boot 深度剖析:从虚拟线程到声明式 HTTP 客户端,再到云原生最优解
spring boot·http·云原生
roman_日积跬步-终至千里8 小时前
【Docker下部署高可用】StarRocks 存算一体架构高可用部署要点
docker·容器·架构
zmjjdank1ng9 小时前
k8s问答题(二)
云原生·容器·kubernetes
卡奥斯开源社区官方9 小时前
2025 实战指南:WebAssembly 重塑云原生开发 —— 从前端加速到后端革命的全栈落地
前端·云原生·wasm
万博智云OneProCloud9 小时前
SmartX 联合万博智云发布云原生异构容灾解决方案白皮书(附下载)
云原生·云容灾·hyperbdr云容灾·灾备系统
ABdolphin19 小时前
Spring-cloud 主键Eureka
java·云原生·eureka
小坏讲微服务19 小时前
五分钟使用 Docker-compose搭建 Redis 8.0 中间件
运维·redis·docker·中间件·容器·kubernetes·k8s