前言
环境: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详细内容删除,详情可看原文。
ReplicaSet介绍(一般不会直接用到replicaset,一般是deployment创建replicaset)
详细内容删除,详情可看原文。
DaemonSet介绍(DaemonSet用于确保每个节点都运行一个pod的场景)
DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod也会被回收。删除 DaemonSet将会删除它创建的所有 Pod。DaemonSet 简写为ds。
使用 DaemonSet 的一些典型用法:
运行集群存储 daemon,例如在每个 Node 上运行 glusterd 、 ceph
在每个 Node 上运行日志收集 daemon,例如 fluentd 、 logstash
在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter、 collectd 、Datadog 代理、New Relic 代理,或 Ganglia gmond
编写一个DaemonSet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
[root@master ~]# vim ds.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx-ds namespace: default spec: selector: matchLabels: app: nginx release: stable template: metadata: labels: app: nginx release: stable spec: containers: - name: nginx image: nginx:1.14 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 [root@master ~]# kubectl apply -f ds.yaml #应用yaml文件创建资源 [root@master ~]# kubectl get pod -o wide #查看pod,发现已经有2个pod,分别位于各个节点上 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-ds-5qnxs 1/1 Running 0 4m10s 10.244.2.22 node2 <none> <none> nginx-ds-l7kjk 1/1 Running 0 4m10s 10.244.1.40 node1 <none> <none> |
再次说明:DaemonSet创建的pod只会在每个节点运行1个,也就是说你不用在创建DaemonSet的yaml文件中指定副本数,没必要;当每个节点的DaemonSet管理的pod被删除或者pod异常退出时,DaemonSet控制器又会重新创建一个pod,因为DaemonSet会实时监管每个节点确保存在一个pod运行。
查看daemonset
|
|
[root@master ~]# kubectl get daemonset -n default #查看集群的DaemonSet NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE nginx-ds 2 2 2 2 2 <none> 14m |
删除daemonset
|
|
[root@master ~]# kubectl delete pod nginx-ds-5qnxs #删除某个节点上的pod,ds又会重新创建一个pod pod "nginx-ds-5qnxs" deleted [root@master ~]# kubectl delete daemonset nginx-ds #删除ds,其创建的pod都被删除 daemonset.apps "nginx-ds" deleted [root@master ~]# |
Job介绍(一次性计划任务,类似于centos的at命令)
有时候我们可能需要一种这样的pod控制器,即该控制器能实现pod执行完任务就结束,不需要重启或重建pod,相当于一次性任务。这就可以使用job控制器。(可以简单的理解为,Job相当于Linux中的at一次性计划任务)
详细内容删除,详情可看原文。
Deployment和Statefulset区别


Deployment:
|
|
1.pod之间没有顺序 2.所有pod共享存储 3.pod名字包含随机数字 4.service都有ClusterIP,可以负载均衡 |
Statefulset:
|
|
1.部署、扩展、更新、删除都要有顺序 2.每个pod都有自己存储,所以都用volumeClaimTemplates,为每个pod都生成一个自己的存储,保存自己的状态 3.pod名字始终是固定的 4.service没有ClusterIP,是headlessservice,所以无法负载均衡,返回的都是pod名,所以pod名字都必须固定; StatefulSet在Headless Service的基础上又为StatefulSet控制的每个Pod副本创建了一个DNS域名:$(podname).(headless server name).namespace.svc.cluster.local |

使用场景:
StatefulSet
有状态集群的调度。
对于ZooKeeper、Elasticsearch、MongoDB、Kafka等有状态集群,虽然集群中的每个Worker节点看起来都是相同的,但每个Worker节点都必须有明确的、不变的唯一ID(主机名或IP地址),这些节点的启动和停止次序通常有严格的顺序。
此外,由于集群需要持久化保存状态数据,所以集群中的Worker节点对应的Pod不管在哪个Node上恢复,都需要挂载原来的Volume
DaemonSet
在每个Node上调度并且仅仅创建一个Pod副本。
这种调度通常用于系统监控相关的Pod,比如主机上的日志采集、主机性能采集等进程需要被部署到集群中的每个节点,并且只能部署一个副本
Job、CronJob
对于批处理作业,需要创建多个Pod副本来协同工作,当这些Pod副本都完成自己的任务时,整个批处理作业就结束了。
这种Pod运行且仅运行一次的特殊调度,用常规的RC或者Deployment都无法解决,所以Kubernetes引入了新的Pod调度控制器Job来解决问题,并继续延伸了定时作业的调度控制器CronJob。
-
ClusterIP Service:适用于无状态服务,提供负载均衡和内部访问。
-
Headless Service:适用于有状态服务(如数据库),允许直接访问 Pod IP 或固定 DNS 记录。
-
关键区别:是否分配 clusterIP 和是否启用负载均衡。
————————————————
来源:https://blog.csdn.net/MssGuo/article/details/122934233
https://zhuanlan.zhihu.com/p/248405724
https://blog.csdn.net/nickDaDa/article/details/90401635
https://xdoctorx.blog.csdn.net/article/details/124681607?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7EPayColumn-1-124681607-blog-118881988.235%5Ev35%5Epc_relevant_increate_t0_download_v2_base&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7EPayColumn-1-124681607-blog-118881988.235%5Ev35%5Epc_relevant_increate_t0_download_v2_base&utm_relevant_index=1
「三年博客,如果觉得我的文章对您有用,请帮助本站成长」
共有 0 - pod常用控制器介绍(deployment、StatefulSet、Job、CronJob、DaemonSet)