k8s各类控制器详解

一、控制器定义

控制器也是管理pod的一种手段

  • 自主式pod:pod退出或意外关闭后不会被重新创建

  • 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目

Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod

当建立控制器后,会把期望值写入etcd,k8s中的apiserver检索etcd中我们保存的期望状态,并对比pod的当前状态,如果出现差异代码自驱动立即恢复

二、控制器常用类型

三 replicaset控制器

3.1 replicaset功能

  • ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet

  • ReplicaSet和Replication Controller的唯一区别是选择器的支持,ReplicaSet支持新的基于集合的选择器需求

  • ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行

  • 虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制

3.2 replicaset参数说明

3.3 replicaset 示例

root@k8s-master pod\]# kubectl create deployment timinglee --image myapp:v1 --replicas 2 --dry-run=client -o yaml \> timinglee.yml \[root@k8s-master pod\]# ls lee.yml timinglee.yml \[root@k8s-master pod\]# vim timinglee.yml ![](https://i-blog.csdnimg.cn/direct/c4dd8af1835d48c6a5c3b072fa984fc6.png) ![](https://i-blog.csdnimg.cn/direct/f02e5dcea1fa468cbc124240d14e007e.png) #### replicaset 示例 \[root@k8s-master pod\]# ls lee.yml timinglee.yml \[root@k8s-master pod\]# vim timinglee.yml ![](https://i-blog.csdnimg.cn/direct/f5f83354a12e438d8a6879b02af4ad3b.png) ![](https://i-blog.csdnimg.cn/direct/634e930515e346998c5fc7115de7bdf1.png) ![](https://i-blog.csdnimg.cn/direct/0696eace09044a00918ca7ef0f770f68.png) ![](https://i-blog.csdnimg.cn/direct/6267e84bf0cf4f2daba3f08e55ff4dd3.png) > > ##### #replicaset是通过标签匹配pod > > \[root@k8s-master pod\]# kubectl label pods example-rep-9lbts app=lee --overwrite > > pod/example-rep-9lbts labeled > > \[root@k8s-master pod\]# kubectl get pods --show-labels > > NAME READY STATUS RESTARTS AGE LABELS > > example-rep-22qx8 1/1 Running 0 4s app=timinglee > > example-rep-9lbts 1/1 Running 0 5m22s app=lee > > example-rep-dvjhp 1/1 Running 0 5m22s app=timinglee > > ##### #恢复标签后 > > \[root@k8s-master pod\]# kubectl label pods example-rep-9lbts app=timinglee --overwrite > > pod/example-rep-9lbts labeled > > \[root@k8s-master pod\]# kubectl get pods --show-labels > > NAME READY STATUS RESTARTS AGE LABELS > > example-rep-9lbts 1/1 Running 0 6m46s app=timinglee > > example-rep-dvjhp 1/1 Running 0 6m46s app=timinglee ![](https://i-blog.csdnimg.cn/direct/21be424acb824588bdfa101ff462e013.png) ![](https://i-blog.csdnimg.cn/direct/09c358d35acb4b7f9b888a899bc31f4e.png) ![](https://i-blog.csdnimg.cn/direct/326cbab57e42485bb485b7f4a9ec6c3f.png) \[root@k8s-master pod\]# kubectl delete replicasets.apps example-rep replicaset.apps "example-rep" deleted ##### ###不能对版本维护 \[root@k8s-master pod\]# vim timinglee.yml ![](https://i-blog.csdnimg.cn/direct/69f6509c9b464a7da67854931c56d8aa.png) > \[root@k8s-master pod\]# kubectl apply -f timinglee.yml > > replicaset.apps/example-rep created > > \[root@k8s-master pod\]# kubectl get pods -o wide > > NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES > > example-rep-5qd56 1/1 Running 0 41s 10.244.2.30 k8s-node1.timinglee.org \ \ > > example-rep-wsb8r 1/1 Running 0 41s 10.244.1.38 k8s-node2.timinglee.org \ \ > > \[root@k8s-master pod\]# curl 10.244.2.30 > ![](https://i-blog.csdnimg.cn/direct/f10b843f92be4ed59c3eaed12ab55ff5.png) ## ![](https://i-blog.csdnimg.cn/direct/f564828fb67f4ec694c39421173b2a90.png) \[root@k8s-master pod\]# kubectl delete replicasets.apps example-rep replicaset.apps "example-rep" deleted ## 四 deployment 控制器 ![](https://i-blog.csdnimg.cn/direct/2a9aba38e6d54f288aa209aa3a2cf3b3.png) ### 4.1 deployment控制器的功能 * 为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。 * Deployment控制器并不直接管理pod,而是通过管理ReplicaSet来间接管理Pod * Deployment管理ReplicaSet,ReplicaSet管理Pod * Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法 * 在Deployment中ReplicaSet相当于一个版本 **典型的应用场景:** * 用来创建Pod和ReplicaSet * 滚动更新和回滚 * 扩容和缩容 * 暂停与恢复 ### 4.2 deployment控制器示例 > \[root@k8s-master pod\]# kubectl create deployment timinglee-dp --image myapp:v1 --dry-run=client -o yaml \> timinglee-dp.yml > > \[root@k8s-master pod\]# vim timinglee-dp.yml > > ![](https://i-blog.csdnimg.cn/direct/d82fda3e56704274bf9dbcd802ecd92f.png) > > ![](https://i-blog.csdnimg.cn/direct/2edae2f4fe4b43d496f985b73a3a77d9.png) > > ![](https://i-blog.csdnimg.cn/direct/df4bd937d11244fb9d0decede01f101d.png) #### 4.2.1 版本迭代 ![](https://i-blog.csdnimg.cn/direct/409322eb37214587bf41469982e1e5a5.png) \[root@k8s-master pod\]# vim timinglee-dp.yml ![](https://i-blog.csdnimg.cn/direct/077a99b4239b4d8fae76632921156a61.png) ![](https://i-blog.csdnimg.cn/direct/ada03c4b4ef5473e8017c1ff724799fd.png) \[root@k8s-master pod\]# kubectl expose deployment timinglee-dp --port 80 --target-port 80 --dry-run=client -o yaml \>\> timinglee-dp.yml \[root@k8s-master pod\]# vim timinglee-dp.yml ![](https://i-blog.csdnimg.cn/direct/bdded900cf6e43e2bea3b6afc1d839d2.png) \[root@k8s-master pod\]# kubectl apply -f timinglee-dp.yml deployment.apps/timinglee-dp unchanged service/timinglee-dp created ![](https://i-blog.csdnimg.cn/direct/99d32598b01e445cb1e0b8bc9cad7158.png) \[root@k8s-master \~\]# curl 10.104.142.151 Hello MyApp \| Version: v2 \| \Pod Name\ ![](https://i-blog.csdnimg.cn/direct/ced5f045a4f24c09bded993e61ec0e80.png) \[root@k8s-master \~\]# iptables -t nat -nL ![](https://i-blog.csdnimg.cn/direct/ad5e7d06c28c401582b027764bb0c85e.png) \[!NOTE

更新的过程是重新建立一个版本的RS,新版本的RS会把pod 重建,然后把老版本的RS回收

4.2.2 版本回滚

root@k8s-master pod\]# vim timinglee-dp.yml ![](https://i-blog.csdnimg.cn/direct/b59de338ac8147d5a6ca7f01edb9f778.png) ![](https://i-blog.csdnimg.cn/direct/c1969ccbf9de49b3a1db1521197b8ab8.png) \[root@k8s-master pod\]# curl 10.104.142.151 Hello MyApp \| Version: v1 \| \Pod Name\ ![](https://i-blog.csdnimg.cn/direct/13a1ada62cbd4ba8acfcd721965419ea.png) \[root@k8s-master pod\]# kubectl get pods NAME READY STATUS RESTARTS AGE timinglee-dp-6ddbc47678-gpkz4 1/1 Running 0 108s timinglee-dp-6ddbc47678-kkt2c 1/1 Running 0 108s timinglee-dp-6ddbc47678-n6qjn 1/1 Running 0 107s timinglee-dp-6ddbc47678-zpgfj 1/1 Running 0 106s ![](https://i-blog.csdnimg.cn/direct/86ed3040c26a4f779ac7495dcd04437d.png) #### 4.2.3 滚动更新策略 \[root@k8s-master pod\]# vim timinglee-dp.yml ![](https://i-blog.csdnimg.cn/direct/3a6c35f95ae34a139d271828d4061124.png) \[root@k8s-master pod\]# kubectl apply -f timinglee-dp.yml deployment.apps/timinglee-dp configured service/timinglee-dp unchanged ![](https://i-blog.csdnimg.cn/direct/645c967e5af54c47b953a01c86cd513c.png) #### 4.2.4 暂停及恢复 在实际生产环境中我们做的变更可能不止一处,当修改了一处后,如果执行变更就直接触发了 我们期望的触发时当我们把所有修改都搞定后一次触发暂停,避免触发不必要的线上更新 #####所有的更新完再上线 \[root@k8s-master pod\]# kubectl rollout pause deployment timinglee-dp deployment.apps/timinglee-dp paused \[root@k8s-master pod\]# vim timinglee-dp.yml ![](https://i-blog.csdnimg.cn/direct/9c260306b9214ba98bfe0de75439b742.png) ![](https://i-blog.csdnimg.cn/direct/4bec0528523746f0bb92ce3e4689a7c0.png) \[root@k8s-master pod\]# curl 10.104.142.151 Hello MyApp \| Version: v2 \| \Pod Name\ ![](https://i-blog.csdnimg.cn/direct/38f1a4d2325941a6ad3b7f914ac8ec44.png) #####资源限制 \[root@k8s-master pod\]# vim timinglee-dp.yml![](https://i-blog.csdnimg.cn/direct/a407e4cf6b64406a8d5dce156e8060bc.png) ![](https://i-blog.csdnimg.cn/direct/b1c2e378ab74460fb5a89ccdb6183020.png) ![](https://i-blog.csdnimg.cn/direct/4b33d83a0b77474f99b375d5fa8cd3b4.png) ######恢复更新 \[root@k8s-master pod\]# kubectl rollout resume deployment timinglee-dp deployment.apps/timinglee-dp resumed ![](https://i-blog.csdnimg.cn/direct/fa3d6fef5157436094868a6c69e21d3a.png) ![](https://i-blog.csdnimg.cn/direct/ce7b44dec7584a0a8726e92415688b5d.png) \[root@k8s-master pod\]# kubectl describe pods timinglee-dp-5bb447f6b-knbw7 ![](https://i-blog.csdnimg.cn/direct/44d4d4010a8447509806055905e7f9f6.png) \[root@k8s-master pod\]# kubectl delete -f timinglee-dp.yml deployment.apps "timinglee-dp" deleted service "timinglee-dp" deleted ## 五 daemonset控制器 ### 5.1 daemonset功能 ![](https://i-blog.csdnimg.cn/direct/8f781967de1c414f8733aa6104558f62.png) DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod ,当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod DaemonSet 的典型用法: * 在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。 * 在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。 * 在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等 * 一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用 * 一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求 ### 5.2 daemonset 示例 > 查看污点 > > \[root@k8s-master pod\]# kubectl describe nodes k8s-node1.timinglee.org \| grep Taints > > Taints: \ > > \[root@k8s-master pod\]# kubectl describe nodes k8s-node2.timinglee.org \| grep Taints > > Taints: \ \[root@k8s-master pod\]# cp timinglee-dp.yml timinglee-dm.yml \[root@k8s-master pod\]# ls lee.yml timinglee-dm.yml timinglee-dp.yml timinglee.yml \[root@k8s-master pod\]# vim timinglee-dm.yml ![](https://i-blog.csdnimg.cn/direct/647dfbddc060471ca3828450912a67d4.png) ####无master (master有污点) ![](https://i-blog.csdnimg.cn/direct/3cb559aa720d409198db75183d692914.png) #####容忍污点 \[root@k8s-master pod\]# kubectl delete -f timinglee-dm.yml daemonset.apps "timinglee-dm" deleted \[root@k8s-master pod\]# vim timinglee-dm.yml ![](https://i-blog.csdnimg.cn/direct/115c574472ed453199dbca5503bf37d8.png) \[root@k8s-master pod\]# kubectl apply -f timinglee-dm.yml daemonset.apps/timinglee-dm created ![](https://i-blog.csdnimg.cn/direct/e0b7472e878a4b8b9b89288de8a82e23.png) \[root@k8s-master pod\]# kubectl delete -f timinglee-dm.yml daemonset.apps "timinglee-dm" deleted ## 六 job 控制器 ### 6.1 job控制器功能 ![](https://i-blog.csdnimg.cn/direct/72c7b86eb2bb431eb4e381d18127c47e.png) Job,主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务 Job特点如下: * 当Job创建的pod执行成功结束时,Job将记录成功结束的pod数量 * 当成功结束的pod达到指定的数量时,Job将完成执行 ### 6.2 job 控制器示例: > ![](https://i-blog.csdnimg.cn/direct/a258277cbb0544b3a8320dd3a3fa0bb9.png) > > \[!NOTE

关于重启策略设置的说明:

  • 如果指定为OnFailure,则job会在pod出现故障时重启容器

而不是创建pod,failed次数不变

  • 如果指定为Never,则job会在pod出现故障时创建新的pod

并且故障pod不会消失,也不会重启,failed次数加1

  • 如果指定为Always的话,就意味着一直重启,意味着job任务会重复去执行了

root@k8s-master \~\]# docker tag perl:5.34.0 reg.timinglee.org/library/perl:5.34.0 \[root@k8s-master \~\]# docker push reg.timinglee.org/library/perl:5.34.0 ![](https://i-blog.csdnimg.cn/direct/fd0a0be7bc2f4f3080a49d17b13bfa7a.png) \[root@k8s-master \~\]# kubectl create job timinglee-job --image perl:5.34.0 --dry-run=client -o yaml \> timinglee-job.yml \[root@k8s-master \~\]# vim timinglee-job.yml ![](https://i-blog.csdnimg.cn/direct/3e071a3aacef4b1c93e23fe5bcd8aad0.png) \[root@k8s-master \~\]# kubectl apply -f timinglee-job.yml job.batch/timinglee-job created ![](https://i-blog.csdnimg.cn/direct/60b5781d97174ef8857a501961931cb9.png) ![](https://i-blog.csdnimg.cn/direct/2f7ec7cd32de4da8804808edc268136d.png) \[root@k8s-master \~\]# kubectl delete -f timinglee-job.yml job.batch "timinglee-job" deleted \[root@k8s-master \~\]# vim timinglee-job.yml ![](https://i-blog.csdnimg.cn/direct/e2a4ffd6bc41410e9a4a1f7c11c87b1a.png) \[root@k8s-master \~\]# kubectl apply -f timinglee-job.yml job.batch/timinglee-job created ![](https://i-blog.csdnimg.cn/direct/9d28929c4c45411583de0d8178fffcac.png) ![](https://i-blog.csdnimg.cn/direct/202560c2f74e4d8bb2d8bbab2332d8f3.png) \[root@k8s-master \~\]# kubectl delete -f timinglee-job.yml job.batch "timinglee-job" deleted ## 七 cronjob 控制器 ### 7.1 cronjob 控制器功能 ![](https://i-blog.csdnimg.cn/direct/f01584b7b2bb43d69630482526f79718.png) * Cron Job 创建基于时间调度的 Jobs。 * CronJob控制器以Job控制器资源为其管控对象,并借助它管理pod资源对象, * CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。 * CronJob可以在特定的时间点(反复的)去运行job任务。 ### 7.2 cronjob 控制器示例 \[root@k8s-master \~\]# vim timinglee-job.yml ![](https://i-blog.csdnimg.cn/direct/838ad588981449e19c6d9ed73f857515.png)\[root@k8s-master \~\]# kubectl apply -f timinglee-job.yml cronjob.batch/timinglee-job created ![](https://i-blog.csdnimg.cn/direct/9cc68c34b9db4c9e8c393d957901846e.png) ![](https://i-blog.csdnimg.cn/direct/a09632113f934e8fad2c5eb59941ffbc.png) ![](https://i-blog.csdnimg.cn/direct/b40cd36e94544af8b65f4c824f73d315.png) ![](https://i-blog.csdnimg.cn/direct/6b64ac7b325a49bebf9f373f16c99838.png)\[root@k8s-master \~\]# kubectl delete -f timinglee-job.yml cronjob.batch "timinglee-job" deleted

相关推荐
lgily-12252 分钟前
Linux机器测试IP及端口连通性方法记录
linux·运维·tcp/ip
搬砖天才、37 分钟前
日常记录-群晖nas的docker注册表被墙,用Mac电脑的docker拉取镜像并安装到nas中
macos·docker·容器
遇见火星43 分钟前
Docker新型容器镜像构建技术,如何正确高效的编写Dockerfile
docker·容器·dockerfile·容器镜像
帝锦_li1 小时前
Docker
运维·docker·容器
_zwy1 小时前
【Linux 进程控制】—— 进程亦生生不息:起于鸿蒙,守若空谷,归于太虚
linux·运维·服务器·c++
杨凯凡1 小时前
Linux目录探秘:文件系统的核心架构
linux·运维·服务器·架构
粉红色回忆2 小时前
使用docker搭建memos
docker·产品
珹洺3 小时前
Java-servlet(完结篇)过滤器乱码解决与监听器
java·运维·服务器·hive·servlet·jsp
等等,要下雨4 小时前
linux安装ollama
linux·运维·服务器
Rverdoser9 小时前
服务器(一种管理计算资源的计算机)
运维·服务器