Coursera 笔记

Module 03 · Managing Applications with Kubernetes

ReplicaSetReplicaSet 深度解析

Coursera ↗

定义与功能

看完本视频,您将能够:定义 ReplicaSet、解释 ReplicaSet 的工作原理,以及列出使用 ReplicaSet 的益处。

单 Pod 部署的局限性

如果应用程序部署在单个 Pod 上,它将无法在以下情况下执行某些操作:

  • 请求量急剧增加(manifold)或发生中断(outages)。
  • 单 Pod 部署无法适应应用程序不断增长的需求。

ReplicaSet 的价值

ReplicaSet 可以解决这些局限性:

  • 负载均衡(Load Balancing):实现跨 Pod 的负载均衡。
  • 高可用性(High Availability):通过冗余 Pod 消除单点故障,处理中断,最大限度地减少停机时间和服务中断。
  • 自动重启/修复:如果出现问题,自动重启部署。
  • 核心保证:ReplicaSet 始终确保正确数量的 Pod 处于运行状态。

⚠️ 请注意:ReplicaSet 取代了 ReplicaController‾\underline{ReplicaController},应优先使用 ReplicaSet。

ReplicaSet 的工作原理

ReplicaSet 总是尝试将副本的实际状态匹配到期望状态。

  • 伸缩与冗余:ReplicaSet 通过增加或删除 Pod 来实现伸缩(scaling)和冗余(redundancy),有助于保持可用性(availability)。
    • 它会替换失败的 Pod。
    • 它会删除多余的 Pod,以维持期望状态。

ReplicaSet 与 Deployment

在集群中创建 Deployment 时,会自动创建一个 ReplicaSet。

角色 职责 推荐用法
Deployment 📢 管理 ReplicaSet,向 Pod 发送声明式更新(declarative updates),并拥有许多其他实用功能。 强烈推荐使用 Deployment 来管理 ReplicaSet。
ReplicaSet 维持 Pod 副本数量。 推荐由 Deployment 管理,而不是作为独立的组件。

通过标签管理 Pod

Kubernetes 的设计宗旨是保持对象类型的独立性。因此:

  • ReplicaSet 不拥有任何 Pod。
  • 它使用 Pod 标签(pod labels)来决定获取(acquire)哪些 Pod,从而使部署达到期望状态。
# 示例:部署模板 (Deployment Template) 
metadata:
  labels: 
    # 定义标签
spec: 
  # 定义 Pod 候选者的规范
  • 模板元数据(metadata)定义了潜在 Pod 候选者(potential pod candidates)的标签和规范(spec)。

创建与操作 ReplicaSet

验证 ReplicaSet 的自动创建

  1. 创建一个 Deployment。
  2. 使用 get ReplicaSet 命令验证 ReplicaSet 是否已自动生成。
  • 默认情况下,ReplicaSet 只会复制到一个 Pod。
  1. 描述(describe)Pod,您将看到 Pod 的详细信息,以及它是由同一个 ReplicaSet 控制的。

从头创建 ReplicaSet

要从头创建 ReplicaSet,请应用一个 YAML 文件,并将 kind 属性设置为 ReplicaSet,如下所示:

YAML

kind: ReplicaSet
# ... 其他配置
spec:
  replicas: 1 # 定义副本数量
  • 如果将 replicas 定义为 1,您将得到一个 Pod。这类似于在 YAML 文件中未指定副本数量而创建默认 Pod。

步骤演示

  1. 使用 create ReplicaSet 命令创建 ReplicaSet。
  • 输出显示 ReplicaSet 已创建。
  1. 使用 get pods 命令确认 Pod 已创建并处于 Running 状态。
  2. 使用 get rs 命令(rs 是 ReplicaSet 的简称)查看名称和其他详情。

📣 再次提醒:建议创建包含 ReplicaSet 的 Deployment,而不是创建独立的 ReplicaSet。


伸缩 Deployment

在伸缩部署之前,必须确保您已有一个 Deployment 和一个 Pod。

  1. 使用 create 命令创建一个 Deployment。
  • 输出确认 Deployment 已创建。
  • Deployment 默认会创建一个 Pod,您可以使用 get pods 命令确认。
  • 使用 get deploy 命令查看 Deployment 详情,例如:部署名称为 hello-kubernetes。
  1. 使用 scale 命令伸缩 Deployment,并设置期望的副本数量。
  • 示例:将副本数量设置为 3。
  • 输出确认部署已伸缩。
  • 使用 get pods 命令,您将看到三个 Pod 正在运行。
    • ReplicaSet 新创建了两个 Pod(例如:一个以 5mflw 结尾,另一个以 hbt7v 结尾)。


ReplicaSet 如何维护期望状态

ReplicaSet 总是努力将实际状态匹配到期望状态。

维护:删除 Pod

  1. 使用 get pods 命令,确认三个 Pod 正在运行。
  2. 使用 delete pod 命令删除其中一个 Pod(例如:以 5mflw 结尾的 Pod)。
  3. 观察:
  • 期望状态与实际状态不匹配。
  • ReplicaSet 自动用一个新的 Pod 替换被删除的 Pod。
  1. 再次使用 get pods 命令。
  • 输出显示 ReplicaSet 立即创建了一个新 Pod(例如:以 6lw4r 结尾)。
  • Pod 总数恢复到三个,ReplicaSet 维护了期望状态。

维护:手动创建 Pod

  1. 使用 get pods 命令,确认三个 Pod 正在运行。
  2. 使用 create pod 命令手动创建一个 Pod(例如:以 mx9rp 结尾的 Pod)。
  3. 再次使用 get pods 命令。
  • 输出显示现在有四个 Pod。
  • 期望状态与实际状态不匹配。
  1. ReplicaSet 会将新创建的 Pod(例如:以 mx9rp 结尾的 Pod)标记为删除并自动移除。
  2. 再次使用 get pods 命令。
  • 输出显示 Pod 总数恢复到三个。
  • ReplicaSet 再次维护了期望状态。

总结要点

序号 知识点 细节
1 高可用性 ReplicaSet 通过冗余提供高可用性。
2 伸缩能力 ReplicaSet 通过创建或删除 Pod 来实现伸缩。
3 创建方式 可以使用 CLI 或 YAML 描述符创建 ReplicaSet。
4 核心原则 ReplicaSet 始终尝试将实际状态匹配到期望状态。
5 最佳实践 推荐使用 Deployment 来管理 ReplicaSet,而不是直接使用 ReplicaSet。