type
status
date
slug
summary
tags
category
icon
password

1、概述

前面我们提到 Pod 就是用来运行和管理容器的,在实际使用时,我们不会创建单独的 Pod 来运行容器,而是使用更高级的资源进行调度。例如:
  • Deployment:管理无状态应用(如 Web 服务),Pod 无唯一标识且可替换。
  • StatefulSet:管理有状态应用(如数据库、分布式系统),Pod 有唯一且固定的标识(如 pod-name-0pod-name-1),且支持持久化存储和有序部署/扩缩容。
  • DaemonSet:Node 上的守护进程,确保每个匹配的 Node 上都运行一个 Pod。
  • Job:运行一次性任务,任务完成后 Pod 自动终止。
  • CronJob:管理定时任务(类似 Linux 的 cron),按计划周期运行 Pod。

2、Deployment

在介绍 Deployment 之前,先介绍 Replication Controller(RC) 和 Replica Set(RS)。

2.1 Replication Controller(RC)和 Replica Set(RS)

Replication Controller 是 Kubernetes 早期用来确保 Pod 副本数始终维持在预期数量的控制器。换句话说:
  • 如果 Pod 的数量大于设定的值,RC 将终止额外的 Pod。
  • 如果 Pod 的数量少于设定的值,RC 将启动更多的 Pod 保证达到期望值。
RC 有点类似于进程管理器,监视多个节点上的多个 Pod。哪怕预期只需要一个 Pod,也不应该单独创建 Pod,而是使用 RC 或者其它方式管理。
创建 RC 示例:
Replica Set 是 Replication Controller 的升级版,与 Replication Controller 的唯一区别是 Replica Set 支持标签选择器。除此之外在创建、删除和管理 Pod 等功能上并无差别。
在新版本中,Replica Set 已经取代了 Replication Controller(Replication Controller 为了向后兼容而保留)。但实际生产一般也不会直接使用 Replica Set,而是使用更高级的资源例如 Deployment 来管理 ReplicaSet,因为 Deployment 提供了滚动更新、版本回滚等更高级的功能。
创建 RS 示例:

2.2 标签和选择器

标签是附加到 Kubernetes 对象(如 Pod、Service、Deployment 等)上的键值对(key-value pairs),用于标识对象的特定属性。标签的特点:
  • 每个对象可以有多个标签
  • 标签的键通常由前缀和名称组成,格式为 <前缀>/<名称>
  • 前缀是可选的,但如果是公共标签应使用标准前缀
标签示例:
选择器根据标签来筛选和识别一组对象。Kubernetes Controller 使用选择器来识别它们管理的对象。选择器类型:
  • = 或 ==:等于,例如 environment = production
  • !=:不等于,例如 tier != frontend
  • in:在集合中,例如 environment in (production, qa)
  • notin:不在集合中 tier notin (frontend, backend)
  • exists:键存在(不检查值),例如 partition (存在partition键), !partition (不存在partition键)
选择器示例:

2.3 Deployment

Deployment 用来部署无状态的应用,通过 ReplicaSet 确保 Pod 副本数按预期运行,除此之外还提供了更高级的功能:
  • 滚动更新:支持零停机部署新版本应用。
  • 版本回滚:当新版本出现问题时可以快速回退到之前的稳定版本。
  • 自动扩缩容:轻松调整运行的 Pod 数量。
  • 健康检查:结合就绪探针(Readiness Probe)确保流量只路由到健康的 Pod。
一个典型的 Deployment 配置示例:
  • replicas:指定要运行的 Pod 副本数量
  • selector:定义 Deployment 如何找到要管理的 Pod
  • template:包含 Pod 的配置信息
    • metadata:Pod 的标签等信息
    • spec:容器配置、卷、环境变量等
Deployment 支持两种更新策略:
  • RollingUpdate(默认):逐步用新 Pod 替换旧 Pod,可配置 maxUnavailable 和 maxSurge 控制更新速度
  • Recreate:先删除所有旧 Pod,然后创建新 Pod,会导致短暂的服务中断
当 Deployment 发生更新的时候,会有新的 Replica Set 被创建,旧的 Replica Set 被保留。可以通过 -o yaml 获取当前对应的 Replica Set,其余的 Replica Set 均为保留的历史版本(默认最多保留 10 个,可通过 spec.revisionHistoryLimit 调整),这些历史版本用于回滚等操作。
notion image

3、StatefuSet

Statefulset 用于部署有状态且需要有序启动的应用。Statefulset 的特点:
  • 稳定的 Pod 标识:每个 Pod 有固定的主机名:<statefulsetName>-<ordinal> ,例如 mysql-0mysql-1
  • 持久化存储:通过 VolumeClaimTemplate 为每个 Pod 单独创建持久卷(PVC),遵循命名:<volumeClaimTemplateName>-<podName>-<ordinal> 。在删除或者缩放 Statefulset 的时候不会删除和 Statefulset 有关的存储,Pod 重新调度后仍能挂载相同的存储。
  • 稳定的网络标识:StatefuSet 创建的 Pod 一般使用 Headless Service,遵循命名:statefulsetName-{0..N-1}.service-name.namespace.svc.cluster.local 。和普通 Service 的区别是 Headless Service 没有 ClusterIP ,而是直接返回后端 Pod 的 IP 地址 。
  • 有序部署/扩缩:按顺序创建/删除 Pod(如从 pod-0 到 pod-N),按相反顺序(从 N-1 到 0)更新 Pod。
StatefuSet 示例:
注意:
  • 如果应用不需要任何稳定的标识或者有序的部署、删除或扩展,应该优先考虑使用 Deployment。
  • 因为 StatefulSet 使用 Headless Service 来负责 Pod 的网络通信,所以需要提前创建 Headless Service 资源。

4、DaemonSet

DaemonSet 确保集群中每个匹配的节点上都运行一个 Pod 的副本。当有新节点加入集群时,DaemonSet 会自动在新节点上创建 Pod;当节点从集群中移除时,这些 Pod 也会被垃圾回收。
DaemonSet 常用于运行集群级别的守护进程,例如:
  • 集群存储守护程序:如 glusterd、ceph
  • 日志收集器:如 fluentd、logstash
  • 监控代理:如 Prometheus Node Exporter、Datadog agent
  • 网络插件:如 Calico、Weave 网络组件

5、Job

Job 用于管理一次性任务或批处理作业。与 Deployment 不同,Job 确保一个或多个 Pod 成功完成然后终止。
Job 适用的场景:
  • 批处理任务:数据处理、ETL 作业
  • 数据库迁移:一次性数据库 schema 变更
  • 科学计算:并行处理计算任务
  • 测试任务:运行集成测试或性能测试
Job 使用示例:
  • completions:指定需要成功完成 Pod 的数量。
  • parallelism:指定可以并行运行的 Pod 数量。
  • backoffLimit:指定重试次数(默认为6)。
  • activeDeadlineSeconds:设置 Job 运行的最长时间(秒)
  • ttlSecondsAfterFinished :完成 N 秒后删除。

6、CronJob

CronJob 用于运行周期性的任务,类似于 Unix 系统的 crontab
CronJob 适用的场景:
  • 数据备份与归档:定期备份数据库或文件系统
  • 文件清理:定期清理或压缩日志文件
  • 定期健康检查:对系统进行周期性健康诊断
  • 定期测试:执行自动化测试套件
CronJob 使用示例:
 
Kubernetes系列:容器网络(Service、Ingress)Kubernetes系列:核心组件简介
Loading...