持续集成部署-k8s-高级调度-InitC:初始化容器的概念和使用

持续集成部署-k8s-高级调度-InitC:初始化容器的概念和使用

  • 1. Init Container(初始化容器)是什么?
  • 2. Init Container 的简单使用

1. Init Container(初始化容器)是什么?

Kubernetes中,Init Container(初始化容器)是一种特殊类型的容器,它在Pod中的其他容器之前运行。Init Container用于在主容器启动之前执行一些初始化任务,例如配置文件的下载、数据库的初始化等。

Init Container与普通容器一样,但它们具有以下几个特点:

  • 顺序执行:在同一个Pod中,所有的Init Container会按照定义的顺序依次执行,只有当前Init Container成功退出(即返回状态码为0)后,下一个Init Container才会开始执行。
  • 容器间共享文件系统卷:Init Container可以与其他容器共享相同的卷(volume),使它们能够访问相同的文件或配置信息。
  • 生命周期独立:Init Container的生命周期与Pod中的其他容器是独立的。它们可以在主容器正在运行时继续执行,也可以在主容器结束后继续执行。

2. Init Container 的简单使用

新建配置文件:init-container.yaml

apiVersion: v1
kind: Pod
metadata:name: init-container-pod
spec:containers:- name: main-container-nginximage: nginx:1.7.9# 主容器的定义initContainers:- name: init-container-1image: busybox:latestcommand: ['sh', '-c', 'echo Init Container 1']# 第一个Init Container的定义- name: init-container-2image: busybox:latestcommand: ['sh', '-c', 'echo Init Container 2']# 第二个Init Container的定义

在上面的示例中,我们定义了一个Pod,其中包含一个名为 main-container-nginx的主容器和两个Init Container:init-container-1init-container-2。它们将按照定义的顺序依次执行。

每个Init Containerk可以使用不同的镜像(这里使用了Busybox镜像),并通过command字段指定了要执行的命令。在这个示例中,Init Container只是打印一些文本信息。

当Pod启动时,Kubernetes将首先创建并运行init-container-1,待其成功退出后,再创建并运行init-container-2。最后,Kubernetes会创建并运行main-container-nginx

接着我们操作下看下执行的流程:kubectl create -f init-container.yaml

[root@docker-54 jobs]# kubectl create -f init-container.yaml 
pod/init-container-pod created
[root@docker-54 jobs]# 
[root@docker-54 jobs]# kubectl get po
NAME                           READY   STATUS      RESTARTS        AGE
init-container-pod             0/1     Init:0/2    0               6s
[root@docker-54 jobs]# 
[root@docker-54 jobs]# kubectl get po
NAME                           READY   STATUS      RESTARTS        AGE
init-container-pod             0/1     Init:1/2    0               6s
[root@docker-54 jobs]# 
[root@docker-54 jobs]# kubectl get po
NAME                           READY   STATUS             RESTARTS        AGE
init-container-pod             0/1     PodInitializing    0               6s
[root@docker-54 jobs]# 
[root@docker-54 jobs]# kubectl get po
NAME                           READY   STATUS     RESTARTS        AGE
init-container-pod             1/1     Running    0               6s
[root@docker-54 jobs]# 

可以看到,Pod 创建成功后,READY显示 0/1表示未就绪状态,并且STATUS显示有两个 Init Container 在初始化,然后等待初始化完成后,容器状态变为 Running;

接着看下描述事件的内容:

[root@docker-54 jobs]# kubectl describe po  init-container-pod 
Name:         init-container-pod
Namespace:    default
...
Events:Type    Reason     Age   From               Message----    ------     ----  ----               -------Normal  Scheduled  87s   default-scheduler  Successfully assigned default/init-container-pod to docker-56Normal  Pulling    87s   kubelet            Pulling image "busybox:latest"Normal  Pulled     48s   kubelet            Successfully pulled image "busybox:latest" in 39.045941073sNormal  Created    48s   kubelet            Created container init-container-1Normal  Started    48s   kubelet            Started container init-container-1Normal  Pulling    47s   kubelet            Pulling image "busybox:latest"Normal  Pulled     16s   kubelet            Successfully pulled image "busybox:latest" in 31.46613887sNormal  Created    16s   kubelet            Created container init-container-2Normal  Started    16s   kubelet            Started container init-container-2Normal  Pulled     15s   kubelet            Container image "nginx:1.7.9" already present on machineNormal  Created    15s   kubelet            Created container main-container-nginxNormal  Started    14s   kubelet            Started container main-container-nginx
[root@docker-54 jobs]# 

可以看到,首先是任务调度到 docker-56 节点上,然后拉取了 "busybox:latest"的镜像,这里有两个 Init Container 但是用了同一个版本的镜像,却拉取了两次,就有点神奇了。

这是因为当Pod被调度到节点上并开始执行时,Kubernetes会按顺序为每个Init Container创建一个容器实例。每个容器实例需要从镜像仓库中拉取镜像,以便在节点上运行。

所以,在上面示例中,第一个Init Container(init-container-1)在开始时拉取了busybox:latest镜像,然后在成功退出后,第二个Init Container(init-container-2)也会拉取相同的镜像。这是因为每个Init Container都是独立的,它们之间没有共享镜像的缓存。

主容器(main-container-nginx)则是另一个独立的容器,它使用的是不同的镜像(nginx:1.7.9)。由于该镜像已经存在于节点上,所以在事件信息中显示为Container image "nginx:1.7.9" already present on machine,表示不需要再次拉取该镜像。

接着看下节点上容器的执行情况:

[root@docker-56 ~]# docker ps -a | grep init
8962da1d4913   84581e99d807                                                              "nginx -g 'daemon of…"   11 minutes ago   Up 11 minutes                         k8s_main-container-nginx_init-container-pod_default_c8984746-7c8e-4724-82da-4bb7376ec560_0
d29abaa670cd   busybox                                                                   "sh -c 'echo Init Co…"   11 minutes ago   Exited (0) 11 minutes ago             k8s_init-container-2_init-container-pod_default_c8984746-7c8e-4724-82da-4bb7376ec560_0
1cc8c7423c64   busybox                                                                   "sh -c 'echo Init Co…"   12 minutes ago   Exited (0) 12 minutes ago             k8s_init-container-1_init-container-pod_default_c8984746-7c8e-4724-82da-4bb7376ec560_0
[root@docker-56 ~]# docker logs -f --tail 20 k8s_init-container-1_init-container-pod_default_c8984746-7c8e-4724-82da-4bb7376ec560_0
Init Container 1
[root@docker-56 ~]# 

确实可以看到,这里运行了三个容器,Init Container 执行完成,已经是停止的状态了,并且查看对应 Init Container 的日志,也是可以正常看到的。

使用Init Container可以实现一些初始化任务,确保主容器在启动之前具备所需的条件。例如,可以使用Init Container下载配置文件初始化数据库执行数据迁移等操作。

需要注意的是,如果Init Container失败退出(即返回状态码非零),Kubernetes将会重启整个Pod,以便重新执行Init Container主容器。因此,在编写Init Container时,应确保其能够处理错误情况,并保证在正常情况下能够成功退出。

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

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

相关文章

VLAN间路由详细讲解

本次实验拓扑的主要概述以及设计到的相关技术 VLAN技术: VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。 每个VLAN是一个广播域,VLAN内的主机间可以直…

YOLOv8改进 | 2023 | SCConv空间和通道重构卷积(精细化检测,又轻量又提点)

一、本文介绍 本文给大家带来的改进内容是SCConv,即空间和通道重构卷积,是一种发布于2023.9月份的一个新的改进机制。它的核心创新在于能够同时处理图像的空间(形状、结构)和通道(色彩、深度)信息&#xf…

C语言 柔性数组

文章目录 定义使用 定义 C语言中的柔性数组(Flexible Array)是一种特殊的数组类型,它的长度可以在运行时动态确定。柔性数组通常用于结构体的最后一个成员,用于表示可变长度的数据。 struct Example {int length;int data[]; //…

@ResponseBody详解:用于响应体响应数据

RestFul风格或者是web阶段接触过的异步请求,都需要把数据转换成Json放入响应体中。 ResponseBody的作用其实是将java对象转为json格式的相应内容 使用 RequestMapping注解时,Spring会将返回值解析为视图路径,然后跳转路径返回对应的视图页面…

PyQt6 中自定义浮点型滑块类

介绍: 在PyQt6中,滑块(Slider)是常用的用户界面元素之一,用于选择数值范围。然而,有时候我们可能需要使用浮点数值,而标准的滑块仅支持整数。为了解决这个问题,我们可以创建一个自定…

数字图像处理(实践篇) 十六 基于分水岭算法的图像分割

目录 一 分水岭算法 二 利用OpenCV实现分水岭算法的过程 三 实践 一 分水岭算法 基于任何灰度图像都可以视为地形表面,其中高强度表示山峰和山丘,而低强度表示山谷。首先,开始用不同颜色的水(标签)填充每个孤立的山…

医院智能导诊小程序源码 智能导诊源码

医院智能导诊系统、AI智能导诊、现有的ai模型做医院智能导诊、智能就医引导系统、人工智能挂号、医院AI全流程智能导诊系统。 智能导诊 可以根据用户症状描述精准推荐科室及医生智能学习医院历史数据及自动进行科室对照,与医院的系统连接后,患者可直接完成预约。 一、系统概述…

sklearn教程:iris鸢尾花数据集数据分析

文章目录 数据集介绍导入数据集查看数据标签、属性和介绍查看数据整理为dataframe数据indo()查看数据类型和是否缺失describe() 提供数值型变量的描述性统计变量赋值标签编码分割训练集测试集查看X y 维度可视化分析箱线图查看数据分布和异常值直方图查看数值型数据分布密度图查…

【Java面试——并发基础、并发关键字】

3.1 并发基础 Java 并发 - 理论基础Java 并发 - 线程基础 多线程的出现是要解决什么问题的? 本质什么? CPU、内存、I/O 设备的速度是有极大差异的,为了合理利用 CPU 的高性能,平衡这三者的速度差异,计算机体系结构、操作系统、编译程序都做出了贡献,主要体现为: CPU 增加…

flutter-一个可以输入的数字增减器

效果 参考文章 代码 在参考文章上边,主要是改了一下样式,逻辑也比较清楚,对左右两边添加增减方法。 我在此基础上加了_numcontroller 输入框的监听。 加了数字输入框的控制 keyboardType: TextInputType.number, //设置键盘为数字 inputF…

python Thread

第一种 import threading import timedef a(url):print(f"--------start1:{url}---------")time.sleep(2)print(f"--------end1:{url}-----------")def b(url):print(f"--------start2:{url}---------")time.sleep(4)print(f"--------end2…

JavaScript 数据结构

JavaScript 数据结构 目录 JavaScript 数据结构 一、标识符 二、关键字 三、常量 四、变量 每一种计算机编程语言都有自己的数据结构,JavaScript脚本语言的数据结构包括:标识符、常量、变量、保留字等。 一、标识符 标识符,说白了&…

Flutter学习(七)GetX offAllNamed使用的问题

背景 使用GetX开发应用的时候,也可能有人调用过offAllNamed,会发现所有controller的都被销毁了 环境 win10 getx 4.6.5 as 4 现象 从A页面,跳转到B页面,然后调用offAllNamed进行回到A页面,观察controller声明周期…

如何从 Android 手机恢复已删除的视频

您是否曾经丢失过手机中的任何数据?如今,由于 Android 上的应用程序崩溃、根进程停止、Android 更新失败等等,数据丢失很普遍。错误删除是丢失视频、录音和音乐副本的另一种可能的方式。 丢失包含有关新完成的项目的重要信息的视频或婚礼、周…

Django回顾4

一.过滤器 1.过滤器格式 {{变量|过滤器名字}} 2.怎么使用 1.注册app 2.在app下创建templatetags模块(模块名只能是templatetags) 3.在包下写一个py文件,随便命名 4.在py文件中写入:from django import template …

零基础OpenAi应用商店开发

在本月OpenAi开发者大会上,OpenAI宣布推出了GPTs功能,也就是GPT Store,类似App Store的应用商店,任何用户都可以去参与创建应用。通过该功能,用户可以定制化打造自己的GPT,并公开分享至OpenAI的应用商店。定…

12.1 二叉树简单题

101. 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 思路:对称二叉树 有一个特点是以 中左右顺序遍历左子树的结果会等于 中右左顺序遍历右子树的结果…

服务器中深度学习环境的配置

安装流程 11.17 日,周末去高校参加学术会议,起因, 由于使用了某高校内的公共有线网络, 远程连接服务器后,黑客利用 ssh 开放的 22 端口, 篡改了主机的配置, 使得只要一连上网络, 服…

3dmax建模培训,3dmax建模零基础难学吗?

3DMAX建模对于零基础的学习者来说,确实有一定的难度,但只要学习方法得当,付出足够的努力,是可以学会的。 为帮助零基础的学习者更好地学习3DMAX建模,以下是一些建议: 1、从基础开始:先学习3DM…

接口测试基础知识

一、接口测试简介 什么是接口测试? 接口测试是测试系统组件间接口的一种测试,主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点: 检查数据的交换,传递和控制管理过程;检查系统间的相互…