跳转至

Kubernetes 工作负载资源详解:Pod、Deployment、StatefulSet、DaemonSet 一次讲透

文章摘要

在 Kubernetes 中,真正运行应用程序的是 Pod。

但在实际生产环境中,我们很少直接管理 Pod,而是通过 Deployment、StatefulSet、DaemonSet、Job、CronJob 等工作负载资源来管理应用。

本文将从整体视角讲解 Kubernetes 工作负载体系,帮助你理解各种工作负载资源之间的关系以及适用场景。


学习目标

阅读完本文后,你将掌握:

  • 什么是工作负载资源
  • Pod 的作用
  • Deployment 工作机制
  • StatefulSet 使用场景
  • DaemonSet 使用场景
  • Job 与 CronJob 区别
  • 工作负载资源选择原则

适用人群

本文适合:

  • Kubernetes 初学者
  • Linux 运维工程师
  • DevOps 工程师
  • 云原生学习者
  • Kubernetes 面试准备人员

什么是工作负载资源?

工作负载(Workload)可以理解为:

负责运行应用程序的资源对象

例如:

Nginx

MySQL

Redis

Java应用

Python应用

最终都需要运行在 Kubernetes 中。


而 Kubernetes 提供了一系列资源来管理这些应用。

这些资源统称:

Workload

Kubernetes 工作负载体系

整体结构如下:

Deployment


ReplicaSet


Pod


Container

或者:

StatefulSet


Pod

或者:

DaemonSet


Pod

最终:

所有工作负载都会创建 Pod

因此:

Pod 是运行载体,而其它工作负载资源本质上都是 Pod 管理器。


为什么不直接使用 Pod?

例如:

kind: Pod

创建:

nginx-pod

如果节点故障:

Pod 消失

如果误删除:

kubectl delete pod nginx-pod

Pod 也会直接消失。


Kubernetes 不会自动恢复。


因此生产环境很少直接创建 Pod。


而是使用:

Deployment

管理 Pod。


Pod:最小运行单元

Pod 是 Kubernetes 中最小的调度单位。


结构:

Pod

├── Container A
└── Container B

通常:

一个 Pod
一个容器

最常见。


特点:

  • 拥有独立 IP
  • 共享网络命名空间
  • 共享存储卷
  • 被调度到单个节点

适合:

测试环境
调试环境

生产环境通常不直接使用。


Deployment:无状态应用首选

这是最常见的工作负载资源。


例如:

kind: Deployment

创建:

replicas: 3

效果:

Pod-1

Pod-2

Pod-3

如果:

Pod-2

异常退出。


Deployment 自动创建:

Pod-4

补齐副本。


Deployment 特点

支持:

  • 副本管理
  • 自动恢复
  • 滚动更新
  • 回滚
  • 扩缩容

适用场景

例如:

Nginx

Java API

Python API

Web应用

简单记忆:

无状态应用优先选择 Deployment。


StatefulSet:有状态应用首选

很多服务不能随意更换身份。

例如:

MySQL

Redis

Kafka

ZooKeeper

这些服务需要:

固定名称

固定存储

固定顺序

Deployment 无法保证。


因此 Kubernetes 提供:

StatefulSet

StatefulSet 特点

每个 Pod 拥有:

mysql-0

mysql-1

mysql-2

固定名称。


同时拥有:

独立PVC

独立存储。


重建后:

名称不变

数据不变

适用场景

MySQL

Redis

MongoDB

Kafka

Elasticsearch

简单记忆:

有状态应用优先选择 StatefulSet。


DaemonSet:每个节点运行一个 Pod

DaemonSet 的特点非常特殊。


创建:

kind: DaemonSet

效果:

Node01 → Pod

Node02 → Pod

Node03 → Pod

每个节点自动运行一个实例。


新增节点:

Node04

自动创建:

Pod

典型场景

日志采集:

Fluent Bit

Filebeat

监控采集:

Node Exporter

网络插件:

Calico

Flannel

简单记忆:

每个节点运行一个实例时使用 DaemonSet。


Job:一次性任务

有些任务不需要长期运行。

例如:

数据库初始化

数据导入

批量处理

执行完成即可退出。


使用:

kind: Job

特点:

成功即结束

适用场景

数据迁移

批量计算

初始化脚本

CronJob:定时任务

类似 Linux:

crontab

例如:

每天凌晨:

备份数据库

每小时:

同步数据

使用:

kind: CronJob

例如:

schedule: "0 2 * * *"

表示:

每天凌晨2点执行

适用场景

自动备份

日志清理

报表生成

工作负载资源关系图

最常见链路:

Deployment


ReplicaSet


Pod


Container

StatefulSet:

StatefulSet


Pod


PVC


Storage

DaemonSet:

DaemonSet


每个Node一个Pod

Job:

Job


Pod


完成后退出

CronJob:

CronJob


Job


Pod

工作负载资源如何选择?

场景 推荐资源
Web应用 Deployment
API服务 Deployment
MySQL StatefulSet
Redis集群 StatefulSet
Kafka StatefulSet
日志采集 DaemonSet
节点监控 DaemonSet
数据导入 Job
自动备份 CronJob

生产环境最佳实践

不直接管理 Pod

推荐:

Deployment

数据库使用 StatefulSet

避免:

Deployment + MySQL

节点组件使用 DaemonSet

例如:

Calico

Node Exporter

Fluent Bit

定时任务使用 CronJob

避免:

长期运行脚本

常见故障排查

查看工作负载:

kubectl get deploy

查看 StatefulSet:

kubectl get sts

查看 DaemonSet:

kubectl get ds

查看 Job:

kubectl get jobs

查看 CronJob:

kubectl get cronjobs

查看 Pod:

kubectl get pods

面试常见问题

Pod 和 Deployment 的区别?

Deployment 管理 Pod。


StatefulSet 解决什么问题?

有状态应用管理。


DaemonSet 适合什么场景?

每节点运行一个实例。


Job 与 CronJob 的区别?

CronJob 定时创建 Job。


MySQL 应该使用什么资源?

StatefulSet。


FAQ

Pod 能直接用于生产吗?

可以,但不推荐。


Deployment 能部署 MySQL 吗?

技术上可以。

生产环境不推荐。


DaemonSet 会自动覆盖新节点吗?

会。


总结

工作负载资源负责管理 Kubernetes 中运行的应用程序。

其中:

  • Pod 负责运行容器
  • Deployment 管理无状态应用
  • StatefulSet 管理有状态应用
  • DaemonSet 管理节点级服务
  • Job 执行一次性任务
  • CronJob 执行定时任务

可以记住一句话:

Pod 是运行载体,而 Deployment、StatefulSet、DaemonSet 等资源则是 Pod 的管理者。


相关阅读

  • [Kubernetes Pod 生命周期详解]
  • [Kubernetes Deployment 工作原理]
  • [Kubernetes StatefulSet 工作原理]
  • [Kubernetes Service 工作原理]
  • [Kubernetes 存储资源详解]