K8S Pod

基本概念

Pod是K8S中非常重要的概念之一,是整个K8S架构的基础和核心。Pod是K8S调度的最小单位,是一个不可拆分的独立个体,K8S将多个业务上相关联的容器(Docker容器)合并到一起,组合成一个Pod,这些业务上相关的容器共享Pod中的网络和存储等资源。每个Pod都有一个唯一的IP地址,Pod中的所有容器都共享此IP地址。每个Pod在创建的时候K8S都会为其先创建一个根容器,即Sandbox容器或Pause容器,这个容器非常简单,就是一个主要包含for代码的死循环,起一个占位的作用。K8S先会为Pause容器分配网络命名空间,存储资源等,当在创建其它用户容器时,K8S只需要将这些用户容器加入到Pause容器即可,这样就实现了网络和存储资源的共享。

Pod分为普通Pod和静态Pod,如果没有特别说明,我们通常都使用普通Pod。静态Pod不常使用,其仅存在于特定的Node上,由kubelet进程管理,也无法与Deployment,DaemonSet等进行关联,其作用可能只是为了在某个特定的Node上做一些特殊的事情。

虽然Pod是K8S的最小调度单元,但绝大多数情况我们都不会直接创建一个Pod,因为其不具备副本管理,滚动升级等高级特性。通常都通过控制器来创建,如Deployment,DaemonSet,Job等。

Pod中容器共享Volume

只需要在Pod级别的配置中设置Volumes,可以是hostPath,emptyDir等等,然后在容器级别的配置中为不同的容器mount此Volume即可。

ConfigMap

ConfigMap用于设置Pod内容器的参数信息,如容器中进程监听的端口号,进程的命令行参数,对外依赖的服务名称等,能够实现应用和配置的有效分离。当然,这些配置信息都可以在Pod的yaml的定义中通过环境变量来指定,即给定一个环境变量名,然后写上此环境变量的值。但是有一个问题,如果Pod已经在运行,此时要修改Pod的某个配置参数,这将非常麻烦。一种做法是先把已经运行的Pod删除,再在yaml中修改配置参数,最后再apply此yaml。这个方法很粗暴,因为删除Pod的时候会导致Pod无法提供服务。最好的做法是使用ConfigMap,本质上ConfigMap也是设置环境变量,不同的是该环境变量的值没有hardcode,而是引用了某个ConfigMap。如果ConfigMap发生了改变,K8S会自动修改引用了该ConfigMap的Pod中对应的环境变量的值。

ConfigMap的使用很灵活,可以是key-value的形式,也可以是配置文件的形式,可以在定义ConfigMap的yaml中写上配置文件的全部内容,也可以指定从某个路径引用配置文件。

注意:如果要传递敏感配置,如密码,key等,需要使用Secret,而不是ConfigMap。

Downward API

如果Pod中的容器需要知道自己所属Pod的配置信息,如Pod名称,命名空间,IP地址,注解,Label,CPU Limit,Memory Limit等,可以使用Downward API在Pod的yaml定义中,使用环境变量或Volume挂载的方式传入到Pod的容器中。在很多场景下这些metadata数据都很有用,例如,在记录log的时候,可以带上pod名称用于标识log来源。

生命周期和重启策略

Pod的生命周期包含从Pod创建到Pod消亡的整个过程,通过Pod的状态可以标识不同的生命周期阶段。

Pending:API Server已经创建了Pod,但是Pod中至少还有一个容器没有被完全创建好,例如正在下载image。

Running:Pod中的所有容器都已创建,且正在运行。

Succeed:Pod中的容器都已经成功运行且正常退出,不会再重启。

Failed:Pod中的容器都已退出,但至少有一个的退出状态为失败。

Unknown:Pod状态未知。

Pod的重启策略包括Always,OnFailure和Never。

Always:当容器退出时(可能是正常或失败退出),由kubelet自动创建。

OnFailure:当容器以失败的方式退出时,由kubelet自动创建。

Never:任何情况都不重启。

重启策略还和控制器类别有关,例如Deployment和DaemonSet,重启策略只能是Always,因为这两种控制器都要求容器不能退出,需要一直运行来提供服务。Job和CronJob可以是OnFailure或Never。

健康检查和服务可用性检查

可以使用三类探针来判断某个容器是否正常,LivenessProbe,ReadinessProbe和StartupProbe。

LivenessProbe:用于判断容器是否还存活(Running),如果容器被判定没有存活,则K8S会kill此容器,并尝试重启。注意:这里是容器,不是Pod。

ReadinessProbe:用于判断容器能否正常提供服务,如果不能提供服务,则不会把容器加入到Endpoints列表中。注意和LivenessProbe的区别,如果容器是Running的状态,则可能是Ready或者不是Ready,如果不是Running的状态,肯定就不是Ready了。

StartupProbe:用于在容器创建时可能会占用很长时间的场景,通过StartupProbe能判断容器是否正常启动,属于“有且仅有一次”的长时间等待的检查。

Pod控制器

通过Pod控制器可以实现Pod的自动调度,控制器包括Deployment,ReplicaSet,Replication Controller,DaemonSet,StatefulSet,Operator,Job,CronJob等,参考(Controller部分)https://blog.csdn.net/funnyrand/article/details/135759060

NodeSelector

NodeSelector属于基于Node的定向调度,通过在Pod的yaml中设置nodeSelector,可以将Pod只调度到给定标签的Node上。这是比较旧的一种方式,控制粒度粗,但简单适用。

NodeAffinity/NodeAntiAffinity

在Node层面定义的一些规则,用于替换NodeSelector,可以很精确的控制将Pod调度到哪些Node上或者不调度到哪些Node上,有很灵活的匹配规则。

PodAffinity/PodAntiAffinity

在Pod层面定义的一些规则,用于控制Pod与Pod的亲和性和反亲和性,即希望哪些Pod能调度到一起,哪些Pod不能调度到一起。例如,在进行Server-Client的两节点测试中,我们希望部署在Server上的Pod和部署到Client上的Pod不能部署到一起,而不管它们部署到Node1还是Node2,只要不同时部署到一起即可。

Taints和Tolerations

污点和容忍,如果对某个Node设置了Taints,默认情况下K8S不会把Pod调度到此节点上,可能的原因是该Node的磁盘已满,内存不够,网速很慢,系统出现故障,Node需要维护,系统需要升级等。如果想让某个Pod被自动调度到Taints的Node上,需要在Pod的yaml中设置tolerations配置,标识此Pod能够容忍对应的Taints。

优先级调度

不同的Pod的优先级可能不一样,通过创建PriorityClass资源,并为Pod设置不同的PriorityClass可以控制Pod的优先级,K8S会优先调度高优先级的Pod。如果在创建某个高优先级的Pod时系统资源不够,例如,CPU和内存无法满足Limits的要求,此时K8S可能会驱逐(Evication)已经存在的低优先级的Pod。这里面的规则比较复杂,和QoS等配置也有关系。一般情况,让K8S驱逐已经存在的Pod是高风险操作,需要谨慎。

容灾调度

对于一个很大的K8S集群,集群中的Node可能分布在不同的区域(Zone),为了容灾的考虑,我们在创建某个Pod的时候希望在每个区域都能创建这个Pod,这里可以使用容灾调度。通过设置Pod的topologySpreadConstraints属性,并结合Node的topology.kubenetes.io/zone属性能够方便实现该需求。

自定义调度

如果K8S内置的调度策略无法满足我们的需求,我们可以实现自己的调度器。调度器的作用就是给定某个Pod,通过自定义的调度器的运算能够输出一个Node的名字,然后调用K8S的API(http://$SERVER/aip/v1/namespaces/default/pods/$PODNAME/binding),将Pod绑定到选择的Node上。自定义调度器可以用任何语言来实现。

初始化容器

初始化容器用于业务容器创建前的初始化工作,例如网络连通性检查,存储资源的创建等。通过initContainers可以为Pod配置多个初始化容器,K8S会按顺序执行每个初始化容器,只有所有的初始化容器都成功退出后,K8S才会创建和执行业务容器。

升级/回滚

Pod的升级/回滚通常针对Deployment控制器,如果直接创建Pod,则不具备此功能。

升级:如果某些Pod已经部署且正常运行,现在需要对Pod的Image升级,有三种做法,1)通过kubelet set image命令指定新的Image。2)通过kubelet edit deployment/deployment-xxx命令修改Deployment。3)手动修改yaml文件,然后再apply。升级的基本原理是K8S会创建一个新的ReplicaSet,并将副本数量设置为1,然后将旧的ReplicaSet的数量减1,接着依次进行加1和减1,直到旧的ReplicaSet的数量为0。

回滚:如果在升级过程中发现Image的版本不正确(错误的版本或不存在的版本等),可以回滚Deployment。通过命令kubelet rollout status deployment/deployment-xxx查看Deployment当前部署状态,然后通过命令kubelet rollout history deployment/deployment-xxx查看这个Deployment的历史记录(这里会输出Deployment的REVISION),最后通过命令kubelet rollout undo deployment/deployment-xxx --to-revision=N来指定回到某个Deployment的版本。

对于多个配置的修改,可以先暂定Deployment的升级执行,等这些配置都全部修改完成后再一次性升级。相关命令:kubelet rollout pause deployment/deployment-xxx,kubelet rollout resume deployment/deployment-xxx。

DaemonSet和StatefulSet的升级与Deployment的升级稍有不同,其通过不同的策略来完成升级,这里不详细说明。

扩容/缩容

分为手动和自动两种模式,手动扩容/缩容可以通过命令kubelet scal命令完成,自动扩容/缩容通过HPA功能完成。

通过HPA(Horizontal Pod Autoscaler)我们可以方便的使Pod自动扩容/缩容,例如,在业务量很大的时候自动增加Pod数量,在业务量很少的时候自动减少Pod数量。业务量的大小可以通过CPU使用率,内存使用率,或者自定义的某个指标来判断,自定义指标需要容器通过HTTP URL的形式返回给K8S。

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

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

相关文章

使用Office的小伙伴一定要把这个打开!关键时候能保命

使用电脑办公的小伙伴一定离不开Office。很多小伙伴在使用Office的时候,基本上都是双击打开对应的软件(Word/Excel/Powerpoint)就直接使用。 这种直接打开之后就使用的习惯很不值得提倡。除非你要记录的东西是一分钟就能完成的。 小白在企业上…

php 上传文件报错The file failed to upload

描述:环境lnmp 框架laravel 上传接口调用报错The file failed to upload 一、终端搜索php.ini文件位置 [root90f8687c2388 /]# whereis php.ini php: /usr/bin/php /usr/local/php二、修改文件php.ini配置文件upload_max_filesize项 ; Maximum allowed size for …

在四维轻云中,能够上传哪些地理空间数据?

四维轻云是一款地理空间数据在线管理平台,支持各类地理空间数据的在线管理、浏览及分享,用户可不受时间地点限制,随时随地上传、管理、查看及分享各类地理空间数据。平台具有项目管理、场景搭建、素材库等功能模块,支持在线协作管…

《JAVA与模式》之合成模式

系列文章目录 文章目录 系列文章目录前言一、合成模式二、安全式合成模式的结构三、透明式合成模式的结构四、两种实现方法的选择前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享…

DNS欺骗攻击技术详解及实战代码解析

简介 ARP(Address Resolution Protocol)欺骗和DNS(Domain Name System)欺骗是两种常见的网络攻击手段。本文将通过一段Python代码,详细解析如何利用Scapy库实现ARP欺骗与DNS欺骗,并进行实际操作。 实现原…

有哪些知识管理软件适合中小型企业,高管必看!

在经济加速发展的今天,企业对信息和知识的管理需求越来越高,于是,各类知识管理软件应运而生。对于中小型企业来说,选择一款高效、省时、方便的知识管理软件尤其重要。下面,我为大家推荐三款知识管理软件,适…

力扣L6--- 两数之和(java版)--2024年3月12日

1.题目 2.知识点 注1:在Java中,数组的长度不是通过调用一个方法获得的,而是通过一个属性直接获得的。因此,正确的语法是nums.length而不是nums.length()。 所以应该使用int m nums.length; 注2:return new int[]{i,…

计算机视觉2024年趋势简报

计算机视觉2024年趋势简报: **增强现实(AR)整合:**随着Apple和Meta等巨头推出消费级AR设备,预计计算机视觉将在日常应用中更为普及,如在制造、零售和教育领域提供沉浸式体验及操作支持。 **机器人-视觉语言…

【数据库】索引 视图 触发器 分页查询

目录 1、索引 2、视图 3、触发器 4、分页查询⚠️ 1、索引 提升查询效率、当数据量小的时候,索引看不出来效果,当数据量很大的时候,索引会显著提高查询速度 当给表添加索引之后,新插入一条数据,就会让索引进行重新…

SpringBoot注解事务失效列举总结

Spring事务注解 Transactional失效 常规写法不会有脏数据插入。 情景一、内部调用导致事务失效 数据库中出现测试回滚的脏数据 导致该问题原因为spring执行方法数据库操作的时候会生成一个动态代理类去执行代理类的该方法,代理类在执行updateUser时,执…

2024-3-11-C++作业

1>试编程 要求&#xff1a; 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 源代码: #include <iostream>using namespace std;int main() {string s;cout << "请输入字符串&#xff1a;"…

CentOS 7 基于开源项目制作openssh 9.7p1二进制rpm包(内含ssh-copy-id、显示openssl版本信息)—— 筑梦之路

可参考之前的文章&#xff1a;CentOS 5/6/7 基于开源项目制作openssh 9.6p1 rpm包—— 筑梦之路_centos6 openssh9.6rpm-CSDN博客 2024年3月12日 植树节制作&#xff0c;相关文件见我的资源

java算法第20天 | ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

654.最大二叉树 和根据后/前中序遍历数组生成树结构的思路一样。首先要明确参数和返回值。 每次递归需要传入数组&#xff0c;和开始和结束的位置&#xff0c;返回的是二叉树的根节点。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* …

解决对接淘宝开放平台添加商品图片问题

问题 之前工作因队友离开&#xff0c;只一天接手其部分且第二天就要上线此工具产品&#xff0c;测试提了一些Bug&#xff0c;在Bug中有一个是添加商品图片。前端告知不能用、电话离职队友说能用。没办法自己上、追踪代码。 en这块代码跟需求好像不太相符&#xff0c;重写。 …

力扣刷题日志-Day2 (力扣151、43、14)

151. 反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开 思路&#xff1a;根据题目大意&#xff0c;空格之间的就是一个单词&#xff0c;所以我们需要利用…

[高精度加法和乘法] 阶乘之和

题目描述 用高精度计算出 S1!2!3!⋯n!&#xff08;n≤50&#xff09;。 其中 ! 表示阶乘&#xff0c;定义为 n!n(n−1)(n−2)⋯1。例如&#xff0c;5!54321120。 输入格式 一个正整数 n。 输出格式 一个正整数 S&#xff0c;表示计算结果。 输入输出样例 输入 #1 3输出…

swagger踩坑之请求类不显示具体字段

swagger踩坑之请求类不显示具体字段 省流&#xff1a;枚举字段需要加上ApiModelProperty注解 过程复现&#xff1a; TestEnum 枚举不加注解&#xff0c;swagger的UI类不显示详细字段 Data Accessors(chain true) ApiModel(value "test对象", description &quo…

通过Office Web Viewer站点在线展示Office文档内容

方法&#xff1a; https://view.officeapps.live.com/op/view.aspx?src经Url编码的文档线上Url地址 比如&#xff1a; //以下地址来自一份旧项目代码&#xff0c;可见用的就是该方案function OfficeFileViewOnline(url, file_type, file_name) {url "http://14.23.112.2…

【美团笔试】20240309—春招、暑期实习实习笔试

【美团笔试】20240309—春招实习笔试真题 文章目录 【美团笔试】20240309—春招实习笔试真题1. 小美的MT2. 小美的数组询问3. 小美的平衡矩阵(前缀和)4. 小美的区间删除5. 小美的朋友关系参考1. 小美的MT MT 是美团的缩写,因此小美很喜欢这两个字母。现在小美拿到了一个仅由…

算法——哈希王

242.有效的字母异位词 力扣题目链接(opens new window) 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true 示例 2: 输入: s "rat", t "car&qu…