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。
相关文章:
K8S Pod
基本概念 Pod是K8S中非常重要的概念之一,是整个K8S架构的基础和核心。Pod是K8S调度的最小单位,是一个不可拆分的独立个体,K8S将多个业务上相关联的容器(Docker容器)合并到一起,组合成一个Pod,这…...

反向传播(backward propagation,BP) python实现
BP算法就是反向传播,要输入的数据经过一个前向传播会得到一个输出,但是由于权重的原因,所以其输出会和你想要的输出有差距,这个时候就需要进行反向传播,利用梯度下降,对所有的权重进行更新,这样…...

简单算命脚本
效果展示 文件内容 main.py文件 import json import random import time# 别挂配置数据 gua_data_path "data.json"# 别卦数据 gua_data_map {} fake_delay 10# 读取别卦数据 def init_gua_data(json_path):with open(gua_data_path, r, encodingutf8) as fp:gl…...
Lua-掌握Lua语言基础1
Lua是一种轻量级的脚本语言,广泛应用于游戏开发、嵌入式系统和其他领域。下面是Lua语言基础的介绍: 数据类型:Lua支持基本的数据类型,包括nil、boolean、number、string和table。其中,table是一种关联数组,…...

python-0003-pycharm开发虚拟环境中的项目
前言 在虚拟环境中创建好了python项目,使用pycharm进行开发 打开项目 使用pycharm打开项目 设置虚拟环境的解释器 File–>Settings–>Project(项目名)–>Python Interpreter–>添加解释器–>添加已经存在的解释器–>选择虚拟环境的解释器 …...

修改 MySQL update_time 默认值的坑
由于按规范需要对 update_time 字段需要对它做默认值的设置 现在有一个原始的表是这样的 CREATE TABLE test_up (id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 主键id,update_time datetime default null COMMENT 操作时间,PRIMARY KEY (id) ) ENGINEInnoDB DEF…...

基于亚马逊云EC2+Docker搭建nextcloud私有化云盘
亚马逊云科技EC2云服务器(Elastic Compute Cloud)是亚马逊云科技AWS(Amazon Web Services)提供的一种云计算服务。EC2代表弹性计算云,它允许用户租用虚拟计算资源,包括CPU、内存、存储和网络带宽࿰…...
用try...catch进行判断
在写一些提交数据的判断上,有时候会写下面的ifelse的判断方法,少一点还好,多的话就很难受也不好看。 if(!that.driverObj.contrary){this.__utils.showToast(请先上传驾驶证副页图片);return false } if(!this.driverObj.start){this.__util…...

服务器遭遇挖矿病毒syst3md及其伪装者rcu-sched:原因、症状与解决方案
01 什么是挖矿病毒 挖矿病毒通常是恶意软件的一种,它会在受感染的系统上无授权地挖掘加密货币。关于"syst3md",是一种特定的挖矿病毒,它通过在受感染的Linux系统中执行一系列复杂操作来达到其目的。这些操作包括使用curl从网络下载…...

此机非彼机,工业计算机在工业行业的特殊地位
电子计算机,称为电脑。计算机是一种利用数字电子技术,根据一系列指令指示其自动执行任意算术或逻辑操作串行的设备。通用计算机因有能遵循被称为“程序”的一般操作集的能力而使得它们能够执行极其广泛的任务,以管理各种工厂和机器自动化工业…...

Python使用lxml解析XML格式化数据
Python使用lxml解析XML格式化数据 1. 效果图2. 源代码参考 方法一:无脑读取文件,遇到有关键词的行再去解析获取值 方法二:利用lxml等库,解析格式化数据,批量获取标签及其值 这篇博客介绍第2种办法,以菜鸟教…...
CDA-LevelⅡ【考题整理-带答案】
关于相关分析中应注意的问题,下面说法错误的是:B 如果两变量间的相关系数为0,则说明二者独立 。解释:只能说明两者不存在线性相关关系现通过参数估计得到一个一元线性回归模型为y3x4,在回归系数检验中下列说法错误的是…...

20240304 json可以包含复杂数组(数组里面套数组)
欣赏一下我的思维,它会以漫画,表格,文字。。。各种各样的形式呈现 对于问题1问题2 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON本质上是一种文本…...

算法50:动态规划专练(力扣514题:自由之路-----4种写法)
题目: 力扣514 : 自由之路 . - 力扣(LeetCode) 题目的详细描述,直接打开力扣看就是了,下面说一下我对题目的理解: 事例1: 输入: ring "godding", key "gd" 输出: 4. 1. ring的第…...

重学SpringBoot3-集成Thymeleaf
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Thymeleaf 1. 添加Thymeleaf依赖2. 配置Thymeleaf属性(可选)3. 创建Thymeleaf模板4. 创建一个Controller5. 运行应用并访问页…...

【数据可视化】Echarts最常用图表
个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. 准备工作3. 柱状图3.1 绘制堆积柱状图3.2 绘制标准条形图3.3 绘制瀑布图 4. 折线图4.1 绘制堆积面积图和堆积折线图4.2 绘制阶梯图 5. 饼图5.1 绘制标准饼图5.2 绘制圆环图5.2 绘制嵌套饼图5.3 绘制南丁格尔…...
flink:通过table api把文件中读取的数据写入MySQL
当写入数据到外部数据库时,Flink 会使用 DDL 中定义的主键。如果定义了主键,则连接器将以 upsert 模式工作,否则连接器将以 append 模式工作 package cn.edu.tju.demo2;import org.apache.flink.streaming.api.environment.StreamExecutionE…...
【Java 多线程 哈希表】 HashTable, HashMap, ConcurrentHashMap 之间的区别
HashTable、HashMap和ConcurrentHashMap都是Java中用于存储键值对的集合框架的一部分,但它们之间存在一些重要的联系和区别。 联系 键值对存储:它们都用于存储键值对,并允许你根据键来检索值。基于哈希:它们内部都使用了哈希表来…...
有趣之matlab-烟花
待整合1 2 3 动态 有趣编程之11 静态 逼真 3 .m文件路径下放back1.jpg back4.jpg…背景照片 点击screen 就会有小白点升起,爆炸 function yanhuamoban()clear all;%定义全局变量global ah ;%坐标轴句柄global styleNum ;%爆炸图案样式global multiColor; %多颜色变换…...

C语言指针与数组(不适合初学者版):一篇文章带你深入了解指针与数组!
🎈个人主页:JAMES别扣了 💕在校大学生一枚。对IT有着极其浓厚的兴趣 ✨系列专栏目前为C语言初阶、后续会更新c语言的学习方法以及c题目分享. 😍希望我的文章对大家有着不一样的帮助,欢迎大家关注我,我也会回…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...