k8s---pod基础下
k8s的pod与docker重启策略的区别
k8s的重启策略
- always deployment的yaml文件只能是always,pod的yaml三种模式都可以。不论正常退出还是非正常退出都重启。
- OnFailure:正常退出不重启,非正常退出会重启
- Never:正常退出和非正常退出都不重启。容器退出了,pod才会重启
pod可以有多个容器,只要有一个容器退出,整个pod都会重启,所有pod内的容器都会重启。
docker的重启策略:
- docker的默认策略是nerver。
- on-failure:非正常退出时才会重启容器
- always:只要容器退出都重启。
- unless-stopped:只要容器退出就会重启,docker的守护进程启动时已经停止的容器,不再重启。
注意:yaml方式创建Deployment和StatefulSet类型时,restartPolicy只能是Always,kubectl run -个pod可以选择Always,OnFailure,Never三种策略
如何快捷的生成yaml文件
生成模板
[root@master01 ~]# kubectl create deployment nginx1 --image=nginx:1.22 --replicas=3 --dry-run=client
deployment.apps/nginx1 created (dry run)将模板输出到指定的位置
[root@master01 opt]# kubectl create deployment nginx1 --image=nginx:1.22 --replicas=3 --dry-run=client -o yaml > /opt/test1.yaml
模板:
pod的生命周期状态
1.pending 挂起。
pod已被创建,但是尚未被分配到运行的node节点。
原因:节点的资源不够,需要等待其他pod的调度。
2.running
运行中pod已经被分配到了node节点,pod内部的所有容器都已经启动,运行状态正常,稳定。
3.complete / successded
表示容器内部的进程运行完毕,正常退出,没有发生错误。
4.failed:
pod中的容器非正常退出。发生了错误,需要通过查看详情和日志来定位问题。
5.UNknow:
因为某些原因,k8s集群无法获取pod的状态。APIserver出了问题。
6.terminating :
终止中,pod正在被删除,里面的容器正在终止。种植过程中,资源回收,垃圾清理,以及终止过程中需要执行的命令。
7.crashloopbackoff:
pod当中的容器退出,kubelect正在重启
8.imagepullbackoff:正在重试拉取镜像
原因:指定仓库错误
9.errimagepull:
拉取镜像出错
原因:1.网速太慢,超时了 2.镜像名写错 3.镜像仓库挂了
10.Evicte:pod被驱赶了
原因:node节点的资源不够部署pod。资源不足,kubelect自动选择一个pod驱逐
CrashLoopBackOff: 容器退出,kubelet正在将它重启
InvalidImageName: 无法解析镜像名称
ImageInspectError: 无法校验镜像
ErrImageNeverPull: 策略禁止拉取镜像
ImagePullBackOff: 正在重试拉取
RegistryUnavailable: 连接不到镜像中心
ErrImagePull: 通用的拉取镜像出错
CreateContainerConfigError: 不能创建kubelet使用的容器配置
CreateContainerError: 创建容器失败
m.internalLifecycle.PreStartContainer 执行hook报错
RunContainerError: 启动容器失败
PostStartHookError: 执行hook报错
ContainersNotInitialized: 容器没有初始化完毕
ContainersNotReady: 容器没有准备完毕
ContainerCreating: 容器创建中
PodInitializing:pod 初始化中
DockerDaemonNotReady: docker还没有完全启动
NetworkPluginNotReady: 网络插件还没有完全启动
Evicte: pod被驱赶
pod容器使用节点资源限制
在我前面Docker的Cgroup文章中,就提到过,为什么我们对容器进行资源限制。同理:首先K8s中pod使用宿主机的资源默认情况下是无节制的,但是当一个集群搭建成功后并投入生产环境中。如果其中的某一个pod因为不明原因出现了bug,疯狂占用宿主机资源,抢占其他pod的资源。势必会导致整个集群的瘫痪,所以pod资源的限制是非常有必要的
在资源控制器中我们也可以准确的找到相应的资源控制字段:
kubectl explain deployment.spec.template.spec.containers.resources
kubectl explain statefulset.spec.template.spec.containers.resources
pod容器资源的限制
1.request:pod内容器需要的资源2.limit:最高能占用系统多少资源limit需要多少,最多也只能占用这么多
pod容器的对cpu的限制:
pod容器对cpu有两种方法限制
pod对于cpu限制的参数有两种表达形式:
第一种是指定个数的表达形式,例如:1 ,2, 0.5 ,0.2 ,0.3 指定cpu的个数(该个数可以为整数,也可以为小数点后一位的小数)
第二种是以毫核为单位的表达形式:100m 500m 1000m 2000m (这里1000m等价于一个cpu,该方式来自于cpu时间分片原理得来)
memory的表达形式
pod对内存参数的要求十分严谨。对硬件有过研究的朋友,应该会了解到,我们常常提到的GB,MB,TB其实是于实际字节总数是有误差的(原因是GB是以10为底数计量,而真正的换算是以2为底数计量。导致了总量的误差。)而真正没有此误差的单位是Ki Mi Gi Ti
所以k8s中pod资源限制为了对pod的内存限制更为精准,采用的单位是 Ki Mi Gi Ti
实例运用
需求:创建一个deployment资源,镜像使用centos:7。副本数一个。容器资源预留256MB,cpu0.5个。最多1GB,1个cpu
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: centosname: centos
spec:replicas: 1selector:matchLabels:app: centostemplate:metadata:labels:app: centosspec:containers:- image: centos:7name: centoscommand: ["/bin/bash","-c","sleep 3600"]
#容器的持久化命令resources:requests:memory: "256Mi"cpu: "0.5"limits:memory: "1Gi"cpu: "1"wqkubectl describe pod centos
下面进行压力测试
yum -y install epel-release
yum -y install stressstress --vm 1 --vm-bytes 512M
压力测试[root@centos-847ddb86c-dhn44 /]# stress --vm 1 --vm-bytes 1G
stress: info: [89] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [89] (415) <-- worker 90 got signal 9
stress: WARN: [89] (417) now reaping child worker processes
stress: FAIL: [89] (451) failed run completed in 1s
超过限制直接杀死
由此可见:
在创建pod时,一定要给容器做资源限制!!!
k8s当中怎么设置拉取镜像的策略
首先在资源式声明中存在着imagePullPolicy的字段,它的value决定着k8s创建容器时拉取镜像的方式策略。【此字段所在位置也说明了在声明式yaml中,imagePullPolicy是包含containers中】
kubectl explain pod.spec.containers.imagePullPolicy
如图所示,这三种便是k8s拉取镜像的三种策略:
IfNotPresent
只有当镜像在本地不存在时才会拉取。(先对本地进行排查,本地有该镜像直接使用,本地没有该镜像则选择在仓库中拉取)
如果本地镜像有,就不再拉取,本地没有才会去镜像仓库拉取
Always
总是从仓库拉取镜像,无论本地是否存在镜像(即使本地中存在我们所指定的相关镜像,该策略也会先从仓库中拉取进行应用)
不论镜像是否存在,创建时(重启)都会重新拉取镜像
Never
Kubelet 不会尝试获取镜像。如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败。(如果本地不存在,并不会在仓库中拉取,直接报错)
仅仅使用本地镜像,本地没有也不会主动拉取
k8s设置镜像拉取策略命令:
imagePullPolicy: Always / Nerver / IfNotPresent
实验演示:
总结:
都是本地部署:never
如果涉及到外部部署:默认策略(事前要把docker镜像导入目标主机,否则会去官网去拉)
Always:一般不用
pod的容器健康检查
1. 探针的概念及其作用
探针是由 kubelet 对容器执行的定期诊断(pod中探针又分为三类):
存活探针(livenessProbe)探测容器是否运行正常。如果探测失败则kubelet杀掉容器(不是Pod),容器会根据重启策略决定是否重启
就绪探针(readinessProbe)探测Pod是否能够进入READY状态,并做好接收请求的准备。如果探测失败Pod则会进入NOTREADY状态(READY为0/1)并且从所关联的service资源的端点(endpoints)中踢出,service将不会再把访问请求转发给这个Pod
启动探针(startupProbe)探测容器内的应用是否启动成功,在启动探针探测成功之前,其它类型的探针都会暂时处于禁用状态
注意:启动探针只是在容器启动后按照配置满足一次后就不再进行后续的探测了。存活探针和就绪探针会一直探测到Pod生命周期结束为止
kubectl explain pod.spec.containers
probe的检测方法
1.exec探针:在容器内部执行命令,如果命令的返回码是0,表示成功。
适用于需要在容器内自定义命令来检查容器的健康情况
2.httpGet:
对指定IP+port的容器发送一个httpGet的请求。响应状态码大于等于200,小于400都是成功。
x=[200,400) (这里用数学集合的方式表示,更容易理解)
适用于检查容器能否响应http的请求,web容器(nginx,tomcat)
3.tcpSocket
端口:对指定端口上的容器的IP地址进行tcp检查(三次握手),端口打开,认为探测成功。
检查特点容器的端口监听状态。
exec:查看容器指定的配置文件有没有生成
httpGet,tcpSocket:主要是对外部容器的检测
探针字段
initialDelaySeconds: 3
表示容器启动之后多少秒来进行探测,时间不要设置的太短,可能会导致无效探测。
periodSeconds: 2
表示探针探测的间隔时间。每隔多少秒进行一次检查。应用的延迟敏感度,这个应用非常重要,>核心组件
failureThreshold: 2
表示如果探测失败,失败几次之后把容器标记为不健康
successThreshold: 1
只要成功一次就标记为就绪,健康,ready
timeoutSecond:
表示每次探测的超时时间,在多少秒内必须完成探测
用exec方式探测
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: centosname: centos
spec:replicas: 1selector:matchLabels:app: centostemplate:metadata:labels:app: centosspec:containers:- image: centos:7name: centoscommand: ["/bin/bash","-c","touch /opt/123.txt ; sleep 3600"]livenessProbe:exec:command: ["/usr/bin/test","-e","/opt/123.txt"]initialDelaySeconds: 3
#表示容器启动之后多少秒来进行探测,时间不要设置的太短,可能会导致无效探测。 periodSeconds: 2
#表示探针探测的间隔时间。每隔多少秒进行一次检查。应用的延迟敏感度,这个应用非常重要,>核心组件failureThreshold: 2
#表示如果探测失败,失败几次之后把容器标记为不健康successThreshold: 1
#只要成功一次就标记为就绪,健康,readytimeoutSecond:
#表示每次探测的超时时间,在多少秒内必须完成探测kubectl apply -f test1.yamlkubectl exec -it centos-797bc57596-jkdfw -- rm -rf /opt/123.txt
脚本所示,通过exec将返回值写入/opt/123.txt中。若进容器将/opt/123.txt删除,则容器会重启,最多重启三次。(如上图所示)
此时若再将文件创建,容器就可以正常运行
kubectl exec -it centos-797bc57596-jkdfw -- touch /opt/123.txt
HTTP方法测试
apiVersion: v1
kind: Pod
metadata:labels:run: nginx1name: nginx1
spec:containers:- image: tomcat:8.0.52name: nginx1livenessProbe:httpGet:port: 8080path: /index.htmlinitialDelaySeconds: 4periodSeconds: 2
我们修改回来
apiVersion: v1
kind: Pod
metadata:labels:run: nginx1name: nginx1
spec:containers:- image: tomcat:8.0.52name: nginx1livenessProbe:httpGet:port: 8080path: /index.jspinitialDelaySeconds: 4periodSeconds: 2
成功运行。
下面来对tomcat的页面进行访问:
kubectl get pod -o wide
查看IPcurl 10.244.2.21:8080/index.jsp
tcpSocket检测
apiVersion: v1
kind: Pod
metadata:labels:run: nginx1name: nginx1
spec:containers:- image: tomcat:8.0.52name: nginx1livenessProbe:tcpSocket:port: 8081initialDelaySeconds: 4periodSeconds: 2
如图所示,我给tomcat一个错误的端口8081,容器无法启动
修改为正确端口:8080
apiVersion: v1
kind: Pod
metadata:labels:run: nginx1name: nginx1
spec:containers:- image: tomcat:8.0.52name: nginx1livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 4periodSeconds: 2
成功启动运行
强制删除会导致资源残留,不建议经常适用
总结:
总结:
探针的三个方法:
存活探针:检测失败后,会杀死容器然后重启
探针将伴随整个容器的生命周期
exec:相当于执行了一个shell命令,容器里面执行
shell命令执行成功:
返回码是0,表示成功。
只要成功一次就是探测成功
httpGet:对外部容器发起了一次get请求,可以添加path指定访问的资源。返回码在[200,400)范围之内都算成功。
tcpSocket:相当于telnet,指定的容器监听端口是否能打开。是否能和指定的容器监听端口进行通信
相关文章:

k8s---pod基础下
k8s的pod与docker重启策略的区别 k8s的重启策略 always deployment的yaml文件只能是always,pod的yaml三种模式都可以。不论正常退出还是非正常退出都重启。OnFailure:正常退出不重启,非正常退出会重启Never:正常退出和非正常退出…...

玩转朋友圈!这样运营朋友圈吸睛又吸金!
朋友圈已成为现代社交媒体中不可或缺的平台,并且有很大的潜力用于营销和推广。那么如何才能让朋友圈在众多用户中脱颖而出,吸引眼球并提升商业效益呢?主要从以下几点出发: 首先,要想吸引关注,您需要在朋友…...

react学习
目录 一、react基础 5.loadsh使用排序8.ref获取DOM对象10.props使用*13.UseEffect 二、 react使用redux三、美团外卖项目完成页面制作使用redux渲染页面使用react-router-dom评价 一、react基础 jsx 大括号的作用 {count} {userLlist.map((item)>{return <li key{item…...

vue-cli项目中vue.config.js的配置
vue-cli项目中vue.config.js的配置 一、直接上代码 一、直接上代码 let path require(path) let glob require(glob)function resolve(dir) {return path.join(__dirname, src/${dir}) }module.exports {pages: {index: {// page 的入口entry: src/main.js,// 模板来源temp…...

Github 2024-01-04 开源项目日报 Top10
根据Github Trendings的统计,今日(2024-01-04统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3C项目2TypeScript项目2Java项目2Jupyter Notebook项目1Go项目1 系统设计指南 创建周期ÿ…...

使用GPTs+Actions自动获取第三方数据
目录 安装插件与GPT对话联网插件首先,创建GPTs。 Voxscript 官网:https://voxscript.awt.icu/index.htmlOpenAI Schema:https://voxscript.awt.icu/swagger/v1/swagger.yamlServer URL: servers: url: https://voxscript.awt.icu安装插件 要使用这个插件&...

git提交操作(不包含初始化仓库)
1.进入到本地的git仓库 查看状态 git status 如果你之前有没有成功的提交,直接看第5步。 2.追踪文件 git add . 不要提交大于100M的文件,如果有,看第5步 3.提交评论 git commit -m "你想添加的评论" 4.push (push之前可以再…...

使用YOLOv8和Grad-CAM技术生成图像热图
目录 yolov8导航 YOLOv8(附带各种任务详细说明链接) 概述 环境准备 代码解读 导入库 定义letterbox函数 调整尺寸和比例 计算填充 应用填充 yolov8_heatmap类定义和初始化 后处理函数 绘制检测结果 类的调用函数 热图生成细节 参数解释 we…...

Vue: 多个el-select不能重复选择相同属性
一、场景 1.需求: 用户可自由选择需要修改的对象并同时修改多个属性,需要校验修改对象不能重复选择,但是可供修改属性是固定的 2.目标效果: 二、实现 1.主要代码: <template><el-selectv-model"se…...

金色麦芒的2023
2023年即将过去,回首这一年,我深感自己在技术和职业生涯中取得了巨大的进步。这一年里,我不仅在技术层面有了更深入的掌握,也在个人成长和职业规划上有了更明确的方向。 首先,在技术层面,我今年最大的收获是…...

java设计模式学习之【策略模式】
文章目录 引言策略模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用计算示例代码地址 引言 设想你正在玩一个策略游戏,每一个决策都会导致不同的游戏结局。同样地,在软件开发中,我们常常需要根据不同的场景或条件选择不同…...
Mybatis SQL构建器类 - SqlBuilder and SelectBuilder (已经废弃)
在3.2版本之前,我们采用了一种略有不同的方法,通过利用ThreadLocal变量来掩盖一些使Java DSL有点繁琐的语言限制。然而,这种方法现在已被弃用,因为现代框架已经普及了使用构建器模式和匿名内部类的概念。因此,SelectBu…...
【Linux】不常用命令记录
查看开启的网络端口 1、使用netstat命令“netstat -tuln”,该命令将显示所有当前监听的TCP和UDP端口; 2、使用ss命令“ss -tuln”,用于显示当前监听的TCP和UDP端口; 3、使用lsof命令“lsof -i”,将显示当前打开的网络…...
【docker】安装docker环境并启动容器
一、安装docker 这里以centos系统为例安装docker环境 # 删除已有安装包 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-enginesudo yum install -y yum-utils # 设置源 y…...

AIOps探索 | 基于大模型构建高效的运维知识及智能问答平台(2)案例分享
原作者:擎创科技产品专家 布博士 案例分享 所需要的软件列表 本次案例的实现,全部采用开源或SAAS的产品来提供,并不涉及到私有化部署的软件产品。软件列表如下所示,如何申请apikey请自行研究,在这里不再详细说明&…...

【ESP32接入国产大模型之文心一言】
1. 怎样接入文心一言 随着人工智能技术的不断发展,自然语言处理领域也得到了广泛的关注和应用。在这个领域中,文心一言作为一款强大的自然语言处理工具,具有许多重要的应用价值。本文将重点介绍如何通过ESP32接入国产大模型之文心一言api&am…...

保湿剂,预计2026年市场规模将达到约230亿美元
全球市场分析 从全球市场来看,保湿剂市场规模正在快速增长。主要集中在欧美和亚太地区的市场,据市场调研机构的数据显示,预计2026年,全球保湿剂市场规模将达到约230亿美元。保湿剂的应用领域不断拓展,包括从化妆品到个…...

CodeWhisperer:编码世界中的声音启迪者
人烟 导语: 在数字化时代,编码已经成为了一种不可或缺的技能。而 CodeWhisperer(编码世界中的声音启迪者)则以其卓越的技术和深厚的知识为人们带来了独特的启发和指导。本文将介绍 CodeWhisperer 的背景和成就,探讨他是…...

golang学习专栏
GOLANG专栏 Golang基础教程 Golang基础教程 Golang练手算法 Golang练手算法 Golang设计模式 Golang设计模式 Golang数据结构和算法 Golang数据结构和算法 Golang并发编程 Golang并发编程 ORM框架Gorm Golang ORM框架gorm Golang源码分析 Golang源码分析 MySQL教程 MySQ…...

el-table表格动态添加列。多组数据拼接和多层级数据的处理
提示:el-table表格动态添加列 文章目录 前言一、多组数据拼接二、多层级处理三、实际应用中,为避免闪屏,可以表格数据统一渲染总结 前言 需求:富文本编辑器 一、多组数据拼接 <template><div class"test">…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...