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
相关推荐
Ghost Face...6 分钟前
Docker实战:从安装到多容器编排指南
运维·docker·容器
闲人编程25 分钟前
健康检查与就绪探针
kubernetes·web·状态机·健康检查·codecapsule·存活探针·启动探针
不惑_1 小时前
Windows 安装 Docker 和 Docker Compose 完整教程
windows·docker·容器
云霄IT3 小时前
docker使用教程之部署第一个go项目
docker·容器·golang
阿基米东3 小时前
Let‘s Encrypt 是什么?它是如何工作的?
云原生·https·云计算
故事写到这3 小时前
第一章 Ubuntu24.04环境下的K8S部署【入门保姆级】
云原生·容器·kubernetes
探索云原生3 小时前
Buildah 简明教程:让镜像构建更轻量,告别 Docker 依赖
linux·docker·云原生·go·cicd
走路带_风3 小时前
Ubuntu server 22.04 安装kubernetes
云原生·容器·kubernetes
学习3人组4 小时前
CentOS9安装Docker
docker·容器·eureka
Xyz996_5 小时前
K8S-Configmap资源
云原生·容器·kubernetes