k8s---Pod的生命周期

Pod是什么?

pod是k8s中最小的资源管理组件。

pod也是最小化运行容器化应用的资源管理对象。

pod是一个抽象的概念,可以理解为一个或者多个容器化应用的集合

在一个pod当中运行一个容器是最常用的方式

在一个pod当中可以同时运行多个容器,一个pod当中可以同时封装几个需要耦合的互相协作的容器。这些容器是共享资源的,也可以互相协作组成一个service单位。

不论运行一个容器还是多个容器,k8s管理的都是pod而不是容器。

一个pod内的多个容器必须都运行在同一个node节点上

基于现代容器技术的要求。最常用的就是1个pod运行1个容器,1个容器只运行一个进程目的是为了横向扩展方便扩缩容和解耦这样管理方便,简单直观。

1个pod内运行多个容器,耦合度太高。一旦一个进程失败,整个pod将全部失败。实现解耦,基于pod可以创建多个副本,实现高可用和负载均衡

pause容器

pod内的容器共享资源。

共享机制:pause底层基础容器来提供共享资源的机制。

pause是基础容器,也可以称为父容器。管理pod内容器的共享操作。

pause还可以管理容器的生命周期。

k8s提供了pause容器两大核心功能:

  1. 为pod内的所有容器提供一个的命名空间。只有都在同一个命名空间内才可以共享资源。

  2. 启动容器的pid(进程号)命名空间,每个pod中都作为pid为1的进程(init进程),回收僵尸进程。

  3. 当创建pod时会先创建1个pause容器,然后再拉取镜像生成容器

    pause会在每个pod中创建一个pid为1的进程来管理pod中的进程。包括回收僵尸进程。

kubelet管理node节点

pause管理pod内的容器

1、 master节点发出指令,pod使用的镜像nginx,pod的副本数

2、 kube-scheduler来分配执行的node节点

3、 node节点的kubelet收到master指令,先拉pause再拉nginx镜像

4、 pause容器先启动,提供命名空间,进程管理pid1。来为pod内的容器提供共享服务以及容器的进程管理。

pause容器共享两种资源:网络资源、存储资源

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

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

pod可以指定多个共享的volume。pod内的容器共享这些vloume。volume可以实现数据的持久化。可以防止pod重新构建后文件丢失。

总结

每个pod都有1个pause基础容器

pause容器对应的镜像属于k8s集群的一部分。创建集群就会有pause这个基础镜像。

pod里面包含了一个或者多个相关的容器(应用)

pod外设置一个基础镜像:

1、 pod内部有一组容器挂了一个,就算pod失效了吗?

引入pause禁止,代表整个容器的组状态。可以解决对pod内部容器整体状态的判断

2、 pod内容器共享IP共享volume挂在卷,解决了容器内网络通信的问题。解决了容器内文件共享的问题。

pod的分类

自主式pod:这个pod不会自我修复。如果pod内容器的进程终止或者被删除或者缺少资源被驱逐。这个pod没有办法自愈。

只要不是基于deployment、daemanset资源控制器创建的都是自主式pod

控制器管理pod:滚动升级,可以自愈(可以自动重启)可以管理pod的数量,以及pod的扩缩容

pod的生命周期状态

1、 pending---挂起:表示pod已被创建,但是尚未被分配到运行的node节点。

可能有几种情况导致:

  1. 节点上资源不够

  2. 需要等待其他pod的调度等

2、 running---运行中:pod已经被分配到了node节点。pod内部的所有容器都已经启动。运行状态良好正常稳定。

3、 complete/successded:表示容器内部的进程运行完毕后正常退出。没有发生错误。

4、 faild:表示pod中的容器非正常退出。发生了错误。需要通过查看详情和日志来定位问题。

5、 UNknown:表示由于某些原因,k8s集群无法获取pod的状态。一般是APIserver出现问题

6、 terminating:表示终止中。表示pod正在被删除,内部容器正在终止。终止过程中涉及到资源回收,垃圾清理以及终止过程中需要执行的命令。所以需要时间终止。

Pod生命周期图:

1、 先有pause基础容器才会创建初始化init容器

2、 初始化容器运行完毕而且是成功运行完毕后才会创建pod的主业务容器

在容器的生命周期中还伴随着2个容器钩子:

3、 容器钩子:

poststart:表示容器运行时执行的第一个命令

prestop:容器结束时执行的最后一个命令

容器生命周期中还有2个探针:

探针:用于检测容器状态是否正常。

livenessProbe:存活探针

readinessProbe:流量探针

启动探针

存活探针和流量探针会伴随整个pod的生命周期

会不停的检测内部主业务容器的情况。只要主业务容器出现问题,整个pod将不再式ready状态。

但是启动探针除外

创建pod的容器分类

1、 基础容器:pause

2、 init容器(初始化容器):init c

3、 业务容器

先启动pause基础容器 > init初始化容器 > pod业务主容器

在pause基础容器和init初始化容器的过程中。pod状态:init 1/3---2/3---3/3

当所有init初始化都启动完毕才会创建业务容器

实验验证:

vim init.yamlapiVersion: v1
kind: Pod
metadata:name: nginx-init
spec:containers:- name: nginx1image: nginx:1.22
#定义的业务容器initContainers:- name: init-centos1image: centos:7command: ["echo", "hello,world"]- name: init-contos2image: centos:7command: ["echo", "I am ready"]
#这里定义业务容器和两个init初始化容器
#会先创建完pause初始化容器后
#才会先执行init-centos1输出hello,world。
#再执行init-centos2输出I am ready
#最后才会拉起nginx容器

init容器的作用

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

2、 init容器独立于业务容器。是单独构建的镜像。对业务容器不产生任何安全影响。

3、 init容器能以不同于pod内应用容器的文件系统视图运行,secrets的权限。应用容器无法访问secerts的权限。

总结

init容器提供了应用容器运行之前的先决条件,提供了一种阻塞或者延迟机制来控制应用容器的启动。只有前置条件满足,才会创建pod内的应用容器。属于k8s的一种机制。

1、 在pod的启动过程中,容器时按照初始化容器先启动,每个容器都必须在下一个容器启动之前成功退出

2、 如果运行失败会按照容器的重启策略进行指定动作。restartPolicy:Always/Never/onFailure(非正常退出才会重启)

3、 所有的init容器没有成功之前,pod是不会进入ready状态的。

init容器与service无关,不能对外提供访问,也不会在service暴露端口。

4、 如果重启pod,所有init容器一定会重新执行。

5、 如果修改init容器的spec(参数)只限制于image。修改的修改字段都不生效。前提基于deployment

6、 每个容器的名称都要唯一且不能重复。

pod的重启策略

实验举例:

apiVersion: v1
kind: Pod
metadata:name: centos
spec:restartPolicy: OnFailure
#k8s中pod的重启策略,基于容器的状态进行pod的重启
#Always:总是重启。只要容器退出,无论容器的状态码是正常还是不正常。默认策略可以不加
#Never:永不重启。只要容器退出,无论容器是否正常都不重启
#OnFailure:只有容器的状态码非0时候才会重启。正常退出不会重启。
#一般情况下都使用默认Always,只有特殊情况下会使用Never
#在deployment的yaml文件当中,重启的策略只能是Always也是默认策略。所以可以不加。containers:- name: centosimage: centos:7command: ["echo", "I am ready"]

在deployment的yaml文件当中,重启的策略只能是Always也是默认策略。所以可以不加

实验举例:

apiVersion: apps/v1
kind: Deployment
metadata:name: centos2labels:zyg: test
spec:replicas: 1selector:matchLabels:zyg: testtemplate:metadata:labels:zyg: testspec:restartPolicy: Nevercontainers:- name: centos2image: centos:7command: ["echo", "123"]

总结

pause容器:是底层容器/基础容器。提供pod内容器的网络和存储共享以及pod内容器退出之后的资源回收。

init容器:不是不一定要存在的。是人为设定的。是业务容器启动之前的必要条件。

pod的生命周期

  1. pause基础容器

  2. init容器-----全部成功退出----才会到主业务容器

  3. 容器钩子:poststart启动时第一条命令、prestop推出时第一条命令

  4. 探针:探测容器的健康状态,伴随pod的整个生命周期。除了启动探针。

总的来说:

pod就是用来封装容器的。业务时容器,服务也是容器,端口也是容器。

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

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

相关文章

【数据结构】二叉树的创建和遍历:前序遍历,中序遍历,后序遍历,层次遍历

目录 一、二叉树的定义 1、二叉树的定义 2、二叉树的五种形态 二叉树的子树 : 3、满二叉树与完全二叉树 4、二叉树的性质 5、二叉树的存储结构 1、顺序存储 ​编辑 2、链式存储 二、二叉树的遍历 按照前序序列构建二叉树 1、前 (先) 序遍历(Preorder …

神经网络:激活函数的介绍

神经网络的激活函数是一种非线性函数,它被应用于每个神经元的输出,以引入非线性性质到网络中。 激活函数的目的是将输入转换为输出,并且将输出限制在特定的范围内。它们非常重要,因为线性变换(例如加法和乘法&#xf…

【UEFI基础】EDK网络框架(环境配置)

环境配置 为了能够让使用测试BIOS的QEMU与主机(就是指普通的Windows系统,我们使用它来编译BIOS和启动QEMU虚拟机)通过网络连接,需要额外的配置。 首先是下载和安装OpenVPN(这里安装的是OpenVPN-2.5.5-I601-amd64.msi…

重新认识一下 vue3 应用实例

重新认识一下 vue 应用实例 💕 创建应用实例 每个 Vue 应用都是通过 createApp 函数创建一个新的 应用实例 应用实例必须在调用了 .mount() 方法后才会渲染出来。该方法接收一个“容器”参数,可以是一个实际的 DOM 元素或是一个 CSS 选择器字符串 //…

【GoLang入门教程】Go语言几种标准库介绍(四)

编程语言的未来? 文章目录 编程语言的未来?前言几种库fmt库 (格式化操作)关键函数:示例 Go库标准库第三方库示例 html库(HTML 转义及模板系统)主要功能:示例 总结专栏集锦写在最后 前言 上一篇,我们介绍了debug、enco…

魔术表演Scratch-第14届蓝桥杯Scratch省赛真题第1题

1.魔术表演(20分) 评判标准: 4分:满足"具体要求"中的1); 8分:满足"具体要求"中的2); 8分,满足"具体要求"中的3&#xff09…

GPU的硬件架构

SM: streaming Multiprocessor 流多处理器 sm里面有多个(sp)cuda core 32个线程称为一个warp,一个warp是一个基本执行单元 抽象概念:grid 网格 block 块 thread 线程 块中的线程大小是有讲究的,关乎到资源的调度,一般是128&#x…

关于“Python”的核心知识点整理大全59

目录 19.3.2 将数据关联到用户 1. 修改模型Topic models.py 2. 确定当前有哪些用户 3. 迁移数据库 注意 19.3.3 只允许用户访问自己的主题 views.py 19.3.4 保护用户的主题 views.py views.py 19.3.6 将新主题关联到当前用户 views.py 往期快速传送门&#x1f44…

是否还在 Docker 中跑 MySQL?

容器的定义:容器是为了解决“在切换运行环境时,如何保证软件能够正常运行”这一问题。 目前,容器和 Docker 依旧是技术领域最热门的词语,无状态的服务容器化已经是大势所趋,同时也带来了一个热点问题被大家所争论不以…

[DevOps-02] Code编码阶段工具

一、简要说明 在code阶段,我们需要将不同版本的代码存储到一个仓库中,常见的版本控制工具就是SVN或者Git,这里我们采用Git作为版本控制工具,GitLab作为远程仓库。 Git安装安装GitLab配置GitLab登录账户二、Git安装 Git官网 Githttps://git-scm.com/

卫星互联网与MEC融合方案研究

卫星互联网与MEC融合方案研究 作者:温特、王立中、司鹏、颜明明、马恬、郭伊蒙 中国卫通集团股份有限公司 本文首发:第十九届卫星通信学术年会 摘 要:在卫星互联网中引入移动边缘计算(MEC)技术可有效提高用户体验质量,降低运营成…

jQuery文件下载方法及引入HTML语法

jQuery下载 去jQuery网站下载文件包,点击主页的“Download”之后,进入下载页面,可以选择production版本的进行下载,但是点击进去之后,浏览器并不会直接下载相关的文件,而是跳转到一个“密密麻麻”都是jQue…

15.bash shell中自定义命令行选项与getopt/getopts

文章目录 linux shell 命令行选项1.命令行选项的手动实现简单选项分离命令行参数和选项带值的选项合并选项 2.使用 getopt 命令getopts命令选项标准化 欢迎访问个人网络日志🌹🌹知行空间🌹🌹 linux shell 命令行选项 选项是跟在单…

MySQL基础篇(一)SQL

视频地址: 黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括 SQL,全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一 标准。 一、SQL通用语…

整数的阶乘(英语:factorial)是所有小于及等于

整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,0的阶乘为1。即:n!123...n。 实例 #!/usr/bin/python3 # Filename : test.py # author by : www.dida100.com # 通过用户输入数字计算阶乘 # 获…

electron自定义菜单

创建menu.js const { app, Menu } require("electron"); const createMenu () > {const menu [{label: "菜单",submenu: [{label: "新增",click: () > {},}, ],},{label: "关于",submenu: [{label: "新增",click:…

Java数据结构:1. 数据结构前置知识

文章目录 一、初识数据结构二、初识集合框架1. 什么是集合框架2. 集合框架的重要性3. 背后所涉及的数据结构以及算法 三、时间复杂度空间复杂度1. 算法效率2. 时间复杂度(1)概念(2)大O的渐进表示法(3)推导大…

MySQL5.7用于控制副本服务器的 SQL 语句

官网地址:MySQL :: MySQL 5.7 Reference Manual :: 13.4.2 SQL Statements for Controlling Replica Servers 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. MySQL 5.7 参考手册 / ... / CHANGE M…

C语言多线程编程-线程间通信

介绍 在C语言中,采用多线程编程,我们经常会遇到,线程之前需要同步数据,或者一个线程处理后的的数据,需要给另外一个线程进行处理,这就需要线程之间进行通讯,多线程间的通信和同步是通过操作系统…

计算机系统基础

C 语言相关内容省略,复习自用,仅供参考~ 概述 冯诺伊曼结构 存储程序工作方式:将事先编好的程序和原始数据送入主存后才能执行程序,程序被启动执行后,计算机能在不需要操作人员干预下自动完成逐条指令取出和执行的任…