k8s---pod基础下

news2024/11/15 1:27:54

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: centos
  name: centos
spec:
  replicas: 1
  selector:
    matchLabels:
      app: centos
  template:
    metadata:
      labels:
        app: centos
    spec:
      containers:
      - image: centos:7
        name: centos
        command: ["/bin/bash","-c","sleep 3600"]
#容器的持久化命令
        resources:
          requests:
            memory: "256Mi"
            cpu: "0.5"
          limits:
            memory: "1Gi"
            cpu: "1"

wq

kubectl describe pod centos

下面进行压力测试

yum -y install epel-release
yum -y install stress

stress --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: centos
  name: centos
spec:
  replicas: 1
  selector:
    matchLabels:
      app: centos
  template:
    metadata:
      labels:
        app: centos
    spec:
      containers:
      - image: centos:7
        name: centos
        command: ["/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
#只要成功一次就标记为就绪,健康,ready
          timeoutSecond:
#表示每次探测的超时时间,在多少秒内必须完成探测




kubectl apply -f test1.yaml

kubectl 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: nginx1
  name: nginx1
spec:
  containers:
  - image: tomcat:8.0.52
    name: nginx1
    livenessProbe:
      httpGet:
        port: 8080
        path: /index.html
      initialDelaySeconds: 4
      periodSeconds: 2

我们修改回来

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx1
  name: nginx1
spec:
  containers:
  - image: tomcat:8.0.52
    name: nginx1
    livenessProbe:
      httpGet:
        port: 8080
        path: /index.jsp
      initialDelaySeconds: 4
      periodSeconds: 2

成功运行。

下面来对tomcat的页面进行访问:

kubectl get pod -o wide
查看IP

curl 10.244.2.21:8080/index.jsp

tcpSocket检测

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx1
  name: nginx1
spec:
  containers:
  - image: tomcat:8.0.52
    name: nginx1
    livenessProbe:
      tcpSocket:
        port: 8081
      initialDelaySeconds: 4
      periodSeconds: 2

如图所示,我给tomcat一个错误的端口8081,容器无法启动

修改为正确端口:8080

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx1
  name: nginx1
spec:
  containers:
  - image: tomcat:8.0.52
    name: nginx1
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 4
      periodSeconds: 2

成功启动运行

强制删除会导致资源残留,不建议经常适用

总结:

总结:

探针的三个方法:

存活探针:检测失败后,会杀死容器然后重启

探针将伴随整个容器的生命周期

exec:相当于执行了一个shell命令,容器里面执行

shell命令执行成功:

返回码是0,表示成功。

只要成功一次就是探测成功

httpGet:对外部容器发起了一次get请求,可以添加path指定访问的资源。返回码在[200,400)范围之内都算成功。

tcpSocket:相当于telnet,指定的容器监听端口是否能打开。是否能和指定的容器监听端口进行通信

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

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

相关文章

宿舍安全用电监控系统解决方案

摘 要&#xff1a;很多高校宿舍的用电功率存在限制,为此设计了宿舍用电智能监控系统。系统由主控制器、采集部分、通信部分组成。利用STM32作为主控芯片,采集部分采用BL0937芯片采集电压和电流,采集多条线路用电数据,各路数据采集通道均采用隔离保护,通信部采用4G、LoRa无线通信…

系统架构设计师教程(十)软件可靠性基础知识

软件可靠性基础知识 10.1 软件架构演化和定义的关系10.1.1 演化的重要性10.1.2 演化和定义的关系 10.2 面向对象软件架构演化过程10.2.1 对象演化10.2.2 消息演化10.2.3 复合片段演化10.2.4 约束演化 10.3 软件架构演化方式的分类10.3.1 软件架构演化时期10.3.2 软件架构静态演…

Dockerfile基本结构及编写详解

文章目录 1 Dockerfile1.1 Dockerfile的基本结构1.2 Dockerfile文件说明1.3 Dockerfile常见命令1.4 build命令1.5 部署微服务1.6 docker-compose部署 1 Dockerfile ​ Dockerfile其实就是我们用来构建Docker镜像的源码&#xff0c;当然这不是所谓的编程源码&#xff0c;而是一…

用通俗易懂的方式讲解:2024 检索增强生成技术(RAG)研究进展

本篇内容1w字左右&#xff0c;稍微有点长&#xff0c;相对不容易理解&#xff0c;喜欢可以收藏、关注、点赞。 一、前言 在过去的一两年里&#xff0c;人工智能领域目睹了检索增强生成技术&#xff08;RAG&#xff09;的迅猛发展&#xff0c;这种技术结合了强大的语言模型与信…

百倍潜力股Aleo即将上线,布局正当时!牛市来时,你得有币!

前言 在加密货币市场&#xff0c;2024年被众多市场专家预测为迎来新一轮牛市的关键年份。这一预测背后&#xff0c;潜藏着多种可能推动牛市的因素。其中&#xff0c;下一次比特币&#xff08;BTC&#xff09;的减半事件&#xff0c;以及2024年 BTC 现货ETF的推出&#xff0c;都…

python统计分析——直方图(sns.histplot)

使用seanborn.histplot()函数绘制直方图 from matplotlib.pyplot as plt import seaborn as snsdata_setnp.array([2,3,3,4,4,4,4,5,5,6]) plt.hist(fish_data) &#xff08;1&#xff09;dataNone, 表示数据源。 &#xff08;2&#xff09;xNone, 表示直方图的分布垂直与x轴…

UG装配-爆炸图

当我们将零件装配成总成的时候&#xff0c;通常需要绘制爆炸图来说明总成零件组成&#xff0c;需要用到爆炸图命令&#xff0c;首先点击新建爆炸&#xff0c;然后为爆炸图命名 然后我们可以选择编辑爆炸或者自动爆炸&#xff1a; 编辑爆炸是通过手动的方式选择部件&#xff0c…

岁月匆匆,技术之光

岁月匆匆&#xff0c;技术之光 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c;还请读者海涵指正。☕&#x1f36d; 《MYSQL从入门到精…

【洛谷学习自留】p9226 糖果

解题思路&#xff1a; 简单的计算题&#xff0c;用n对k取余&#xff0c;如果余数为0&#xff0c;则输出k的值&#xff0c;否则输出&#xff08;k-余数&#xff09;的值。 代码实现&#xff1a; import java.util.Scanner;public class p9226 {public static void main(Strin…

2024年如何借用电商新零售破局?新型商业模式——乐享甄选竞拍模式

2024年如何借用电商新零售破局&#xff1f;新型商业模式——乐享甄选竞拍模式 背景&#xff1a;经历疫情三年的黑天鹅&#xff0c;消费者对未来收入预期和不自信等悲观情绪&#xff0c;从而使得“勒紧腰带&#xff0c;少消费&#xff0c;不消费”&#xff0c;以简单实用成为了新…

全栈自动化测试面试题含答案和学习路线(适合各级软件测试人员)

在面试战场上&#xff0c;我们需要像忍者一样灵活&#xff0c;像侦探一样聪明&#xff0c;还要像无敌铁金刚一样坚定。只有掌握了这些技巧&#xff0c;我们才能在面试的舞台上闪耀光芒&#xff0c;成为那个令HR们心动的测试人 前言&#xff1a; 我相信大多测试开发的或多或少经…

图像去噪——CBDNet网络训练自己数据集及推理测试,模型转ONNX模型(详细图文教程)

CBDNet 主要由两个子网络组成&#xff1a;噪声估计子网络和去噪子网络。噪声估计子网络用于估计图像的噪声水平&#xff0c;而去噪子网络用于去除图像中的噪声。 CBDNet 的优势在于&#xff1a; 它采用了更真实的噪声模型&#xff0c;既考虑了泊松-高斯模型&#xff0c;还考虑…

01.Typora1.7.6安装以及更换主题方法

重所周知&#xff0c;程序员的笔记资料有多么重要&#xff0c;不仅是自我提升也是加强记忆 那么一定少不了Typora这个软件 今天就来感受一下它应该如何打开正确的安装的方法。 双击文件夹以后&#xff0c;里面会有这样两个文件 我们双击后缀为.exe的文件 更改安装位置&#…

程序员副业之AI情侣头像(手把手超详细完整全流程)

项目介绍 小黑今天给咱们分享个轻松简单的项目&#xff0c;每天不会超过半小时&#xff0c;就是用AI制作情侣头像&#xff0c;在抖音上变现。听起来是不是很科幻&#xff1f;但实际上效果杠杠的&#xff01; 最关键的是&#xff0c;收入方面&#xff0c;一单9块9&#xff0c;…

智能计价器Scratch-第14届蓝桥杯Scratch省赛真题第5题

5. 智能计价器&#xff08;80分&#xff09; 背景信息&#xff1a;A城市的出租车计价&#xff1a;3公里以内13元&#xff0c;基本单价每公里2.3元(超过3公里的部分&#xff0c;不满1公里按照1公里收费&#xff09;&#xff0c;燃油附加费每运次1元。例如&#xff1a;3.2公里的…

js数组循环,当前循环完成后执行下次循环

前言 上图中&#xff0c;点击播放icon&#xff0c;图中左边地球视角会按照视角列表依次执行。u3D提供了api,但是我们如何保证在循环中依次执行。即第一次执行完成后&#xff0c;再走第二次循环。很多人的第一思路就是promise。对&#xff0c;不错&#xff0c;出发的思路是正确的…

数据结构初阶之栈和队列(C语言版)

数据结构初阶之栈和队列&#xff08;C语言版&#xff09; ✍栈♈栈的结构设计♈栈的各个接口的实现&#x1f47a;StackInit(初始化)&#x1f47a;push&#xff08;入栈&#xff09;&#x1f47a;pop&#xff08;出栈&#xff09;&#x1f47a;获取栈顶元素&#x1f47a;获取栈中…

【LeetCode】20. 有效的括号(Deque的Stack用法)

今日学习的文章链接和视频链接 leetcode题目地址&#xff1a;20. 有效的括号 代码随想录题解地址&#xff1a;代码随想录 题目简介 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效…

ECharts 图表简单示例,中国地图

目录 ECharts官网链接: [ECharts](https://echarts.apache.org/zh/index.html)在项目中引入 Apache ECharts柱状图折线图饼图仪表盘中国地图完整示例代码 ECharts官网链接: ECharts 在项目中引入 Apache ECharts <!DOCTYPE html> <html><head><meta char…

RANSAC算法详解

给定两个点p1与p2的坐标&#xff0c;确定这两点所构成的直线&#xff0c;要求对于输入的任意点p3&#xff0c;都可以判断它是否在该直线上。初中解析几何知识告诉我们&#xff0c;判断一个点在直线上&#xff0c;只需其与直线上任意两点点斜率都相同即可。实际操作当中&#xf…