当前位置: 首页 > news >正文

pod 基础 2

pod 进阶

探针

poststart

prestop

pod的生命周期开始:

重启:k8s的pod重启策略

deployment的yaml文件只能是Always pod的yaml三种模式都可以。

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

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

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

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

docker的重启策略:

面试题:k8s和docker重启策略有什么不同

docker的默认策略是never。

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

always:只要容器退出都会重启

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

单机部署:就使用docker足够了,

集群化部署:k8s

yaml文件快速生成:

基于模板来改。

基于deployment来创建

--dry-run=client -o yaml >:只是调用方法对象,不是执行命令,不会创建到集群中。

指定输出到opt

基于pod来创建

基于service创建

pod的状态:

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

imagepullbackoff:正在重试拉取镜像

errimagepull:拉取镜像出错(1,网速太慢。 2,镜像名称写错了。 3,镜像仓库挂了)

Evicte:POD被驱赶(node节点资源不够部署pod,或者是资源不足,kubelet自动选择一个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:最小占用需要的资源

2,limit:最高能占用需要多少资源

limit:需要多少,最多也只能占用这么多

对容器的两个资源限制:

cpu:

cpu限制的格式:

1,数字加小数点

1 2 0.5 0.2 可以占用几个cpu,最小是0.1单位

要么是整数,要么就是小数点后只能跟一位

2,m来表示cpu

cpu时间分片原理:

cpu时间分片:提供周期性的轮流分配cpu时间给各个进程,多个进程可以在cpu上交替执行。

在k8s中就是表示占用cpu的比率:

m:millicores 单位

1000m 500m 2000m 100m就是最小单位

1000m就是一个cpu

内存:

Ki

Mi(常见)

Gi(常见)

Ti

实验:

做限制条件。

kubectl apply -f test.yaml

进入容器:

kubectl exec -it centos-847ddb86c-ks44p bash

安装epel源

yum -y install epel-release

安装压力测试工具:

yum -y install stress

模拟压力测试:

超过直接杀进程

request 可以不设置,生产中一般不设置,只要不超过,用多少给多少

在master节点直接查看

kubectl describe nodes node02

在创建pod时,一定要给容器做限制。

k8s中怎么设置拉取镜像的策略:

默认策略:(默认策略即可)ifNotPresent

ifNotPresent:如果本地镜像有,就不在拉取,本地没有才会去镜像仓库拉取。

Always:不论镜像是否存在,创建时(重启)都会拉取镜像

Never:仅仅使用本地镜像。本地没有也不会拉取

都是本地部署,Never

如果涉及到外部部署,默认策略(事前要把docker的镜像导入到目标主机)

Always:不用

默认就是ifNotPresent,可以不加。

设置为Never

(本地有没有都不拉)不拉:

设置为:Always

本地有还是拉取

pod内容器的健康检查:

探针:

probe

k8s对容器执行的定期诊断。

探针有三种规则:

1,存活探针:livenessProbe 探测容器是否正常运行,如果发现探测失败,会杀容器,容器会根据重启策略来决定是否重启,不是杀掉pod

2,就绪探针:探测容器是否进入ready状态,并做好接受请求的准备。

探测失败 READY 0/1 没有进入ready状态。service会把这个资源对象的端点从ENDPOINTS中剔除。service也不会把请求转发到这个pod

3,启动探针

只是在容器的启动后开始检测,容器内的应用是否启动成功。在启动探测成功之前,所有的其他探针都会处于禁用状态。

但是,一旦启动探针结束,后续的操作不再受探针影响。

在一个容器当中可以有多个探针。

启动探针:只在容器启动时探测

存活探针:

就绪探针:

livenessprobe的检查方法:

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

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

相当于执行了一条命令行命令

2,httpGet:对指定ip+端口的容器发送一个httpget的请求。响应状态码大于或者等于200,小于400都是成功。

200

相当于发放http请求

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

3,tcpSocket:端口,对指定端口上的容器的IP地址进行的tcp检查(三次握手),端口打开认为 探测成功。检查特点容器的打开济安泰状态。

就是检查端口

检查结果:

1:成功容器提供,正常运行

2:失败存活探针会重启

3:未知结果

实验:

1,exec探针

initialDelaySeconds: 3

#表示容器启动之后多少秒来进行探测,时间不要设置的太短,可能导致无效探测

periodSeconds: 2

#表示探针探测的间隔时间。每隔多少秒进行一次检查。应用的延迟敏感度。这个应用非常重要,是核心组件。

failureThreshold: 2

#表示如果探测失败,失败几次之后,把容器标记为不健康。

successThreshold: 1

#只要成功一次就标记为就绪,健康,

timeoutSeconds: 1

#表示每次探测的超时时间,在多少秒内必须完成探测。

间隔的时间一定要比检测时间长。

前三个面试时要说出来。

成功次数可以不加,默认1次就成功,失败默认是3次

kubectl apply -f test.yaml

进入容器删除

kubectl exec -it centos-797bc57596-ghkvm -- rm -rf /opt/123.txt

探针检测不健康

在创建回去

kubectl exec -it centos-797bc57596-ghkvm -- touch /opt/123.txt

探测健康

liveness杀死容器重启。所有的探针策略伴随整个pod的生命周期。除了启动探针

2,httpGET

scheme:HTTP

协议是http

port: 80 端口为80

成功:

把80换成81,检测3次失败,就重启容器。

加上path:/index.html

加路径,检测访问资源是否存在。

kubectl describe pod nginx1

404 3次失败杀掉容器,继续重启

一直重启

改成对的

成功

3,tcpSocket 查看端口服务的监听状态

通过三次握手检测端口

改端口:

检测失败

总结:

探针的三个方法:

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

探针将伴随整个生命周期

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

shell命令执行成功:

返回码:0表示成功。

成功一次结束探测成功

httpGet:对web容器发起一次get请求,可以添加path,指定访问的资源。返回码大于等于200,小于400的范围之内都算成功

tcpSocket:相当于telnet,指定的容器济安泰端口是否打开。是否能和指定的容器监听

相关文章:

  • 惠普83752A合成扫频器/信号源0.01-20GHz
  • imgaug库指南(四):从入门到精通的【图像增强】之旅
  • flutter学习-day22-使用GestureDetector识别手势事件
  • 使用react+vite开发项目时候,部署上线后刷新页面无法访问解决办法
  • 【响应式编程-03】Lambda表达式底层实现原理
  • 【INTEL(ALTERA)】Intel Agilex7 设备的外设图像比特流大小是多少?
  • Kafka集群详解
  • 电缆厂 3D 可视化管控系统 | 图扑数字孪生
  • 【React系列】受控非受控组件
  • 接口功能测试策略
  • 2024年全球网络安全预测报告
  • DBeaver配置类Navicat显示字段是否非空
  • MySQL模糊查询详解
  • 基于帝国主义竞争算法优化的Elman神经网络数据预测 - 附代码
  • 51单片机之按键和数码管
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • .pyc 想到的一些问题
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • CSS3 变换
  • ES6系统学习----从Apollo Client看解构赋值
  • exports和module.exports
  • extjs4学习之配置
  • Fastjson的基本使用方法大全
  • gitlab-ci配置详解(一)
  • IDEA 插件开发入门教程
  • MySQL数据库运维之数据恢复
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Redis在Web项目中的应用与实践
  • SQL 难点解决:记录的引用
  • Vue 动态创建 component
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Web标准制定过程
  • zookeeper系列(七)实战分布式命名服务
  • 从零开始学习部署
  • 大快搜索数据爬虫技术实例安装教学篇
  • 前端攻城师
  • 区块链分支循环
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 微信小程序:实现悬浮返回和分享按钮
  • 云大使推广中的常见热门问题
  • 06-01 点餐小程序前台界面搭建
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • raise 与 raise ... from 的区别
  • 整理一些计算机基础知识!
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $forceUpdate()函数
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (二)学习JVM —— 垃圾回收机制
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (强烈推荐)移动端音视频从零到上手(下)
  • (全注解开发)学习Spring-MVC的第三天
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战