当前位置: 首页 > news >正文

Kubernetes学习(四)控制器

ReplicaSet

ReplicaSet的目的是维护一组在任何时候都处于运行状态的Pod副本的稳定集合。因此,它通常用来保证给定数量的、完全相同的Pod的可用性。

ReplicaSet的工作原理

ReplicaSet是通过一组字段来定义的,包括一个用来识别可获得的pod的集合的选择符,一个用来标明应该维护的副本个数的数值,一个用来执行应该创建新Pod以满足副本个数条件时要使用的Pod模板等等。每个ReplicaSet都通过根据需要创建和删除Pod以使得副本个数达到期望值,进而实现其存在价值。当ReplicaSet需要创建新的Pod时,会使用所提供的Pod模板。

ReplicaSet通过Pod上的metadata.ownerReferences字段连接到附属Pod,该字段给出当前对象的属主资源。ReplicaSet所获得的Pod都在其ownerReferences字段中包含了属主ReplicaSet的标识信息、正是通过这一连接,ReplicaSet知道它所维护的Pod集合的状态,并据此计划其操作行为。

虽然ReplicaSet可以独立使用,但今天它主要被Deployment用作协调Pod创建、删除和更新的机制。当时用Deployment时,不必担心还要管理它们创建的ReplicaSet。Deployment会拥有并管理它们的ReplicaSet。

示例: replicaSet.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:name: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:name: nginxlabels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80

Deployment

一个Deployment控制器为Pods和ReplicaSets提供声明式的更新能力。

用户负责描述Deployment中的目标状态,Deployment控制器可以更改实际状态,使其变为期望的状态。用户可以定义Deployment以创建新的ReplicaSet,或删除现有的Deployment,并通过新的Deployment适配其资源。

Deployment典型使用场景:

  • 创建Deployment以将ReplicaSet上线。ReplicaSet在后台创建Pods。检查ReplicaSet的上线状态,查看其是否成功;
  • 通过更新Deployment的PodTemplateSpec,声明Pod的新状态,新的ReplicaSet会被创建,Deployment以受控速率将Pod从旧ReplicaSet迁移到新ReplicaSet。每个新的ReplicaSet都会更新Deployment的修订版本
  • 如果Deployment的当前状态不稳定,回滚到较早版本的Deployment,每次回滚都会更新Deployment的修订版本
  • 扩大Deployment规模以承担更多负载
  • 暂定Deployment以应用对PodTemplateSpec所做的多项修改,然后恢复其执行以启动新的上线版本
  • 使用Deployment状态来判定上线过程中是否出现停滞
  • 清理交旧的不再需要的ReplicaSet

创建Deployment

示例:nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxresources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80
[root@master k8s]# kubectl get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-67d4bdd6f5-p48dc   1/1     Running   0          11s
pod/nginx-67d4bdd6f5-rlrdq   1/1     Running   0          11sNAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   6d21hNAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   2/2     2            2           11sNAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-67d4bdd6f5   2         2         2       11s

StatefulSet

StatefulSet是用来管理有状态应用的工作负载API对象。

StatefulSet用来管理Deployment和扩展一组Pod,并且能为这些Pod提供序号和唯一性保证。

和Deployment相同的是,StatefulSet管理了基于相同容器定义的一组Pod。但和Deployment不同的是,StatefulSet为它们每个Pod维护了一个固定的ID。这些Pod是基于相同的声明来创建的,但是不能相互替换:无论怎么调度,每个Pod都有一个不变的ID。

StatefulSet和其他控制器使用相同的工作模式。在StatefulSet对象中定义了期望的状态,然后StatefulSet的控制器就会通过各种更新来达到想要的状态。

StatefulSet可以满足以下一个或多个需求的应用程序:

  • 稳定的、唯一的网络标识符
  • 稳定的、持久的存储
  • 有序的、优雅的部署和缩放
  • 有序的、自动的滚动更新

稳定意味着Pod调度或重调度的整个过程是有持久性的。如果应用程序不需要任何稳定的标识符或有序的部署、删除或伸缩,则应该使用由一组无状态的副本控制器提供的工作负载来部署应用程序,比如Deployment或者ReplicaSet可能更适合无状态应用部署需要。

限制

  • 给定的Pod存储必须由PersistentVolume驱动基于所请求的storage class来提供,或者由理员预先提供。
  • 删除或者收缩StatefulSet并不会删除他关联的存储卷。这样是为了保证数据安全,通常比自动清除StatefulSet所有相关的资源更有价值
  • StatefulSet当前需要headless服务来负责Pod的网络标识,用户需要负责创建此服务

注意:headless使用场景:有时候创建的服务不想走负载均衡,想直接通过pod-id后链接后端,可以使用headless service。headless Service是将service的发布文件中的clusterip设置成none,不让其获取clusterip,DNS解析时直接走Pod。

  • 当删除StatefulSet时,StatefulSet不提供任务终止Pod的保证。为了实现StatefulSet中Pod有序的优雅的终止,可以再删除之前将StatefulSet缩放为0。

示例: stateful.yaml

apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:selector:matchLabels:app: nginx # has to match .spec.template.metadata.labelsserviceName: "nginx"replicas: 3 # by default is 1template:metadata:labels:app: nginx # has to match .spec.selector.matchLabelsspec:terminationGracePeriodSeconds: 10containers:- name: nginximage: nginxports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "my-storage-class"resources:requests:storage: 1Gi
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: my-storage-class
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
# Supported policies: Delete, Retain
reclaimPolicy: Delete

DaemonSet

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

DaemonSet典型用法:

  • 在集群的每个节点上运行存储Daemon,比如glusterd或ceph
  • 在每个节点上运行日志收集Daemon,比如logstash
  • 在每个节点上运行监控Daemon,比如Prometheus Node Exporter

DaemonSet是如何调度的

通过默认调度器调度

DaemonSet确保所有符合条件的节点都运行该Pod的一个副本。通常,运行Pod的节点有Kubernetes调度器选择,不过,DaemonSet Pods由DaemonSet调度器创建和调度。这就带来一下问题:

  • Pod行为的不一致性:正常Pod在被创建后等待调度时处于Pending状态,DaemonSet Pod创建后不会处于Pending状态,这就会给用户带来困惑
  • Pod抢占 由默认调度器处理,启动抢占后,DaemonSet控制器将在不考虑Pod优先级和抢占的情况下执行调度策略

ScheduleDaemonSetPods允许使用默认调度器而不是DaemonSet控制器来调度DaemonSet,方法是将NodeAffinity条件而不是.spec.NodeName条件添加到DaemonSet Pods。默认调度器接下来将Pod绑定到目标主机。如果DaemonSet Pod的节点亲和性配置已存在,则被替换。DaemonSet控制器仅在创建或修改DaemonSet pod时执行这些操作,不会更改DaemonSet的spec.template

此外,系统会自动添加 node.kubernetes.io/unschedulable: NoSchedule容忍度到DaemonSet Pod。在调度DaemonSet Pod时,默认调度器会忽略unSchedule节点

与DaemonSet 通信

与DaemonSet中的Pod进行通信有几种模式:

  • NodeIP和端口:DaemonSet 中的Pod可以使用hostPort,从而可以通过节点IP访问到Pod。客户端能通过某种方法获取节点IP列表,并且基于此也可以获取到相应的端口。
  • DNS:创建具有相同Pod选择器的headless服务通过使用endpoints资源或从DNS中检索到多个A记录来发现DaemonSet
  • Service:创建具有相同Pod选择器的服务,并使用该服务随机访问到某个节点上的守护进程(没有办法访问到特定节点)

更新DaemonSet

如果节点的标签被修改,DaemonSet将立刻像新匹配上的节点添加Pod,同时删除不匹配的节点上的Pod。

可以修改DaemonSet创建的Pod。不过并非Pod的所有字段都可以更新。下次当某节点(即使具有相同的名称)被创建时,DaemonSet控制器还会使用最初的模板。

可以删除一个DaemonSet。如果使用kubectl并指定 --cascade=false选项,则Pod将被保留在节点上。接下来如果创建使用相同选择器的新DaemonSet,新的DaemonSet会收养已有的Pod。如果有Pod需要被替换,DaemonSet会根据其updateStrategy来替换。

DaemonSet的替代方案

init脚本

直接在节点上启动守护进程(例如使用init、upstartd、systemd)的做法当然是可行的,不过,基于DaemonSet来运行这些进程有如下好处:

  • 像所有运行的其他应用一样,DaemonSet具备为守护进程提供监控和日志管理的能力
  • 为守护进程和应用所使用的配置语言和工具是相同的
  • 在资源受限的容器中运行守护进程能够增加守护进程和应用容器的隔离性。然而,这一点也可以通过在容器中运行守护进程但却不在Pod中运行来实现。例如,基于docker启动

和Deployment区别

DaemonSet与Deployment非常类似,他们都能创建Pod,并且Pod中的进程都不希望被终止(例如web服务器、存储服务器)。建议为无状态的服务使用Deployment,比如前端服务。对这些服务而言,对副本数量进行扩缩容、平滑升级,比精确控制Pod运行在某个主机上要重要的多。当需要Pod副本总是运行在全部或特定主机上,并需要他们优先于其他Pod启动时,应该使用DaemonSet。

Job

Job会创建一个或者多个Pod,并确保指定数量的Pod成功终止,随着Pod成功结束,Job跟踪记录成功完成的Pod个数。当数量达到指定的成功个数阈值时,job结束。删除Job的操作会清楚所创建的全部pod。

一个简单的使用场景下,会创建一个Job对象以便以一种可靠的方式运行某Pod直到完成。当第一个Pod失败或者被删除(比如某些节点硬件失效或重启)时,Job对象会启动一个新的Pod。

也可以使用Job以并行方式运行多个Pod。

示例: job.yaml

apiVersion: batch/v1
kind: Job
metadata:name: myjob
spec:ttlSecondsAfterFinished: 100backoffLimit: 4template:spec:containers:- name: piimage: perlcommand: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]restartPolicy: Never
[root@master k8s]# kubectl get all
NAME              READY   STATUS      RESTARTS   AGE
pod/myjob-hx445   0/1     Completed   0          4sNAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   6d23hNAME              COMPLETIONS   DURATION   AGE
job.batch/myjob   1/1           4s         4s
[root@master k8s]# kubectl logs myjob-hx445
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
[root@master k8s]#

相关文章:

Kubernetes学习(四)控制器

ReplicaSet ReplicaSet的目的是维护一组在任何时候都处于运行状态的Pod副本的稳定集合。因此&#xff0c;它通常用来保证给定数量的、完全相同的Pod的可用性。 ReplicaSet的工作原理 ReplicaSet是通过一组字段来定义的&#xff0c;包括一个用来识别可获得的pod的集合的选择符…...

vue组件间通信的几个方法

一&#xff0c;props属性传递数据 适用场景&#xff1a;父组件传递数据给子组件 子组件设置props属性&#xff0c;定义接收父组件传递过来的参数 父组件在使用子组件标签中通过字面量来传递值 Children.vue props:{ // 字符串形式 name:String // 接收的类型参数 // 对象…...

商品价格区间设置与排序--课后程序(Python程序开发案例教程-黑马程序员编著-第4章-课后作业)

实例2&#xff1a;商品价格区间设置与排序 在网上购物时&#xff0c;面对琳琅满目的商品&#xff0c;我们应该如何快速选择适合自己的商品呢&#xff1f;为了能够让用户快速地定位到适合自己的商品&#xff0c;每个电商购物平台都提供价格排序与设置价格区间功能。假设现在某平…...

mybatis中sqlSession的使用

文章目录sqlsession的使用依赖jdbc.propertiesmysql-config.xml配置逆向工程创建sqlSessionsqlsession的使用 在最开始我们使用jdbcUtil的方式进行硬编码&#xff0c;sql字符串写的很难受&#xff0c;使用mybatis可以解决这个问题&#xff0c;它提供了数据库与实体类的关系映射…...

TPOT(Tree-based Pipeline Optimization Tool) API简介

文章目录TPOT简介TPOT APIClassification接口形式&#xff1a;Parameters&#xff1a;Attributes:Functions&#xff1a;Regression接口形式Parameters:&#xff08;只列与分类任务有差异的参数&#xff09;TPOT简介 TPOT是一个Python自动机器学习&#xff08;AML&#xff09;…...

Java 19和IntelliJ IDEA,如何和谐共生?

Java仍然是目前比较流行的编程语言&#xff0c;它更短的发布节奏让开发者每六个月左右就可以试用新的语言或平台功能&#xff0c;IntelliJ IDEA帮助我们更流畅地发现和使用这些新功能。IntelliJ IDEA v2022.3正式版下载(Q技术交流&#xff1a;786598704&#xff09;在本文中&am…...

js循环判断的方法

js循环判断的方法if语句if else语句if else if else if......三元表达式switchswitch语句和if语句的区别for循环while循环do while循环for inforEachfor of性能问题if语句 条件满足就执行&#xff0c;不满足就不执行 if(条件){语句}if else语句 条件满足&#xff0c;执行语句…...

git快速入门(1)

1 git的下载与安装1&#xff09;下载git安装包下载路径&#xff1a;https://git-scm.com/我的操作系统是window&#xff0c;64位的&#xff0c;我下载的Git-2.33.0-64-bit.exe&#xff0c;从官网下载或者从网址下载链接&#xff1a;链接地址&#xff1a;https://pan.baidu.com/…...

韩国绿芯1~16通道触摸芯片型号推荐

随着技术的发展&#xff0c;触摸感应技术正日益受到更多关注和应用&#xff0c;目前实现触摸感应的方式主要有两种&#xff0c;一种是电阻式&#xff0c;另一种是电容式。电容式触摸具有感应灵敏、功耗低、寿命长等特点&#xff0c;因此逐步取代电阻式触摸&#xff0c;成为当前…...

Go语言设计与实现 -- http服务器编程

Go http服务器编程 初始 http 是典型的 C/S 架构&#xff0c;客户端向服务端发送请求&#xff08;request&#xff09;&#xff0c;服务端做出应答&#xff08;response&#xff09;。 golang 的标准库 net/http 提供了 http 编程有关的接口&#xff0c;封装了内部TCP连接和…...

MySQL-视图

视图是什么&#xff1f; 一张虚表&#xff0c;和真实的表一样。视图包含一系列带有名称的行和列数据。视图是从一个或多个表中导出来的&#xff0c;我们可以通过insert&#xff0c;update&#xff0c;delete来操作视图。当通过视图看到的数据被修改时&#xff0c;相应的原表的数…...

都工作3年了,怎么能不懂双亲委派呢?(带你手把手断点源码)

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…...

Hive 运行环境搭建

文章目录Hive 运行环境搭建一、Hive 安装部署1、安装hive2、MySQL 安装3、Hive 元数据配置到 Mysql1) 拷贝驱动2) 配置Metastore 到 MySQL3) 再次启动Hive4) 使用元数据服务的方式访问Hive二、使用Dbaver连接HiveHive 运行环境搭建 HIve 下载地址&#xff1a;http://archive.a…...

SAP ABAP 深度解析Smartform打印特殊符号等功能

ABAP 开发人员可以在 Smartform 输出上显示 SAP 图标或 SAP 符号。例如,需要在 SAP Smart Forms 文档上显示复选框形状的输出。SAP Smartform 文档上可以轻松显示空复选框、标记复选框以及 SAP 图标等特殊符号。 在 SAP Smartform 文档中添加一个新的文本节点。 1. 单击“更…...

React17+React Hook+TS4 最佳实践仿 Jira 企业级项目笔记

前言 个人笔记,记录个人过程,如有不对,敬请指出React17React HookTS4 最佳实践仿 Jira 企业级项目项目完成到第十章,剩下后面就没有看了,说的不是特别好 github地址:https://github.com/superBiuBiuMan/React-jira husky方便我们管理git hooks的工具 REST-API风格 https://zh…...

35- tensorboard的使用 (PyTorch系列) (深度学习)

知识要点 FashionMNIST数据集: 十种产品的分类. # T-shirt/top, Trouser, Pullover, Dress, Coat,Sandal, Shirt, Sneaker, Bag, Ankle Boot.writer SummaryWriter(run/fashion_mnist_experiment_1) # 网站显示一 tensorboard的使用 在网站显示pytorch的架构:1.1 …...

ChatGPT在工业领域的用法

在工业数字化时代&#xff0c;我们需要怎么样的ChatGPT&#xff1f; 近日&#xff0c;ChatGPT热度高居不下&#xff0c;强大的人机交互能力令人咋舌&#xff0c;在国内更是掀起一股讨论热潮。一时间&#xff0c;这场由ChatGPT引起的科技飓风&#xff0c;使得全球最顶尖科技力量…...

使用Chakra-UI封装简书的登录页面组件(React)

要求&#xff1a;使用chakra ui和react 框架将简书的登录页面的表单封装成独立的可重用的组件使用到的API&#xff1a;注册API请求方式&#xff1a;POST 请求地址&#xff1a;https://conduit.productionready.io/api/users请求数据: {"user":{ "username&quo…...

Three.js初试——基础概念(二)

前言 姊妹篇&#xff1a;Three.js初试——基础概念 介绍了 Three.js 的一些核心要素概念&#xff0c;这篇文章会讲一下它的关键要素概念。 之前我们了解到展示一个3D图像&#xff0c;必须要有场景、相机、渲染器这些核心要素&#xff0c;仅仅这些还不够&#xff0c;我们还需要…...

Qt音视频开发21-mpv内核万能属性机制

一、前言 搞过vlc内核后又顺带搞了搞mpv内核&#xff0c;mpv相比vlc&#xff0c;在文件数量、sdk开发便捷性方面绝对占优势的&#xff0c;单文件&#xff08;可能是静态编译&#xff09;&#xff0c;不像vlc带了一堆插件&#xff0c;通过各种属性来set和get值&#xff0c;后面…...

阿里开源Z-Image镜像体验:ComfyUI可视化生成汉服美女实战

阿里开源Z-Image镜像体验&#xff1a;ComfyUI可视化生成汉服美女实战 1. 开篇&#xff1a;当汉服遇见AI绘画 想象一下&#xff0c;你只需要输入"一位穿着汉服的中国女性站在樱花树下"&#xff0c;AI就能在几秒钟内生成一张细节精致的写实风格图像。这不再是科幻场景…...

Ubuntu系统资源监控实战:从命令行到图形化工具全解析

1. 为什么需要监控Ubuntu系统资源&#xff1f; 刚装好的Ubuntu系统跑得飞快&#xff0c;用着用着突然发现电脑变卡了&#xff1f;浏览器开多几个标签页就开始转圈&#xff1f;这种情况我遇到过太多次了。后来才发现&#xff0c;很多时候是因为某个程序偷偷吃掉了大量CPU或内存资…...

2026年实测10款降AI工具:毕业论文降AIGC哪款最靠谱?

2026年毕业季临近&#xff0c;降低论文AI生成痕迹、通过学校AIGC检测已经成为所有毕业生的必过关卡。但当前降AI工具市场鱼龙混杂&#xff1a;不少用户花了高价处理&#xff0c;AI率却纹丝不动&#xff1b;还有的工具改完的论文语句生硬、逻辑混乱&#xff0c;反而过不了答辩。…...

嘉立创PCB打样被加价到170元?手把手教你用STM32H743飞控板案例解决‘拆单嫌疑’

STM32H743飞控板PCB打样避坑指南&#xff1a;如何巧妙应对嘉立创拆单判定 最近不少硬件开发者在使用嘉立创进行STM32H743飞控板PCB打样时&#xff0c;遇到了一个令人头疼的问题——原本33元的4层板打样价格突然飙升到170多元。这种情况往往是由于平台算法误判设计文件存在"…...

TPAMI 2026 | 跨十大数据集验证,PoundNet重新审视AI图像检测范式

随着 AI 生成图像技术快速演进&#xff0c;伪造内容在网络传播风险持续上升&#xff0c;高鲁棒性检测技术因此成为学界与产业界关注的关键问题。然而&#xff0c;现有不少方法过于追求单一数据集上的短期收益&#xff0c;往往仅围绕“真/假”二分类目标对大规模预训练模型进行专…...

Visio高效绘制神经网络卷积层:从基础到三维呈现

1. Visio绘制神经网络卷积层的入门指南 第一次用Visio画神经网络结构时&#xff0c;我盯着满屏的工具栏发懵——这玩意儿比Photoshop的图层还复杂。但摸索半天后发现&#xff0c;只要掌握几个核心功能&#xff0c;画卷积层其实比用PPT简单十倍。先说说最基础的形状选择&#xf…...

[Windows 驱动] 深入解析进程名获取的多种内核方法

1. Windows驱动开发中的进程名获取基础 在Windows内核驱动开发中&#xff0c;获取进程名是最基础但至关重要的操作之一。想象一下&#xff0c;你正在开发一个安全监控驱动&#xff0c;需要实时检查哪些进程正在运行&#xff1b;或者你在开发一个性能优化工具&#xff0c;需要针…...

springboot+vue基于web的药店管理系统 药品商城在线购药系统

目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析技术实现要点扩展功能建议项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块分析 后台管理系统&#xff08;SpringBoot&…...

怎样避免网站因 SEO 优化而被搜索引擎惩罚

<h2>怎样避免网站因 SEO 优化而被搜索引擎惩罚</h2> <p>在当今数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了任何网站想要获得流量和提升知名度的关键因素。SEO 优化的过程并不是一帆风顺&#xff0c;特别是在过度优化时&#x…...

UE5伤害系统避坑指南:Damage Type没用好?你的Apply Damage可能白写了

UE5伤害系统深度解析&#xff1a;如何用Damage Type构建高扩展性战斗机制 在虚幻引擎5的游戏开发中&#xff0c;伤害系统是战斗机制的核心支柱。许多开发者习惯性地将注意力集中在Damage Amount这个数值上&#xff0c;却忽视了Damage Type这个能够赋予游戏深度和多样性的强大工…...