K8s 之控制器的定义及详细调用案例

news2024/11/15 8:17:06

什么是控制器

官方文档:

https://v1-30.docs.kubernetes.io/zh-cn/docs/concepts/workloads/controllers/

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

  • 自主式pod:pod退出或意外关闭后不会被重新创建
  • 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目

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

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

控制器常用类型

控制器名称控制器用途
Replication Controller比较原始的pod控制器,已经被废弃,由ReplicaSet替代
ReplicaSetReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行
Deployment一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力
DaemonSetDaemonSet 确保全指定节点上运行一个 Pod 的副本
StatefulSetStatefulSet 是用来管理有状态应用的工作负载 API 对象
Job执行批次处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束
CronJobCron Job 创建基于时间调度的 Jobs
HPA全称Horizontal Pod Autoscaler根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放

replicaset 控制器

replicaset 功能

  • ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet
  • ReplicaSet和Replication Controller的唯一区别是选择器的支持,ReplicaSet支持新的基于集合的选择器需求
  • ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行
  • 虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制

replicaset 参数说明

参数名称字段类型参数说明
specObject详细定义对象,固定值就写Spec
spec.replicasinteger指定维护pod数量
spec.selectorObjectSelector是对pod的标签查询,与pod数量匹配
spec.selector.matchLabelsstring指定Selector查询标签的名称和值,以key:value方式指定
spec.templateObject指定对pod的描述信息,比如lab标签,运行容器的信息等
spec.template.metadataObject指定pod属性
spec.template.metadata.labelsstring指定pod标签
spec.template.specObject详细定义对象
spec.template.spec.containerslistSpec对象的容器列表定义
spec.template.spec.containers.namestring指定容器名称
spec.template.spec.containers.imagestring指定容器镜像

replicaset 示例

1、生成yml文件

[root@k8s-master ~]# kubectl create deployment replicaset --image myapp:v1 --dry-run=client -o yaml > replicaset.yml

2、编辑yml文件内容

[root@k8s-master ~]# vim replicaset.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset	#指定pod名称,一定小写,如果出现大写报错
spec:
  replicas: 2		#指定维护pod数量为2
  selector:			#指定检测匹配方式
    matchLabels:	#指定匹配方式为匹配标签
      app: repli	#指定匹配的标签为app=repli
  template:			#模板,当副本数量不足时,会根据下面的模板创建pod副本
    metadata:
      labels:
        app: repli
    spec:
      containers:
      - image: myapp:v1
        name: myapp

[root@k8s-master ~]# kubectl apply -f replicaset.yml
replicaset.apps/replicaset created

3、查看其pod的标签详情

[root@k8s-master ~]# kubectl get pods --show-labels

在这里插入图片描述

4、修改其标签,查看其pod内容器运行详情

[root@k8s-master ~]# kubectl label pod replicaset-lw2m5 app=lll --overwrite

在这里插入图片描述

5、修改标签,查看其pod内容器运行详情

[root@k8s-master ~]# kubectl label pod replicaset-lw2m5 app=repli --overwrite

在这里插入图片描述

6、回收资源

[root@k8s2 pod]# kubectl delete -f replicaset.yml

deployment 控制器

deployment 控制器的功能

  • 为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。
  • Deployment控制器并不直接管理pod,而是通过管理ReplicaSet来间接管理Pod
  • Deployment管理ReplicaSet,ReplicaSet管理Pod
  • Deployment 为 Pod 和 ReplicaSet 提供了一个声明式的定义方法
  • 在Deployment中ReplicaSet相当于一个版本

典型的应用场景:

  • 用来创建Pod和ReplicaSet
  • 滚动更新和回滚
  • 扩容和缩容
  • 暂停与恢复

deployment 控制器示例

1、生成yml文件

[root@k8s-master ~]# kubectl create deployment deployment --image myapp:v1  --dry-run=client -o yaml > deployment.yml

2、编辑yml文件内容

[root@k8s-master ~]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v1
        name: myapp

root@k8s-master ~]# kubectl apply -f deployment.yml
deployment.apps/deployment created

效果演示:

[root@k8s-master yaml]# kubectl get pods

在这里插入图片描述

版本迭代

1、查看现版本

[root@k8s-master yaml]# kubectl get pods -o wide
#查看pod的详细信息

[root@k8s-master yaml]# curl 10.244.2.20
#访问pod内的容器

[root@k8s-master yaml]# kubectl describe deployments.apps deployment
#查看控制器的详细信息

在这里插入图片描述

在这里插入图片描述

2、更新版本

[root@k8s-master ~]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp

  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v2		#更新为版本2
        name: myapp


[root@k8s-master yaml]# kubectl apply -f deployment.yml

[root@k8s-master yaml]# kubectl get pods -o wide
[root@k8s-master yaml]# curl 10.244.2.20
#访问pod内的容器

[root@k8s-master yaml]# kubectl describe deployments.apps deployment
#查看控制器的详细信息

在这里插入图片描述

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

版本回滚

1、编辑yml文件内容

[root@k8s-master ~]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp

  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v1		#回滚到之前版本
        name: myapp


[root@k8s-master ~]# kubectl apply -f deployment.yml
deployment.apps/deployment configured

效果演示:

[root@k8s-master yaml]# curl 10.244.1.16

在这里插入图片描述

版本回滚的过程:

在这里插入图片描述

滚动更新策略

[root@k8s-master ~]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  minReadySeconds: 5	#最小就绪时间,指定pod每隔多久更新一次
  replicas: 4
  strategy:				#指定更新策略
    rollingUpdate:
      maxSurge: 1		#比定义pod数量多几个,即每次更新1个
      maxUnavailable: 0	#比定义pod个数少几个,即4个pod都能用
  selector:
    matchLabels:
      app: deployment
  template:
    metadata:
      labels:
        app: deployment
    spec:
      containers:
      - image: myapp:v1
        name: myapp
        

[root@k8s2 pod]# kubectl apply -f deployment.yaml

暂停及恢复

1、在实际生产环境中我们做的变更可能不止一处,当修改了一处后,如果直接执行,那么变更就直接触发了

2、我们期望的是当把所有修改都完成后,一次触发完成所有的修改

3、所有这时我们就需要进行暂停,避免触发不必要的线上更新

1、编辑yml文件内容

[root@k8s2 pod]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  minReadySeconds: 5
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  replicas: 6	#将原本4个pod数量更改为6个		
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v2	#将版本更新为v2
        name: myapp
        resources:
          limits:
            cpu: 0.5
            memory: 200Mi
          requests:
            cpu: 0.5
            memory: 200Mi

2、进行资源更新的暂停

[root@k8s2 pod]# kubectl rollout pause deployment deployment
deployment.apps/deployment paused

#将控制器下的deployment控制器更新暂停

在这里插入图片描述

3、利用控制器生成资源

[root@k8s2 pod]# kubectl apply -f deployment.yaml

4、查看新生成的资源信息

[root@k8s2 pod]# kubectl rollout history deployment deployment

在这里插入图片描述

在这里插入图片描述

5、恢复后开始触发更新

[root@k8s2 pod]# kubectl rollout resume deployment deployment
deployment.apps/deployment resumed

6、查看资源信息

[root@k8s-master yaml]# kubectl rollout history deployment deployment

在这里插入图片描述

在这里插入图片描述

7、回收资源

[root@k8s-master yaml]# kubectl delete deployments.apps deployment

daemonset 控制器

daemonset 功能

DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod ,当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod

DaemonSet 的典型用法

  • 在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。
  • 在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。
  • 在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等
  • 一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用
  • 一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求

daemonset 示例

1、查看设备是否存在污点

[root@k8s-master yaml]# kubectl describe nodes k8s-master

在这里插入图片描述

2、利用没有容忍污点的控制器创建pod

[root@k8s-master yaml]# kubectl apply -f daemonset.yml 

在这里插入图片描述

3、利用容忍污点的控制器创建podls

[root@k8s2 pod]# cat daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset
spec:
  selector:
    matchLabels:
      app: daemonset
  template:
    metadata:
      labels:
        app: daemonset
    spec:
      tolerations:		#对于污点节点的容忍
      - effect: NoSchedule
        operator: Exists
      containers:
      - name: nginx
        image: nginx
        
[root@k8s-master yaml]# kubectl apply -f daemonset.yml 

在这里插入图片描述

job 控制器

job控制器功能

Job,主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务

job特点如下

当Job创建的pod执行成功结束时,Job将记录成功结束的pod数量

当成功结束的pod达到指定的数量时,Job将完成执行

关于重启策略设置的说明

1、如果指定为OnFailure,则job会在pod出现故障时重启容器,而不是创建pod,failed次数不变

2、如果指定为Never,则job会在pod出现故障时创建新的pod,并且故障pod不会消失,也不会重启,failed次数加1

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

job 控制器示例:

1、生成 job 控制器的yaml文件

[root@k8s-master images]# kubectl create job --image perl:5.34.0 perl --dry-run=client -o yaml > job.yml

2、编辑有yml文件内容

[root@k8s2 pod]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: job
spec:
  completions: 4	#一共完成任务数为6		
  parallelism: 1	#每次并行完成1个
  backoffLimit: 4	#失败后尝试运行4次,如果都失败则任务结束
  template:
    spec:
      containers:
      - image: perl:5.34.0
        name: perl
        command: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"]	计算小数点的后2000位
      restartPolicy: Never	#关闭后不自动重启

[root@k8s-master yaml]# kubectl apply -f job.yml

效果演示:

[root@k8s-master yaml]# kubectl get all

在这里插入图片描述

在这里插入图片描述

cronjob 控制器

cronjob 控制器功能

  • Cron Job 创建基于时间调度的 Jobs

  • CronJob控制器以Job控制器资源为其管控对象,并借助它管理pod资源对象

  • CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式

  • CronJob可以在特定的时间点(反复的)去运行job任务

cronjob 控制器示例

[root@k8s2 pod]# vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob
spec:
  schedule: "* * * * *"	#每一分钟执行一次
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - image: myapp:v1
            name: myapp
            command: ["/bin/sh","-c","date;echo hello"]
          restartPolicy: Never	#在执行一次后不会自动重启


[root@k8s2 pod]# kubectl apply -f cronjob.yml

效果演示:

[root@k8s-master yaml]# kubectl get pods

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2139092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《深度学习》PyTorch 手写数字识别 案例解析及实现 <下>

目录 一、回顾神经网络框架 1、单层神经网络 2、多层神经网络 二、手写数字识别 1、续接上节课代码,如下所示 2、建立神经网络模型 输出结果: 3、设置训练集 4、设置测试集 5、创建损失函数、优化器 参数解析: 1)para…

Cesium 计算3d凸包(ConvexHull)

Cesium 计算3d凸包(ConvexHull) Cesium 计算3d凸包(ConvexHull)

Unity实战案例全解析:PVZ 植物放置分析

前篇:Unity实战案例全解析:PVZ 植物卡片状态分析-CSDN博客 植物应该如何从卡牌状态转为实物? 其实就只需要考虑两个步骤加一个后续处理: 1.点击卡牌后就实例化 需要一个植物状态枚举,因为卡牌分为拿在手上和种植下…

Android 10.0 mtk平板camera2横屏预览旋转90度横屏保存圆形预览缩略图旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,点击录像和照片下保存的圆形预览缩略图 依然是竖屏的,所以说同样需要…

需求导向的正则表达式

目录 re.sub 需求:把 1. 2.这些序号转成(1) (2) 需求:反过来,把(1)->1. ,(2)》2. 。 需求:把出现的 1 2 3都转成下标 进阶1!只想让化学符…

Redis入门2

在java中操作Redis Redis的Java客户端 Redis 的 Java 客户端很多,常用的几种: Jedis Lettuce Spring Data Redis Spring Data Redis 是 Spring 的一部分,对 Redis 底层开发包进行了高度封装。 在 Spring 项目中,可以使用Spring Data R…

把项目部署到Linux系统上(如何在阿里云服务器上安装和配置SpringBoot+vue全栈开发环境)

项目部署上线 环境准备下载安装Linux系统和ssh连接工具背景知识安装虚拟机安装Linux系统选择installCentOS7按命令IP addr查看服务器IP地址,ens33网卡中会出现IP地址配置好后就可以查看了一个可远程连接Linux服务器的工具1.(基于finalshell工具&#xff…

小明震惊OpenAI 的新模型 01

在硅谷的中心,繁忙的咖啡馆和创业中心周围,年轻的软件工程师小明坐在他的办公桌前,面露困惑。科技界一直在盛传一项新的AI突破,但他持怀疑态度,不敢抱太大希望。他认为AI泡沫即将破灭,炒作列车即将出轨&…

网络原理 IP协议与以太网协议

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 目录 1.网络层 IP协议 1.IP协议格式 2.地址管理 2.1 IP地址 2.2 解决IP地址不够用的问题 2.3NAT网络地址转换 2.4网段划分 3.路由选择…

北极星计划的回响:从Leap Motion到Midjourney的AI 3D硬件梦想

在科技的浩瀚星空中,总有一些梦想如同北极星般璀璨,指引着探索者前行。六年前,Leap Motion的CEO David以一篇充满激情的博客文章,向我们揭示了“北极星计划”——一个旨在打破数字与物理界限,创造流畅统一体验的增强现实平台。今天,随着Midjourney在AI文生图领域的全球爆…

2024.9.15周报

一、题目信息 题目:Physics-informed neural networks for solving flow problems modeled by the 2D Shallow Water Equations without labeled data 链接:物理信息神经网络用于解决由二维浅水方程建模的流动问题,无需标记数据- ScienceDi…

【Node.js】初识 RabbitMQ

概述 MQ 顾名思义,是消息队列。 RabbitMQ 是一个消息队列系统,用于实现异步通信。基于 AMQP。AMQP(高级消息队列协议) 实现了对于消息的排序,点对点通讯,和发布订阅,保持可靠性、保证安全性。 在 Node.js 的微服务架…

LAMP+WordPress

一、简介 LAMP: L:linux——操作系统,提供服务器运行的基础环境。A:apache(httpd)——网页服务器软件,负责处理HTTP请求和提供网页内容。M:mysql,mariadb——数据库管理…

PCL 窗口可视化两个点云

目录 一、概述 1.1原理 1.2实现步骤 1.3 应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述 本文将介绍如何使用PCL库…

8.4Prewitt算子边缘检测

基本原理 Prewitt算子是一种用于边缘检测的经典算子,它通过计算图像中像素值的(一阶导数)梯度来检测边缘。Prewitt算子通常包括两个3x3的卷积核,一个用于检测水平方向上的边缘,另一个用于检测垂直方向上的边缘。 示例…

【动漫资源管理系统】Java SpringBoot助力,搭建一个高清动漫在线观看网站

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

【插件】【干货】用EPPlus在Unity中读写Excel表

EPPlus是什么我就不说了,你都点进来了肯定知道 几个常用的api 1.index下标都是从1开始的 2.可以读取任意单元格上的任意内容,不需要给excel表写规则 但是如果你写了规则,就需要自己用额外的代码 --- 数据结构去实现 3.打开excel表 ExcelP…

[数据集][目标检测]智慧交通铁路异物入侵检测数据集VOC+YOLO格式802张7类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):802 标注数量(xml文件个数):802 标注数量(txt文件个数):802 标注类别…

萤石举办2024清洁机器人新品发布会 多维智能再造行业标杆

导言:作为智慧生活守护者,萤石今日发布了两款清洁机器人,AI扫拖机器人RS20 Pro Ultra 和AI洗地机器人RX30 Max ,标志着萤石在智能清洁领域的全新突破。RS20 Pro Ultra基于CutFree 2.0内切割滚刷专利,有效解决毛发缠绕难…

速通GPT:《Improving Language Understanding by Generative Pre-Training》全文解读

文章目录 速通GPT系列几个重要概念1、微调的具体做法2、任务感知输入变换3、判别式训练模型 Abstract概括分析和观点1. 自然语言理解中的数据问题2. 生成预训练和监督微调的结合3. 任务感知输入变换4. 模型的强大性能 Introduction概括分析和观点1. 自然语言理解的挑战在于对标…