k8s之pod的基础(下)

k8s的pod重启策略

Always deployment的yaml文件只能是Always pod的yaml三种模式都可以,不论正常退出还是非正常退出都重启

OnDailure: 只有状态码非0才会重启。正常退出是不重启的

Never 正常退出和非正常退出都不重启

容器的退出了,pod才会重启

pod可以有多个容器,只要有一个容器退出,整个pod都会重启,pod内的所有容器都会重启

docker的重启策略

docker的默认策略是Never

on-failure 非正常退出,才会重启容器

Always 只要容器退出都会重启

unless-stopped 只要容器退出就会重启,docker守护进程时已经停止的容器,不再重启

单机部署 docker 足够了

集群化部署 才使用k8s

yaml文件快速生成
生成deployment的yml文件
kubectl create deployment nginx1 --image=nginx1.22 --replicas=3  --dry-run=client -o yaml > /opt/test1.yaml
#--dry-run=client  只是调用api的对象不执行命令生成pod的yml文件
kubectl run nginx1 --image=nginx:1.22 --dry-run=client -o yaml > /opt/test2.yml生成service的yaml文件
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort --dry-run=client -o yaml > /opt/test3.yml
pod的生命周期(补充)

crashloopbackoff pod当中的容器退出,kubelet正在重启

imagepillbackoff 正在重试拉去镜像

errimagepull 拉取镜像出错了

原因
1、网速太慢
2、镜像名字写错了
3、镜像仓库挂了

Evicte Pod被驱赶

node节点的资源不够部署pod,或者是资源不足,kubelet自动选择一个pod驱逐
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内的容器使用节点资源的限制

1、request pod容器内需要的资源

2、limit 最高能占用系统多少资源

limit   需要多少,最多也只能占用这么多两种限制
1、cpu		
cpu的限制格式(两种格式)
1  2  0.5  0.2   0.3  
1 可以占用一个cpu 
2 可以占用两个cpu
0.5  半个
0.2	 一个cpu的五分之一
0.1  是最小单位(不能最小)
要么是整数,要么就是小数点后只能跟一位,最小单位0.1
m 来表示cpu
cpu时间分片原理:
cpu时间分片:通过周期性的轮流分配cpu时间给各个进程,多个进程可以在cpu上交替执行
在k8s中就是表示占用的cpu的比率
m  millicores  单位
1000m 表示一个cpu   ....  500m  表示半个cpu2、内存
内存的单位表示
ki   表示KB 
Mi   表示MB
Gi   表示GB
Ti   表示TBapiVersion: 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:limits:memory: "1Gi"cpu: "1000m"在创建pod时,一定要给容器做资源限制
镜像拉取策略
k8s怎么设置拉取镜像的策略
默认策略:
IfNotPresent  如果本地镜像有,就不在拉取,本地没有才会去镜像仓库拉取
Always  不论是否存在,在创建时(重启)都会重新拉取镜像
Never  仅仅使用本地镜像,本地没有也不会主动拉取
都是本地部署,Never
如果涉及到外部部署,默认策略(事前要把docker镜像导入到目标主机)
Always 一般不用
pod的容器健康检查

探针 probe

k8s对容器执行的定期检查,诊断

探针有三种规则

1、存活探针

2、就绪探针

3、启动探针

存活探针  livenessProbe
作用: 探测容器是否正常运行,如果发现探测失败,会杀死容器,容器会根据重启策略来决定是否重启,不是杀掉pod就绪探针  
作用:探测容器是否进入ready状态,并做好接受请求的准备,探测失败  READY  0/1 没有进入ready状态,service 会把这个资源对象的端点从当中剔除,service也不会把请求转发到这个pod
kubectl get endpoints  查看pod的端点启动探针
只是在容器的启动后开始检测,容器内的应用是否启动成功,在启动探测成功之前,所有的其他的其他探针都会处于禁用状态,但是一旦启动探针结束,后续的操作不再受启动他真的影响在一个容器当中,可以有多个探针
启动探针:只在容器启动时探测
存活和就绪
probe的检查方法

1、exec探针:在容器内部执行命令,如果命令的返回码是0,表示成功

适用于需要在容器内自定义命令来检查容器的健康的情况

2、httpGet: 对指定IP+端口的容器发送一个httpget的请求,响应状态码大于等于200,小于400都是成功(x>=200<400)

适用于检查容器能否响应http的请求,web容器(nginx,tomcat)

3、tcpSocket:端口,对指定端口上的容器的IP地址进行tcp检查(三次握手),端口打开,认为探测成功

适用于检查特定容器容器的端口监听状态
诊断结果

1、成功 容器通过了 ,正常运行

2、失败,存活探针会重启

3、未知状态 诊断失败

实验(检查方法)
存活探针

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
#表示只要成功一个就标记就绪,健康,readytimeoutSeconds: 1
#表示每次探测的超时时间,在多少秒内必须完成探测livenessProbe 杀死容器重启,所有的探针策略伴随整个pod的生命周期,除了启动探针

httpGet方式

apiVersion: v1
kind: Pod
metadata:labels:run: nginx1name: nginx1
spec:containers:- image: tomcat:8.0.52name: nginx1livenessProbe:httpGet:scheme: HTTPport: 8080path: /index.jspinitialDelaySeconds: 4periodSeconds: 2

tcpSocket方式


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

就绪探针

exec方式

apiVersion: v1
kind: Pod
metadata:labels:run: nginx1name: nginx1
spec:containers:- image: tomcat:8.0.52name: nginx1command: ["/bin/bash","-c","sleep 3600"]readinessProbe:exec:command: ["/usr/bin/test","-e","/etc/passwd"]initialDelaySeconds: 4periodSeconds: 2

httpGet

pod的状态是runing ready状态是notready,容器不可以提供正常的业务访问,就绪探针不会重启容器.tcpSocket只是监听容器上的业务端口能否正常通信。8081没有,8080还在,也就是正常的端口还是可以访问。如果更改了容器的启动端口

tcpSocket

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

存活探针和就绪探针,会伴随整个pod的生命周期

启动探针
如果探测失败,pod的是notready状态  启动探针探测容器失败,会重启pod
启动探针没有成功之前,后续的探针都不会执行
启动探针成功之后,在pod的生命周期内不会在检测启动探针
重启pod之后,相当于重新部署了一个初始版的新的容器apiVersion: v1
kind: Pod
metadata:labels:run: nginx1name: nginx1
spec:containers:- image: tomcat:8.0.52name: nginx1startupProbe:exec:command: ["/usr/bin/test","-e","/etc/passwd"]initialDelaySeconds: 4periodSeconds: 2livenessProbe:exec:command: ["/usr/bin/test","-e","/etc/passwd"]initialDelaySeconds: 4periodSeconds: 2readinessProbe:httpGet:scheme: HTTPport: 8080path: /index.jspinitialDelaySeconds: 4periodSeconds: 2总结:
1、在一个yaml当中有多个探针,启动  存活 就绪都针对一个容器
2、启动探针的优先级是最高的,只有启动探针“成功”,后续的探针的才会执行
3、启动探针成功之后,后续除非重启pod,不会再触发启动探针了
4、在pod的生命周期当中,一直存在,一直探测的是存活探针和就绪探针
5、zaipod的生命周期当中,后续的条件是满足那个探针的条件,触发那个探针的条件
6、就绪探针,如果不影响容器运行,status:running,这个时候不会重启,但是容器退出的话,就绪探针也会重启的
容器启动和退出时的动作

postStart 容器启动钩子,容器启动之后触发的条件

preStop 容器退出钩子,容器退出之后触发的条件

apiVersion: v1
kind: Pod
metadata:name: nginx2
spec:containers:- name: nginx2image: centos:7command: ["/bin/bash","-c","sleep 3600"]volumeMounts:- name: test1mountPath: /optreadOnly: false
#声明容器内部的挂载目录,要给这个挂载卷取名字,不同的挂载卷的名字不能重复 
#readOnly: false 可读写lifecycle:postStart:exec:command: ["/bin/bash","-c","echo hello from start >> /opt/123.test ; sleep 10"]preStop:exec:command: ["/bin/bash","-c","ehco hello from stop >> /opt/123.txt"]volumes:- name: test1hostPath:path: /opt/testtype: DirectoryOrCreate
#声明的是node节点上和容器内的/opt的挂载目录
#挂载卷的名称和要挂载的容器内挂载卷名称要一一对应
#hostPath  指定和容器的挂载目录
#type: DirectoryOrCreate   如果节点上的目录不存在,自动创建该目录
#pod会经常被重启,销毁,一旦容器和node节点做了挂载卷,数据不会丢失启动和退出的作用
1、启动可以自定义配置容器的内的环境变量
2、通知机制,告诉用户容器启动完毕
3、退出时,可以执行自定义命令,删除或者生成一些必要的程序,自定义销毁方式以及容器的退出等待时间在这个pod的生命周期时间当中,把启动探针,存活探针和就绪探针加入到yaml文件当中apiVersion: v1
kind: Pod
metadata:labels:run: tomcat1name: tomcat1
spec:containers:- image: tomcat:8.0.52name: tomcat1volumeMounts:- name: test1mountPath: /optreadOnly: falselivenessProbe:exec:command: ["/usr/bin/test","-e","/etc/passwd"]initialDelaySeconds: 4periodSeconds: 2readinessProbe:httpGet:scheme: HTTPport: 8080path: /index.jspinitialDelaySeconds: 4periodSeconds: 2startupProbe:tcpSocket:port: 8080initialDelaySeconds: 4periodSeconds: 2lifecycle:postStart:exec:command: ["/bin/bash","-c","echo hello from start >> /opt/123.txt ; sleep 10"]preStop:exec:command: ["/bin/bash","-c","echo hello from stop >> /opt/123.txt"]volumes:- name: test1hostPath:path: /opt/xiaobutype: DirectoryOrCreate
模拟故障

删除存活探针检测/etc/passwd

没有检测到有把etc/passwd目录删除了,但是几秒时候就会重新拉取镜像

节点上查看

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

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

相关文章

【MySQL】索引基础

文章目录 1. 索引介绍2. 创建索引 create index…on…2.1 explain2.2 创建索引create index … on…2.3 删除索引 drop index … on 表名 3. 查看索引 show indexes in …4. 前缀索引4.1 确定最佳前缀长度&#xff1a;索引的选择性 5. 全文索引5.1 创建全文索引 create fulltex…

Docker-Compose部署Redis(v7.2)分片集群(含主从)

文章目录 一、前提准备1. 文件夹结构 二、配置文件1. redis.conf2. docker-compose文件 三、构建集群1. 自动分配主从关系2.1 构建3 master集群2.2 手动配置从节点 四、测试1. 集群结构2. 分片测试 环境 docker desktop for windows 4.23.0redis 7.2 目标 搭建如下图分片主从…

华为云服务器试用领取

系列文章目录 华为云服务器试用领取 领取的试用云服务器在哪 文章目录 系列文章目录介绍 介绍 我将会用该系列文章讲述如何在云服务器中安装大数据软件及其环境搭建。如有不足之处&#xff0c;还望指点。 本篇文章讲述的是华为云服务器的免费试用。 华为弹性云服务器 ECS 该云…

向日葵远程工具安装Mysql5.7的安装与配置

文章目录 一、向日葵远程工具安装二、Mysql5.7的安装与配置2.1解压2.2再把my.ini文件放入解压后的文件里面2.3.改变my.ini文件2.4.用管理员身份运行cmd&#xff0c;进入bin文件夹里&#xff0c;运行"mysqld install"命令&#xff0c;出现以下就说明成功了2.5.注册完s…

知识图谱之汽车实战案例综述与前瞻分析

知识图谱的前置介绍 什么是知识图谱 知识图谱本质(Knowledge Graph&#xff09;上是一种叫做语义网络(semantic network &#xff09; 的知识库&#xff0c;即具有有向图结构的一个知识库&#xff1b;图的结点代表实体&#xff08;entity&#xff09;或者概念&#xff08;con…

「斗破年番」5位斗宗大战,韩枫献海心焰晋斗宗,菩提涎争夺开战

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《斗破苍穹年番》第78期超前爆料&#xff0c;本期透露菩提化体涎的背后秘密。天鹰老人抢夺菩提化体涎后&#xff0c;迅速逃匿&#xff0c;却遭到了各路强者的围攻。然而&#xff0c;这位四星斗宗强者并非浪得虚名&#xff0c;他仅…

Spring之代理模式

1、概念 1.1 介绍 二十三种设计模式中的一种&#xff0c;属于结构型模式。它的作用就是通过提供一个代理类&#xff0c;让我们在调用目标方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中…

Redis 有序集合(sorted set) 命令

目录 1.Redis Zrevrank 命令 - 返回有序集合中指定成员的排名&#xff0c;有序集成员按分数值递减(从大到小)排序简介语法可用版本: > 2.2.0返回值: 如果成员是有序集 key 的成员&#xff0c;返回成员的排名。 如果成员不是有序集 key 的成员&#xff0c;返回 nil 。 示例 2…

2024阿里云优惠_阿里云活动中心

2024年阿里云优惠活动大全&#xff0c;包括阿里云服务器优惠活动清单、配置价格表、域名优惠活动、阿里云建站活动、阿里云优惠代金券免费领取、对象存储OSS活动、企业邮箱优惠、无影云电脑优惠、CDN特惠等等&#xff0c;阿里云百科aliyunbaike.com分享2024阿里云优惠活动大全_…

循环队列的队空队满情况

有题目&#xff1a; 循环队列放在一维数组A[0....M-1]中&#xff0c;end1指向队头元素&#xff0c;end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作&#xff0c;队列中最多能容纳M-1个元素。初始时为空。下列判断队空和队满的条件中&#xff0c;正确的是 …

用可视化案例讲Rust编程1. 怎么能学会Rust

用可视化案例讲Rust编程 1. 怎么能学会Rust 如果要列举Rust的优势&#xff0c;恐怕写个十条八条是写不完的&#xff0c;而且不管写哪条优势&#xff0c;都有很多同学跳起来反驳&#xff0c;比如我们说Rust比C/C内存安全&#xff0c;肯定有同学说C 20也支持内存安全&#xff0…

Java数组:一维数组、二维数组、Arrays

文章目录 1、一维数组1.1 数组概念1.2 数组的声明1.3 数组的静态初始化1.4 数组的动态初始化1.5 地址值1.6 数组元素访问1.7 索引1.8 数组的遍历1.9 数组两种初始化方式的区别 2、二维数组2.1 二维数组的声明2.2 二维数组的静态初始化2.3 二维数组的动态初始化2.4 二维数组的遍…