pod常用控制器介绍(deployment、StatefulSet、Job、CronJob、DaemonSet)

本文详细介绍了Kubernetes中管理Pod的控制器,包括已被废弃的ReplicationController、其替代者ReplicaSet、用于确保每个节点运行一个Pod的DaemonSet、一次性任务的Job以及周期性任务的CronJob。这些控制器在集群中确保Pod的稳定运行、自动扩展和任务调度。ReplicationController和ReplicaSet主要负责保持Pod副本数量的稳定,而DaemonSet保证每个节点至少有一个Pod副本。Job和CronJob则针对一次性或周期性任务设计,Job执行完成后自动结束,CronJob按预设时间间隔定期执行任务。

前言

环境:centos7.9 docker-ce-20.10.9 kubernetes-version v1.22.6
在上一篇《pod的介绍、命令行创建pod》我们介绍了何为pod,以及如何在命令行创建pod,但这都不是我们在生产环境的常规操作,我们在生产环境中一般是通过控制器来创建pod的,并使用控制器来管理pod。本篇我们来论述何为pod控制器。

何为pod控制器

pod控制器,是用于管理、部署pod的一种k8s中重要的资源,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会新建pod的资源。这样,当有了控制器来管理pod,我们就能轻松的通过配置控制器,让控制器来帮我们实现我们所期望的pod扩容、缩容,即使当pod出现异常挂掉,控制器也能立即重新启动一个pod,因为控制器的本质其实就是实时检查pod数量使其符合我们预先设定的值。

常用pod控制器

常用的pod控制器有一下几种:

ReplicationController: 比较原始的pod控制器,已经被废弃,了解即可,有ReplicaSet替代;
ReplicaSet: 保证指定数量的pod运行,并提供pod数据变更,镜像版本变更;
DaemonSet: 在集群每个node上都运行一个pod,确保全部Node 上运行一个 Pod 的副本,适用于每个node工作节点后台日志收集等场景;
CronJob: 用于执行周期性定时任务的pod,主要用于执行周期性计划,类似于Linux的crontab定时任务;
Job: 用于一次性计划任务的pod,执行完毕pod就立即退出,类似于Linux的at命令;
Deployment: 通过创建DaemonSet来创建pod,支持滚动升级,版本回退,Deployment是最常用的pod控制器;
Horizontal Pod Autoscaler: 可以根据集群负载自动调整pod的数量,实现自动扩容缩容,削峰填谷;
StatefulSet: 管理又状态的应用;

ReplicationController介绍(已废弃,基本不会用到这种控制器)

ReplicationController,简写rc,是k8s中一种pod控制器,在新版本中,rc已经被取代,所以这里了解rc即可;
ReplicationController会持续监控正在运行的pod列表,并保证相应标签类型的pod数量与期望的相符,如正在运行的pod太少,rc就会根据pod模板来创建新的副本,如果正在运行的pod太多,rc将会删除多余的pod。
总之,ReplicationController的工作就是确保pod数据始终与其定义的标签选择器选中的pod数量相匹配,如果不匹配,rc将会根据所需,采取适当的操作来协调pod数量。

rc的三大部分
1、label selector,标签选择器,用于确定rc作用于哪些pod,反过来说哪些pod可以被rc管理;
2、replica,副本数,指定运行的pod数量;
3、pod template,pod模板,用于创建新的pod副本,pod就是根据模板来创建的。

rc的实现原理
rc与pod其实是通过标签和标签选择器来进行管联的,当改变一个pod的标签,那么该pod就会脱离rc的管理,而rc 发现少了一个pod,又会根据模板重新创建一个pod来满足副本数。如果先独立创建了pod并定义了标签,然后再创建rc,rc的标签筛选器和已存在的pod的标签相同,那么创建rc时,rc直接接管已存在的pod,rc根本不会创建新的pod,这就说明,rc与pod的根本就是通过标签和标签选择器来进行管联的。

更改rc的标签选择器和pod模板会怎样
更改rc的标签选择器和pod模板对正在运行的pod没有影响,更改标签选择器会使现有的pod脱离rc的范围,因此rc会停止关注它们,它们称为无人托管的pod。如果更改了pod模板,该模板仅影响由rc创建的新的pod。

创建一个ReplicationController
下面就来创建一个ReplicationController资源:

[root@master ~]# vim rc_nginx.yaml 
apiVersion: v1
kind: ReplicationController				#创建一个ReplicationController控制器
metadata:
  name: rc-nginx						#控制器名称
  namespace: default					#命名空间
spec:
  replicas: 3							#表示pod副本数
  selector:								#定义标签选择器,用于说明rc控制管理的是带有哪些标签的pod
     app: nginx							#标签app=nginx
  template:								#定义pod模板,pod模板就是用来创建pod
     metadata:
       labels:							#pod标签,注意:pod标签必须与上面标签选择器定义的标签相同,否者rc就不知道如何关联pod
         app: nginx
     spec:
         containers:
         - image: nginx:1.7.9
           name: nginx-container
           ports:
           - containerPort: 80
[root@master ~]# kubectl  apply  -f rc_nginx.yaml 								#应用yaml文件
[root@master ~]# kubectl  get rc,pod --show-labels 								#查看rc和pod
NAME                             DESIRED   CURRENT   READY   AGE   LABELS
replicationcontroller/rc-nginx   3         3         3       43m   app=nginx

NAME                 READY   STATUS    RESTARTS   AGE   LABELS
pod/rc-nginx-4drqr   1/1     Running   0          43m   app=nginx
pod/rc-nginx-cn8wv   1/1     Running   0          43m   app=nginx
pod/rc-ng
<think>好的,我现在需要确认ReplicaSet、DeploymentStatefulSetDaemonSetJobCronJob是否都属于kube-controller-manager管理的控制器。首先,用户提到的这些控制器都是Kubernetes中常见的工作负载控制器,我需要回忆一下Kubernetes的架构,特别是kube-controller-manager的作用。 根据之前的回答和引用内容,kube-controller-manager负责运行各种控制器,比如EndpointController、ReplicaSetController等。引用[3]和[4]提到DeploymentStatefulSetDaemonSetJobCronJob都是控制器类型,但需要确认它们是否由kube-controller-manager直接管理。 ReplicaSet控制器由kube-controller-manager中的ReplicaSetController处理,负责维护Pod的副本数。Deployment控制器则通过管理ReplicaSet来实现滚动更新等操作,属于DeploymentController的一部分。StatefulSetController管理有状态应用,DaemonSetController确保每个节点运行一个PodJobController处理一次性任务,CronJobController管理周期性任务。这些控制器应该都是kube-controller-manager的内置控制器。 需要验证这些控制器是否在kube-controller-manager的启动参数中默认启用。例如,引用[1]中的启动参数包含`--controllers=*,bootstrapsigner,tokencleaner`,其中`*`表示启用所有默认控制器。因此,用户提到的这些控制器应该都被包含在内。 不过,根据引用[5],旧的ReplicationController(RC)已被ReplicaSet取代,但RC的控制器可能仍存在于kube-controller-manager中。但用户的问题是关于ReplicaSet等,所以应该都在管理范围内。需要确保回答中明确区分ReplicaSet和旧RC的不同,但用户提到的都是当前常用控制器,属于kube-controller-manager的管理范围。</think>### 确认回答 **是的**,$ReplicaSet$、$Deployment$、$StatefulSet$、$DaemonSet$、$Job$、$CronJob$ 均属于 `kube-controller-manager` 管理的控制器范围。以下为详细说明: --- #### 一、控制器归属关系 1. **直接管理** `kube-controller-manager` 通过内置的控制器逻辑直接管理以下工作负载控制器: - **$ReplicaSet$**:由 `ReplicaSetController` 控制,确保 Pod 副本数符合预期[^3][^5] - **$Deployment$**:由 `DeploymentController` 控制,通过操作 ReplicaSet 实现滚动更新、回滚等操作[^4] - **$StatefulSet$**:由 `StatefulSetController` 控制,管理有状态应用的拓扑和存储[^4] - **$DaemonSet$**:由 `DaemonSetController` 控制,确保所有(或特定)节点运行指定 Pod[^3] - **$Job$**:由 `JobController` 控制,执行一次性任务并跟踪完成状态 - **$CronJob$**:由 `CronJobController` 控制,基于时间规则触发 Job[^4] 2. **关联验证方法** - **查看启动参数**:若 `kube-controller-manager` 启动时包含 `--controllers=*`(默认值),则启用所有内置控制器: ```bash ps -ef | grep controller-manager | grep --color=auto controllers ``` - **代码结构验证**:在 Kubernetes 源码中,这些控制器的逻辑均位于 `cmd/kube-controller-manager/app` 目录下[^2]。 --- #### 二、控制器管理机制对比 | 控制器类型 | 管理对象 | 核心功能 | 控制器名称 | |------------------|--------------|-----------------------------------|--------------------------| | ReplicaSet | Pod 副本数 | 维护指定数量的相同 Pod | ReplicaSetController | | Deployment | ReplicaSet | 实现应用版本控制与滚动更新 | DeploymentController | | StatefulSet | 有状态 Pod | 提供稳定网络标识和持久化存储 | StatefulSetController | | DaemonSet | 节点级 Pod | 确保每个节点运行指定 Pod | DaemonSetController | | Job | 一次性任务 | 执行短时任务直至完成 | JobController | | CronJob | 周期性任务 | 按时间规则触发 Job | CronJobController | --- #### 三、常见疑问解答 **Q1: 为何旧版 ReplicationController(RC)未被提及?** A1: ReplicationController 是 Kubernetes 早期版本使用的控制器,现已被 $ReplicaSet$ 取代。`kube-controller-manager` 仍兼容 `ReplicationController`,但默认推荐使用更灵活的 ReplicaSet[^5]。 **Q2: 如何确认某个控制器是否被启用?** A2: 通过以下方式验证: ```bash # 查看控制器是否在运行参数中明确启用 kube-controller-manager --controllers=deployment,daemonset,... ``` 若未显式指定控制器列表(即使用 `--controllers=*`),则默认启用所有内置控制器[^1][^4]。 --- #### 四、管理边界说明 `kube-controller-manager` **不直接管理**以下资源: - **Pod 本身**:由 `kubelet` 直接管理 - **自定义控制器**:需通过 CRD(Custom Resource Definition)和独立控制器进程实现 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值