写到这里,k8s的内容已经到一半了,虽然后面的内容我觉得更加玄学一点。控制器真的是个神奇的东西,虽然后面的CRD会带着大家一起做一个控制器,但是还是觉得很奇妙。

控制器大概就是k8s中的精华了,通过控制器去监听k8s中api的请求,然后创建对应的资源。这个资源可以是应用业务的pod,也可以是用来管理集群的pod(如calico用来做网络)。

如果能够理解控制器和service服务,那么k8s中的很大部分东西都能够理清楚了。当然,还有其他的重要内容,如存储卷、资源、pod调度、升级备份以及自定义资源等等。


这一部分主要来讲一讲pod中的探针,探针是给容器做健康检查的,主要分为三种类型,存活探针、就绪探针和启动探针。这三种探针的功能作用不同,并且经常结合起来使用。每个探针的定义都是在容器中创建,如spec.containers.livenessprobe。

存活探针

首先来介绍一下spec.restartPolicy字段,用来控制pod内的容器的重启策略,是应用于所有的容器。如果是Always则是总是重启,如果是onFailure则是在失败的时候重启,如果是Never则永远不会重启。

如果重启次数过多,超过限制时,可能会导致pod的重建。

livenessProbes用来检测容器是否正常运行,可以使用exec来执行对应的命令或者使用httpGet来验证。如果容器非正常运行,则会杀死然后根据重启策略来决定是否重启容器。

可以定义探针在容器启动后多少秒开始探测,然后定义探测周期。

就绪探针

同样需要定义等待多少秒开始探测,然后定义探测周期。并且同样可以用httpGet或者tcpGet来探测容器是否就绪,如果探测失败,则会将该pod从service中的endpoints列表中(记录当前可路由的pod地址)。

不过注意的是存活探针会杀死容器,但是就绪探针不会,仅仅是控制流量路由,不影响容器的生命周期。并且会不断检测,当容器就绪的时候会重新添加到endpoints列表中。

启动探针

由于有些容器初始化的时间可能比较长,仅仅使用就绪探针或者存活探针的延迟等待可能不够,所以由启动探针来等待容器初始化。

启动探针仅仅执行一次而不是周期性的,如果检测失败则会杀死容器并根据restartPolicy来决定是否重启。

优雅关闭

其实就是使用spec.terminationGracePeriodsSeconds来指定秒数,在pod要销毁的时候等待容器结束。如果超过这个时间容器还没有结束依旧会强制让容器下线的。


以上就是健康检测的全部内容,当然有些细节没说,比如具体是什么字段来约束。但是比较长就没写了。接下来打算继续写k8s中的配置存储卷,主要是emptyDir、hostPath、persistentVolume这三种,最后一个需要结合PVC来使用。

emptyDir

这个比较简单,主要是通过spec.volumes.emptyDir字段指示,可以指定大小(limitSize)。当然,实质其实是使用node节点上的临时目录作为存储卷的。

但是由于pod分配在哪个节点是不确定的,所以emptyDir的位置还需要具体分析。不过emptyDir不能够跨pod共享,即使在同一个节点上,因为临时目录在node上的位置也是不确定的。

hostPath

这个需要指定主机上的目录,并挂载到容器的挂载点上。同节点上的pod能够共享该目录,但是不能跨节点共享。

和临时目录不同的是,当pod删除时,hostPath上的文件目录不会自动删除。

由于不能跨节点共享的缺陷,而且pod的调度还是不确定的(除非配置好亲和性和容忍度),所以有更好的解决方案。

persistentVolume

这个属于一种资源,需要通过yml文件定义并创建。示例通过配置NFS共享存储卷,实现跨节点的共享,突破hostPath只能在节点内共享的限制。

由于使用了nfs,需要给每个节点安装nfs-common客户端才行,并且在共享目录的主机上(可以不是master,通过spec.nfs.server指定)安装nfs-server。

在共享主机上配置好/etc/exportfs文件,然后就可以编写定义persistentVolume的yml文件。但是pod如果要使用PV,还需要创建PVC,也就是持久卷申领。

persistentVolumeClaim

这也是k8s中的一种资源,需要在yml文件中使用标签选择器来关联PV。并且PVC的卷模式(filesystem和block)和访问模式(RWO)需要和PV保持一致。

要注意的是,不同的PV的访问模式,对于PV本身的使用有着很大的区别!ReadWriteOnce (RWO)​模式:卷可被​单个节点​以读写模式挂载;ReadOnlyMany (ROX)​模式:卷可被​多个节点​以只读模式挂载;ReadWriteMany (RWX)​模式:卷可被​​多个节点​以读写模式挂载。

当 PV 的访问模式为 ​​ReadWriteMany (RWX) 或 ReadOnlyMany (ROX)​​ 时,可以手动配置多个 PVC 指向同一个 PV。但需要确保PVC 的 storage 请求总量 ≤ PV 的容量,并且PV 必须是 Retain 回收策略。

不能使用Delete回收策略, 因为该策略删除 PVC 时 PV 会被自动删除,无法重复使用。Recycle 策略会在 PVC 删除时​​自动清空 PV 内的所有数据​​(执行 rm -rf),若多个 PVC 共享该 PV,删除任意一个 PVC 会导致其他 PVC 的数据突然丢失。


最后打算继续写一些k8s中的pod调度,主要包括亲和性、污点、容忍度等内容。这其实是三个章节的内容,但是不多所以我放在了一块。不过这个k8s系列已经写到5了,预计能够在10之前写完!

NodeSelector与NodeName

nodeSelector根据节点的标签进行选择,通过spec.nodeSelector.name来指明选择的节点标签。nodeName将pod仅调度到具有特定名称的节点上,通过spec.nodeName.name字段表明。不过这两种方式也受到污点的影响,即使通过标签或名称选择,如果不能容忍污点,也无法调度。

节点亲和性Affinity

不同于上面的强制选择,节点亲和性是pod的一种属性,它使pod能够被吸引到特定的节点上。上面提到的污点作用正相反,会排斥不能容忍该污点的pod。

节点亲和性有两种模式,一种是优先但不强制,使用spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution字段表示该模式,可以设置权重,以及具有哪些特征的节点优先。还有一种强制优先调度,使用spec.affinity.nodeAffinity.requriedDuringSchedulingIgnoredDuringExecution字段表示。

污点和容忍度

可以通过kubectl taint node <节点名> key=value:effect来标记污点,使用kubectl taint node <节点名> key=value:effect-来取消污点。effect有`NoSchedule`,`PreferNoSchedule`和`NoExecute`三种。

`NoSchedule`:新 Pod 不会被调度到该节点,已运行的 Pod 不受影响;`PreferNoSchedule`:尽量不调度,但若无其他可用节点仍可能调度。`NoExecute`:新 Pod 不调度,且​已运行的 Pod 也会被驱逐,在`tolerationSeconds`指定的时间后被驱逐。若未设置  `tolerationSeconds`,则默认容忍 300 秒。

容忍度则应用于pod,允许调度器调度pod到能够容忍对应污点的节点上。使用spec.tolerations字段添加规则,不过即使容忍了该污点,也未必会被调度该节点上。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++复习2

C继承 继承的概念 继承&#xff08;inheritance&#xff09;机制是面向对象程序设计使代码可以复用的重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称为派生类。 继承呈现了面向对象程序设计…

ZKmall模块商城的跨境电商支付安全方案:加密与权限的双重防护

跨境电商支付环节面临双重挑战&#xff1a;一方面&#xff0c;不同国家的支付协议、货币结算规则差异显著&#xff0c;需满足多币种、多渠道的支付需求&#xff1b;另一方面&#xff0c;跨境数据传输的安全性与操作权限的严格管控直接关系到资金安全与合规性。ZKmall 模块商城针…

【数据结构】-5- 顺序表 (下)

一、集合框架 这是 Java 集合框架&#xff08;Java Collections Framework&#xff09;的核心继承关系树状图1. 最顶层&#xff1a;Iterable&#xff08;接口&#xff09;作用&#xff1a;所有 “可迭代” 的集合&#xff08;如 List、Set、Queue&#xff09;都必须实现它&…

最大连续1的个数Ⅲ-滑动窗口

1004. 最大连续1的个数 III - 力扣&#xff08;LeetCode&#xff09; Solution 标准滑动窗口。 class Solution { public:int longestOnes(vector<int>& nums, int k) {int nnums.size();int l0,z_cnt0,ans0;for(int r0;r<n;r){z_cnt1-nums[r];while(z_cnt>k…

实验二 Cisco IOS Site-to-Site Pre-share Key

一 实验设备 1、 CISCO 路由器 2 台 二 实验拓扑图 三 实验配置 1、 R1 路由器上连通性配置 R1(config)#interface e0/0 R1(config-if)#ip address 192.168.1.2 255.255.255.0 R1(config-if)#no shutdown R1(config)#interface e1/0 R1(config-if)#ip address 10.1.20.1 255.25…

深入理解 Rust Axum:两种依赖注入模式的实践与对比(二)

前言 我想把使用 Rust 开发Websocket 服务的文章写成一个系列&#xff0c;前面写了一遍如何使用 Axum 搭建一个Websocket 服务的文章&#xff0c;我们可以和前端demo页面进行全双工的 Websocket 消息传输&#xff0c;而且可以启用 HTTP2 的同时启用 TLS。 这时候问题来了&…

syn与quote的使用——结构体转create语句

前言 syn和quote的简单使用——生成结构体-CSDN博客https://blog.csdn.net/qq_63401240/article/details/150609865?spm1001.2014.3001.5501 前面使用syn和quote&#xff0c;发现挺好玩的&#xff0c;感觉可以干很多事情&#xff0c;不愧是Rust中的宏。 宏分为声明宏和过程…

集中式负载均衡 vs. 分布式负载均衡

集中式负载均衡 vs. 分布式负载均衡负载均衡&#xff08;Load Balancing&#xff09;是任何可伸缩系统的“交通警察”。 集中式负载均衡&#xff08;Centralized LB&#xff09;与分布式负载均衡&#xff08;Distributed LB&#xff09;代表了两种截然不同的“指挥哲学”&#…

【机器学习】9 Generalized linear models and the exponential family

本章目录 9 Generalized linear models and the exponential family 281 9.1 Introduction 281 9.2 The exponential family 281 9.2.1 Definition 282 9.2.2 Examples 282 9.2.3 Log partition function 284 9.2.4 MLE for the exponential family 286 9.2.5 Bayes for the e…

EndNote 2025 Mac 文献管理工具

原文地址&#xff1a;EndNote 2025 Mac 文献管理工具 EndNote mac版一款文献管理工具&#xff0c;支持国际期刊的参考文献格式有3776种&#xff0c;写作模板几百种&#xff0c;涵盖各个领域的杂志。 EndNote mac不仅仅局限于投稿论文的写作&#xff0c;对于研究生毕业论文的写…

openEuler系统中home文件夹下huawei、HwHiAiUser、lost+found 文件夹的区别和作用

在 openEuler 系统的 /home 目录下出现的 huawei、HwHiAiUser 和 lost+found 文件夹,分别对应不同的功能和用途,具体区别和作用如下: 1. lost+found 文件夹 通用 Linux 系统文件夹:lost+found 是所有 Linux 系统(包括 openEuler)中默认存在的文件夹,并非 openEuler 特有…

Electron 核心 API 全解析:从基础到实战场景

Electron 凭借丰富的 API 体系&#xff0c;让前端开发者能轻松调用系统级能力。本文将系统梳理 Electron 核心 API 的分类、使用场景及实战示例&#xff0c;帮你快速掌握从窗口管理到进程通信的全场景开发。 一、主进程核心 API&#xff08;Main Process&#xff09; 主进程是…

创建线程的方式有哪些?

1. 创建线程的方式有哪些?继承Thread类实现runnable接口实现Callable接口线程池创建线程(项目中使用方式)2. runnable 和 callable 有什么区别?Runnable接口run方法没有返回值Callable接口call方法有返回值,需要FutureTask获取结果Callable接口的call()方法允许抛出异常;而Ru…

More Effective C++ 条款05: 谨慎定义类型转换函数

More Effective C 条款05&#xff1a;谨慎定义类型转换函数核心思想&#xff1a;C中的隐式类型转换虽然方便&#xff0c;但容易导致意外的行为和维护难题。应当通过explicit关键字和命名转换函数等方式严格控制类型转换&#xff0c;优先使用显式转换而非隐式转换。 &#x1f68…

基于springboot的理商管理平台设计与实现、java/vue/mvc

基于springboot的理商管理平台设计与实现、java/vue/mvc

Flask蓝图:模块化开发的利器

蓝图为什么要使用蓝图模块化组织&#xff1a;将应用分解为可重用的模块&#xff08;组件&#xff09;。每个蓝图封装了相关的视图、静态文件、模板等。按功能划分&#xff1a;将大型应用按功能模块划分&#xff08;例如&#xff1a;用户认证、博客、管理后台&#xff09;&#…

设计模式详解

1.创建类型1.1 简单工厂startuml抽象产品接口 interface Product { Operation(): string } 具体产品A class ConcreteProductA { Operation(): string } 具体产品B class ConcreteProductB { Operation(): string } 工厂类 class Factory { CreateProduct(type: string): Produ…

前端查漏补缺

插槽默认、具名&#xff08;多个插槽&#xff09;、作用域&#xff08;接收子组件数据&#xff09;//具名 <div class"container"><header><slot name"header"></slot></header><main><slot></slot></…

网络协议UDP、TCP

一、网络协议 UDPUDP用户数据报协议&#xff1a;传输层网络编程模型B/S模型&#xff1a;browser/server&#xff08;浏览器/服务器&#xff09;客户端是通用的客户端&#xff08;浏览器&#xff09;一般只做服务器开发客户端要加载的数据均来自服务器C/S模型&#xff1a;client…

STM32 TIM_SelectInputTrigger()函数

一、函数功能与定位​TIM_SelectInputTrigger()是STM32定时器外设的关键配置函数&#xff0c;用于设置从模式定时器的触发源&#xff08;Trigger Source&#xff09;​。其核心作用是将定时器的内部事件或外部信号映射为触发信号&#xff08;TRGI&#xff09;&#xff0c;进而控…