type
status
date
slug
summary
tags
category
icon
password
1、概述
前面我们提到 Pod 就是用来运行和管理容器的,在实际使用时,我们不会创建单独的 Pod 来运行容器,而是使用更高级的资源进行调度。例如:
- Deployment:管理无状态应用(如 Web 服务),Pod 无唯一标识且可替换。
- StatefulSet:管理有状态应用(如数据库、分布式系统),Pod 有唯一且固定的标识(如
pod-name-0
、pod-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
调整),这些历史版本用于回滚等操作。
3、StatefuSet
Statefulset 用于部署有状态且需要有序启动的应用。Statefulset 的特点:
- 稳定的 Pod 标识:每个 Pod 有固定的主机名:
<statefulsetName>-<ordinal>
,例如mysql-0
、mysql-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 使用示例:
- Author:mcbilla
- URL:http://mcbilla.com/article/1fa85c7d-7c1d-80cc-ac34-f056480bc8bf
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts