1、定义
又称工作负载,用于管理pod的中间层,确保pod资源符合预期的状态(副本数、容器的重启策略、镜像拉取策略、pod出现故障时的重启等)
2、控制器类型
replicaSet | 指定pod副本的数量。三个组件:①pod的副本数②标签选择器(判断哪个pod归自己管理)③扩缩容 |
Deployment | 工作在replicaSet之上的。目前最好的控制器,支持滚动更新和回滚,并提供声明式配置。管理无状态的应用 |
statefulSet | 可以设置副本数、扩缩容,pod的序号是固定的,重启后pod的名称不会发生变化。管理有状态的应用 |
DaemonSet | 可以在所有节点部署一个相同的pod,没有副本数,可以限制部署的节点,服务必须是守护进程。管理无状态的应用 |
job | 工作pod控制器。执行完成即刻退出,不需要重启,也不需要重建 |
cronjob | 周期性的定时任务控制器。无需在后台持续运行 |
无状态应用:pod名称是无序的,所有pod都是一体的,所有deployment下的pod共享一个存储 有状态应用:pod名称是有序的(0到N),所有pod都是独立的,存储卷也是独立的,删除也不会改变pod的序号,扩缩容也是有序扩缩容 |
3、pod与控制器的关系
pod通过标签label与selector进行关联
(1)DaemonSet控制器
无状态应用:pod名称是无序的,所有pod都是一体的,所有deployment下的pod共享一个存储建议web终端不要加此字段,否则会导致服务中断,也会中断业务
Deployment的默认策略(一般不动) | |
maxSurge: 25% | 升级过程中,新启动的pod数量不能超过期望pod数的25% |
maxUnavailable: 25% | 升级过程中,新pod启动成功后,销毁的旧的pod数量不能超过期望pod的25% |
(2)statefulSet控制器(结合动态pv)
有状态应用:pod名称是有序的(0到N),所有pod都是独立的,存储卷也是独立的,删除也不会改变pod的序号,扩缩容也是有序扩缩容
扩容:
缩容:
statefulSet控制器的特点 | |||
• headless service无头服务 没有clusterIP,是k8s集群中一种特殊的服务类型,不分配ClusterIP给service,也不会负载均衡到后端pod,由DNS来提供服务的发现和访问,由于ClusterIP是空的,所以k8s集群会给每个headless service中的pod创建一个DNS记录 | |||
格式:pod-name.headless-service-name.namespace.svc.cluster.local | |||
web-0 | nginx-web | defaults | 本地地址(pod的IP地址) |
通过DNS直接解析访问pod的IP地址 web-0 10.244.1.10 | |||
• 必须有动态pvc 有状态的副本集群都会涉及持久化存储,每个pod是独立个体,每个pod都有一个自己的专用的存储点,statefulSet在定义时已规定每个pod不能使用同一个存储卷,所以需要动态pv | |||
为什么用headless service无头服务? 有序、独立个体。deployment的pod是无序的,没有名称的随机字符串,需要一个集中的clusterIP来集中统一为这些pod提供一个网络服务。statefulSet是有序的,且pod名称是固定的,重建之后pod的标识符也不变(pod名称是唯一的标识符),系统直接通过pod名称解析pod的IP地址(pod名称不变,类似于访问百度一样,即便有多个IP地址,访问域名即可访问IP地址) |
②应用场景
• 不是固定节点的应用,不是固定IP的应用
• 更新、发布较频繁
• 支持自动伸缩。节点的资源不够时可以自动扩
(3)daemonSet控制器(用于后台运行的网络)
作用:确保每个节点上都会创建一个pod,无法指定副本数。若有node加入集群,也会为它新增一个pod;当node节点从集群中移除时,pod也会被回收
①节点随机部署pod
注:daemonset无法指定副本数
注:即便没有指定副本数,也会在每个节点上创建一个pod
②指定节点标签部署pod
注:不需要指定调度策略,默认会在每个节点创建一个pod,除非节点上设置了污点,不会在此节点上创建pod。可以通过指定的方式把daemonset部署在指定的节点基于控制器创建的pod,delete相当于重启,要彻底删除pod必须删除控制器
在delete pod容器之前要查看是基于控制器创建的,还是自主式创建pod。基于控制器创建的pod可以delete相当于重启,dalete删除自主式创建的pod是真的删除(慎重)
(4)job控制器(普通任务)
①作用
适用于只需要执行一次的任务。比如脚本、数据库迁移、视频解码等业务
②特点
• 必须指定容器的重启策略OnFailure或Never;
• 失败次数默认是6次;
• 更新yaml文件,必须先删除任务再更新,无法动态更新
对于k8s系统来说,既然已定义job,即只需要执行一次或指定次数,不能一直运行
(5)cronjob控制器(定时任务)
周期性任务定时执行。与linux的crontab语法一样
①格式:分 时 日 月 周
②应用场景:定时备份、通知、定时检测(结合探针一起)
③特点
• 失败次数默认是3次
• 必须设置pod的重启策略