k8s之pod

1、pod:k8s中最小的资源管理组件,最小化运行容器化应用的资源管理对象

(1)pod是一个抽象的概念,可以理解为一个或者多个容器化应用的集合
(2)一个pod中运行一个容器是最常用的方式
(3)一个pod中同时运行多个容器,在一个pod中可以同时封装多个需要耦合的互相协作的容器,这些多个容器共享资源,互相协作组成一个service单位
(4)一个pod内的容器,必须都运行在一个node节点上,基于现代容器技术的要求,就是一个pod运行一个容器一个容器只运行一个进程
①横向扩展,方便扩缩容
②解耦,一个pod内运行多个容器耦合度太高,一旦一个进程失败,整个pod将全部失败,实现解耦,基于pod可以创建多个副本,实现高可用和负载均衡
③管理方便,简单直观
(5)不论运行一个或者多个容器,k8s管理的都是pod而不是容器

2、pod内的容器共享资源(共享机制)

(1)共享机制:pause底层基础容器来提供共享资源的机制
①pause是基础容器,也可以称为父容器,管理pod内容器的共享操作
②pause还可以管理容器的生命周期
(2)k8s提供了pause容器(pause的作用)
①为pod内的所有容器提供了统一的命名空间
②启动容器的pid命名空间(进程号),每个pod中,pause都作为pid为1的进程(init进程),可回收僵尸进程(pause作为所有容器进程的父进程,管理pod内部的容器进程)
③创建pod时,先创建pause容器,然后再拉取镜像生成容器,最后形成pod(pause来分配和回收容器的资源

(3)kubelet和pause

①kubelet管理node节点上的容器的生命周期,pause管理pod中的容器

(4)设置基础镜像pause的作用
①引入pause机制,代表整个容器组的状态,可以解决对pod内部容器整体状态的判断
②pod内的容器共享ip、volume挂载卷,解决了容器内网络通信的问题,解决了容器内部文件共享的问题
(5)pause容器共享两种资源

网络资源

• 每个pod都会被分配一个集群内部的唯一的IP地址,pod内部的容器共享网络,pod在集群内部的IP地址和端口。

• pod内部的容器可以使用localhost互相通信,pod中的容器与外部通信时,从共享的资源当中进行分配,宿主机的端口映射

存储资源

• pod可以指定多个共享的volume,pod内的容器共享这些volume

• volume可以实现数据的持久化

• 防止pod重新构建之后文件消失

3、总结

(1)每个pod都有一个基础容器,pause容器
(2)pause容器对应的镜像属于k8s集群的一部分,创建集群就会有pause这个基础镜像
(3)pod里面包含了一个或者多个相关的容器(应用)

4、pod的分类

自主式pod

此类pod不会自我修复,若pod内容器的进程终止或被删除、缺少资源被驱逐,这种pod没有办法自愈

控制器管理pod

能滚动升级、自愈(自动重启)、管理pod的数量以及pod的扩缩容

5、pod的生命周期(重点)

pod生命周期的状态:

pending

挂起,pod已被创建,尚未被分配到运行的node节点(原因:节点上资源不够、需要等待其他pod的调度)

running

运行中,pod已经被分配到了node节点,pod内部的所有容器都已经启动,运行状态正常,稳定

complete/

successded

容器内部的进程运行完毕,正常退出,没有发生错误

failed

pod中的容器非正常退出,发生了错误,需要通过查看详情和日志来定位问题

unknow

由于某些原因,k8s集群无法获取pod的状态,一般是APIserver出现问题

terminating

终止中,pod正在被删除,里面的容器正在终止,还要进行资源回收、垃圾清理、以及终止过程中需要执行的命令

crashloopbackoff

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

imagepullbackoff

正在重试拉取镜像(网络问题/镜像仓库挂了)

errimagepull

拉取镜像出错(网速太慢/镜像名称写错/镜像仓库挂了)

Evicte

pod被驱赶(node节点的资源不够部署pod,或者是资源不足,kubelet自动选择一个pod驱逐)

6、创建pod的容器分类

(1)基础容器:pause container
(2)init容器(初始化容器):init container(init容器运行完即被终止)
①前两个过程中,pod的状态是init:3/3,才会进入业务容器

init容器的作用

环境变量,可以在创建的过程中为业务容器定制好相关的代码和工具

 检测依赖环境

• init容器独立于业务容器,是单独构建的一个镜像,对业务容器不产生任何安全影响

• init容器能以不同于pod内业务容器的文件系统试图运行,secrets的权限,业务容器无法访问secrets的权限

总结:init容器提供了业务容器运行之前的先决条件,提供了一种阻塞或者延迟机制来控制业务容器的启动,只有前置条件满足,才会创建pod的业务容器

(3)业务容器:main container

7、pod容器创建的过程(实例)

(1)pod创建过程的总结

①在pod的启动过程中,容器按照:初始化容器先启动,每个容器必须在下一个容器启动之前成功退出
②如果运行失败,会按照容器的重启策略进行指定动作,restartPolicy(always、never、onfailure—非正常退出才会重启)
③所有的init容器没有成功之前,pod是不会进入ready状态的,init容器与service无关,不能对外提供访问
如果重启pod,所有的init容器一定会重新执行
⑤如果修改init容器的spec(参数),只限制于image,其他的修改字段都不生效(基于deployment)
⑥每个容器的名称都要唯一,不能重复

8、k8s的pod的重启策略(基于容器的状态,针对pod内的所有容器)

(1)三种重启策略(docker的重启策略和pod的重启策略的对比

k8s的pod的重启策略(重)

Always

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

On Failure

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

Never

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

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

docker的重启策略(重)

Never

docker的默认策略

On-failure

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

unless-stopped

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

always

只要容器退出就会重启

单机部署;docker

集群化部署容器:k8s(至少3个节点)

(2)On Failure策略
①状态码正常

②状态码不正常

9、总结

(1)pause容器:底层容器/基础容器
①pause提供pod内容器的网络和存储共享,以及pod内容器退出之后的资源回收
(2)init容器:人为设定的,业务容器启动之前的必要条件
(3)pod的生命周期
①第一步:起pause基础容器
②第二步:init容器全部成功退出,才起业务容器
③poststart、prestop:容器的钩子
④探针:探测容器的健康状态,伴随pod的整个生命周期(除了启动探针)
(4)pod就是用来封装容器的,业务是容器,服务也是容器,端口也是容器

10、yaml文件快速生成(生成特定的模版)

(1)生成deployment的模版:kubectl create deployment nginx1 --image=nginx:1.22 --replicas=3 --dry-run=client -o yaml > /opt/test1.yaml

--dry-run=client

只是调用api的对象不执行命令

(2)生成pod的模版:kubectl run nginx1 --image=nginx:1.22 --dry-run=client -o yaml > /opt/test1-pod.yaml

(3)生成service的模版:kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort --dry-run=client -o yaml > /opt/test1-service.yaml

11、pod内的容器使用节点资源的限制

(1)request:需要的资源
(2)limit:最高能占用系统多少资源(限制)
①生产中设置limit,需要多少,最多也只能占用多少
(3)k8s中pod的资源限制(两个限制):CPU、内存

创建pod时,一定要给容器设置资源限制

CPU限制:

CPU的限制格式:1、2、0.5、0.2、0.3(要么是整数,要么是小数点后只能跟一位)

①单位:m(millicores)来表示CPU,CPU的时间分片原理

②CPU时间分片:通过周期性的轮流分配CPU时间给各个进程,多个进程可以在CPU上交替执行,在k8s中就是表示占用CPU的比率

1000m:表示一个CPU

④100m就是最小单位:0.1

1

可占用1个CPU

0.5

可占用半个CPU

0.2

可占用一个CPU的五分之一

0.1

是最小单位

内存限制:单位Ki、Mi、Gi、Ti

(4)实例

(5)问题:centos7默认没有持久化命令,默认运行一次即退出,要加command

(6)测试

12、镜像的拉取策略

IfNotPresent

默认策略,如果本地镜像已经存在,就不再拉取,本地没有才回去镜像仓库拉取——适用于外部部署,事前要把docker的镜像导入到目标主机

Always

不论镜像是否存在,创建时(重启)都会重新拉取镜像——一般不用

Never

仅仅使用本地镜像,本地没有也不会主动拉取——适用于本地部署

(1)设置镜像拉取策略

13、pod的容器健康检查(探针probe—重点

(1)探针:k8s对容器执行的定期检查、诊断,探针将伴随整个容器的生命周期
(2)探针的三种规则(三种方式)

①存活探针(livenessProbe):探测容器是否正常运行

• 如果发现探测失败会杀掉容器,容器会根据重启策略来决定是否重启,不是杀掉pod

检测失败后,会杀死容器,然后重启

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

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

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

• 只是在容器的启动后开始检测,容器内的应用是否启动成功。在启动探测成功之间,所有的其他探针都会处于禁用状态,但是一旦启动探针结束,后续的操作不再受启动探针的影响。在一个容器当中可以有一个或者多个探针。

所有探针策略,伴随整个pod的生命周期,除了启动探针

(3)probe的检测方法

probe的检测方法(适用于上述三种探针)

exec

在容器内部执行命令,如果命令的返回码是0,表示成功

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

httpGet

对外部容器发起了一次get请求,可以添加path,指定访问的资源,返回码在200<=x<400之间(200<=x<400),都表示成功

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

tcpSocket

端口,对指定端口上的容器的IP地址进行tcp检查(三次握手)

相当于telnet,检测指定容器的监听端口是否打开,能否和指定的容器监听端口进行通信,端口打开就认为探测成功

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

诊断结果

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

失败,存活探针会重启

未知状态,诊断失败

(4)exec检测(以存活探针为例)

①检测正常

②检测不正常
删除文件:kubectl exec -it centos-6d4764b9df-mpzmf -- rm -rf /opt/1.txt

(4 )以存活探针为例:检测失败后,会杀死容器,然后重启
①exec检测
• 检测正常

• 检测不正常
删除文件:kubectl exec -it centos-6d4764b9df-mpzmf -- rm -rf /opt/1.txt

②httpGet检测(以存活探针为例)
• 检测正常

• 检测不正常

• 指定path,指定访问的资源
不正常的状态:

正常的状态:

③tcpSocket检测(以存活探针为例)
• 正常状态

• 不正常状态

5就绪探针(readinessProbe)
①exec检测
• 正常状态

• 不正常状态:kubectl exec -it nginx1 -- rm -rf /etc/passwd

②httpGet检测
• 正常状态

• 不正常状态:

③tcpSocket检测
• 正常状态

• 不正常状态:

(6)启动探针:startupProbe

①启动探针:如果探测失败,pod的状态是not ready,启动探针探测容器失败会重启容器

(7)三种方式结合
①启动探针探测失败

测试:删除/etc/passwd:kubectl exec -it nginx1 -- rm -rf /etc/passwd
启动探针如果没有成功之前,后续的探针都不会执行

②启动探针探测成功

测试:删除/etc/passwd文件:kubectl exec -it nginx2 -- rm -rf /etc/passwd

启动探针成功之后,在pod的生命周期内不会再检测启动探针
重启了pod之后,相当于重新部署了一个初始版的新的容器
测试:删除index.jsp

(8)总结
①在一个yaml文件中可以有多个探针(启动、存活、就绪都针对一个容器)
②启动探针的优先级最高,只有启动探针“成功”,后续的探针才会执行
③启动探针成功之后,后续除非重启pod,否则不会再触发启动探针
④在pod的生命周期当中,一直存在,一致探测的是存活探针和就绪探针
⑤在pod的生命周期当中,后续的条件是满足哪个探针的条件,触发哪个探诊的条件
⑥就绪探针,如果不影响容器运行,status:running,这个时候不会重启,但是,容器退出的话,就绪探针也会重启

14、容器启动和退出时的动作:postStart、preStop

postStart

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

preStop

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

启动和退回动作的作用:

①启动可以自定义配置容器内的环境变量

②通知机制,告诉用户容器启动完毕

③退出时,可以执行自定义命令,删除或者生成一些必要的程序,自定义销毁方式、自定义资源回收的方式以及容器的退出等待时间

(1)实例

①退出容器

15、在k8s中都是重启pod,pod为什么会重启

(1)always:默认策略。当pod内的容器退出,不论是一个还是两个容器退出,整个pod都会重启
(2)never:当pod内的容器退出时,不论退出几个,pod都不重启
(3)onfailure:当pod内的容器退出时,状态码是0,整个pod都不会重启,只有一个或者n个容器是非正常退出(状态码非0),整个pod才会重启
(4)k8s的核心:集群化管理容器,k8s管理的对象是封装容器的pod

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

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

相关文章

2020年认证杯SPSSPRO杯数学建模A题(第二阶段)听音辨位全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 A题 听音辨位 原题再现&#xff1a; 把若干 (⩾ 1) 支同样型号的麦克风固定安装在一个刚性的枝形架子上 (架子下面带万向轮&#xff0c;在平地上可以被水平推动或旋转&#xff0c;但不会歪斜)&#xff0c;这样的设备称为一个麦克风树。不同的麦…

郑州大学算法设计与分析实验2

判断题 1 #include<bits/stdc.h> using namespace std;const int N 50; int f[N], n;int main() { // freopen("1.in", "r", stdin);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n;f[1] 1; f[2] 1;for(int i 3; i &l…

HttpRunner的测试用例分层机制

测试用例分层介绍&#xff1a; 在接口自动化测试维护过程中&#xff0c;由于测试用例的增加和需求变更导致测试用例的调整&#xff0c;使自动化测试用例的维护非常麻烦&#xff0c;直接关系到自动化测试能否持续有效地在项目中开展。 概括来说&#xff0c;测试用例分层机制的核…

数据库选择题 (期末复习)

数据库第一章 概论简答题 数据库第二章 关系数据库简答题 数据库第三章 SQL简答题 数据库第四第五章 安全性和完整性简答题 数据库第七章 数据库设计简答题 数据库第九章 查询处理和优化简答题 数据库第十第十一章 恢复和并发简答题 2015期末 1、在数据库中&#xff0c;下列说…

PHP运行环境之宝塔软件安装及Web站点部署流程

PHP运行环境之宝塔软件安装及Web站点部署流程 1.1安装宝塔软件 官网&#xff1a;https://www.bt.cn/new/index.html 自行注册账号&#xff0c;稍后有用 下载安装页面&#xff1a;宝塔面板下载&#xff0c;免费全能的服务器运维软件 1.1.1Linux 安装 如图所示&#xff0c;宝…

Redis - 挖矿病毒 db0 库 backup 反复出现解决方案

问题描述 腾讯云的服务器&#xff0c;使用 Docker 部署了 Redis 之后&#xff0c;发现 DB0 中总是出现 4 条 key&#xff0c;分别是 backup01backup02backup03backup04 而自己每次存入 db0 中的数据过一会就会被无缘无故删除掉。 原因分析 挖矿病毒 解决方案 在启动的时候…

外包干了1个月,技术退步一大半。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

软件工程:数据流图相关知识和多实例分析

目录 一、数据流图相关知识 1. 基本介绍 2. 常用符号 3. 附加符号 二、数据流图实例分析 1. 活期存取款业务处理系统 2. 工资计算系统 3. 商业自动化系统 4. 学校人事管理系统 5. 教材征订系统 6. 高考录取统分子系统 7. 订货系统 8. 培训中心管理系统 9. 考务处…

win10提示“KBDSF.DLL文件缺失”,游戏或软件无法启动运行,快速修复方法

很多用户在日常使用电脑的时候&#xff0c;或多或少都遇到过&#xff0c;在启动游戏或软件的时候&#xff0c;Windows桌面会弹出错误提示框“KBDSF.DLL文件缺失&#xff0c;造成软件无法启动或运行&#xff0c;请尝试重新安装解决”。 首先&#xff0c;先来了解DLL文件是什么&a…

前台收款单选择的保险公司 提示 往来户不属于该财务组织

前台收款单选择的保险公司 提示 往来户不属于该财务组织 问题避免 新增保险公司的时候&#xff0c;找一个已经存在的保险公司&#xff0c;利用多页签复制的方式来新增 保险公司 不然不能够自动生成 财务客户

Docker学习与应用(六)-Docker网络

1、Docker网络 Docker有多种网络模式可以选择&#xff0c;可以根据应用场景和需求选择合适的网络模式。 桥接模式&#xff08;Bridge Mode&#xff09;&#xff1a;默认情况下&#xff0c;Docker使用桥接模式创建一个虚拟网络&#xff0c;所有容器会连接到这个虚拟网络中。每个…

Qt qDebug基本的使用方法详解

目录 qDebug基本用法输出字符串输出变量值1输出变量值2支持流式输出输出十六进制去除双引号和空格调试输出级别 自定义类型输出自定义日志信息的输出格式示例占位符设置环境变量 关闭QDebug输出Qt工程VS工程 在VS工程中如何查看qDebug输出 DebugView下载 qDebug基本用法 qDebug…

在 sealos 上使用 redisinsight 完美管理 redis

先起一个 redis 集群&#xff0c;在 sealos 上可以点点鼠标就搞定&#xff1a; 简单两步&#xff0c;redis 集群搞定。 再启动 RedisInsight, 是一个 redis 的可视化管理工具。 就可以看到部署后的地址了。进去之后填写 redis 的链接信息即可&#xff1a; 链接信息在数据库的…

查询json数组

步骤一&#xff1a;创建表格 首先&#xff0c;我们需要创建一个表格来存储包含JSON对象数组的数据。可以使用以下代码创建一个名为 my_table 的表格&#xff1a; CREATE TABLE my_table (id INT PRIMARY KEY AUTO_INCREMENT,json_data JSON ); 上述代码创建了一个包含两个列的…

前端文件上传组件最全封装+删除+下载+预览

前言&#xff1a;使用的是若依的框架element uivue2封装的。如果有不对的地方欢迎指出。后台管理使用&#xff0c;文件需要上传。回显列表&#xff0c;详情也需要回显预览 // 开始封装组件&#xff1a;封装在 src/components/FileUpload/index.vue中 <template><div c…

微服务实战系列之API加密

前言 随着一阵阵凛冽寒风的呼啸&#xff0c;新的年轮不知不觉滚滚而来。故事随着2023的远去&#xff0c;尘封于案底&#xff1b;希望迎着新年&#xff0c;绽放于枝头。在2024新岁启航&#xff0c;扬帆破浪之时&#xff0c;让烦恼抛洒于九霄&#xff0c;让生机蓬勃于朝朝暮暮。 …

企业一线员工定岗定编全解析

引言&#xff1a;在生产制造企业中&#xff0c;由于一线员工工作内容单一&#xff0c;与产量线性关系明显&#xff0c;因此针对一线员工的定编方法最简单有效的就是通过数据计算的方式。人力资源专家——华恒智信根据多年以来对生产制造企业定岗定编的关注与研究得出的经验&…

ResNet论文阅读和简单实现

论文&#xff1a;https://arxiv.org/pdf/1512.03385.pdf Deep Residual Learning for Image Recognition 本模块主要是阅读论文&#xff0c;会做简单的翻译&#xff08;至少满足我自己能看明白&#xff09;。 Introduction 由上图可见&#xff0c;在20层和56层的网络上训练的…

ElasticSearch的DSL查询语法解析

Elasticsearch提供了基于ISON的DSL (Domain Specific Lanquage)来定义查询。 目录 一、常见查询类型 二、DSLQuery基本语法 三、全文检索查询 3.1 match查询&#xff1a;会对用户输入内容分词&#xff0c;常用于搜索框搜索 &#xff0c;语法&#xff1a; 3.2 multi match…

C#编程-实现继承

C#允许您通过扩展现有类的功能以创建新类来实现继承。 从基类创建派生类 使用以下语法在C#中创建派生类: class <derived_class>:<base_class>{...}确定继承的层次结构 要确定继承层次结构,必须检查派生类与基类之间的关系种类。确保派生类是一种基类。 请考虑以…