Kubernetes笔记(九)--初始化容器

K8S(Kubernetes)简介和官方安装部署保姆级详细教程 Kubernetes简称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,起源于Google 集群管理工具Borg。 阅读详情

上节课我们学习了容器的健康检查的两个探针:liveness probe(存活探针)和readiness probe(可读性探针)的使用方法,我们说在这两个探针是可以影响容器的生命周期的,包括我们之前提到的容器的两个钩子函数PostStart和PreStop。我们今天要给大家介绍的是Init Container(初始化容器)。

Init Container就是用来做初始化工作的容器,可以是一个或者多个,如果有多个的话,这些容器会按定义的顺序依次执行,只有所有的Init Container执行完后,主容器才会被启动。我们知道一个Pod里面的所有容器是共享数据卷和网络命名空间的,所以Init Container里面产生的数据可以被主容器使用到的。

是不是感觉Init Container和之前的钩子函数有点类似啊,只是是在容器执行前来做一些工作,是吧?从直观的角度看上去的话,初始化容器的确有点像PreStart,但是钩子函数和我们的Init Container是处在不同的阶段的,我们可以通过下面的图来了解下:
在这里插入图片描述从上面这张图我们可以直观的看到PostStart和PreStop包括liveness和readiness是属于主容器的生命周期范围内的,而Init Container是独立于主容器之外的,当然他们都属于Pod的生命周期范畴之内的,现在我们应该明白Init Container和钩子函数之类的区别了吧。

另外我们可以看到上面我们的Pod右边还有一个infra的容器,这是一个什么容器呢?我们可以在集群环境中去查看任意一个Pod对应的运行的Docker容器,我们可以发现每一个Pod下面都包含了一个pause-amd64的镜像,这个就是我们的infra镜像,我们知道Pod下面的所有容器是共享同一个网络命名空间和数据卷的,这个镜像就是来做这个事情的,所以每一个Pod当中都会包含一个这个镜像。

很多同学最开始 Pod 启动不起来就是因为这个 infra 镜像没有被拉下来,因为默认该镜像是需要到谷歌服务器上拉取的,所以需要提前拉取到节点上面。

我们说Init Container主要是来做初始化容器工作的,那么他有哪些应用场景呢?

等待其他模块Ready:这个可以用来解决服务之间的依赖问题,比如我们有一个 Web 服务,该服务又依赖于另外一个数据库服务,
但是在我们启动这个 Web 服务的时候我们并不能保证依赖的这个数据库服务就已经启动起来了,所以可能会出现一段时间内
 Web 服务连接数据库异常。要解决这个问题的话我们就可以在 Web 服务的 Pod 中使用一个 InitContainer,在这个初始化容
 器中去检查数据库是否已经准备好了,准备好了过后初始化容器就结束退出,然后我们的主容器 Web 服务被启动起来,这个
 时候去连接数据库就不会有问题了。
做初始化配置:比如集群里检测所有已经存在的成员节点,为主容器准备好集群的配置信息,这样主容器起来后就能用
这个配置信息加入集群。
其它场景:如将 pod 注册到一个中央数据库、配置中心等。

我们先来给大家演示下服务依赖的场景下初始化容器的使用方法,如下Pod的定义方法

apiVersion: v1
kind: Pod
metadata:
  name: init-pod1
  labels:
    app: init
spec:
  containers:
  - name: init-container
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

Service的对应YAML内容:

kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 6376
---
kind: Service
apiVersion: v1
metadata:
  name: mydb
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 6377

我们可以先创建上面的Pod,然后查看下Pod的状态,然后再创建下面的Service,对比下前后状态。

我们在Pod启动过程中,初始化容器会按顺序在网络和数据卷初始化之后启动。每个容器必须在下一个容器启动之前成功退出。如果由于运行时或失败退出,导致容器启动失败,它会根据Pod的restartPolicy指定的策略进行重试。 然而,如果 Pod 的 restartPolicy 设置为 Always,Init 容器失败时会使用 RestartPolicy 策略。

在所有的初始化容器没有成功之前,Pod将不会变成 Ready状态。正在初始化中的Pod处于Pending状态,但应该会将条件Initializing设置为 true。

接下来我们再来尝试创建一个做初始化配置工作的Pod:

apiVersion: v1
kind: Pod
metadata:
  name: init-demo
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: workdir
      mountPath: /usr/share/nginx/html
  initContainers:
  - name: install
    image: busybox
    command:
    - wget
    - "-O"
    - "/work-dir/index.html"
    - http://www.baidu.com
    volumeMounts:
    - name: workdir
      mountPath: "/work-dir"
  volumes:
  - name: workdir
    emptyDir: {}

我们可以看到这里又出现了volumes,spec.volumes指的是Pod中的卷,spec.containers.volumeMounts,是将指定的卷 mount 到容器指定的位置,相当于docker里面的-v 宿主机目录:容器目录,我们前面用到过hostPath,我们这里使用的是emptyDir{},这个就相当于一个共享卷,是一个临时的目录,生命周期等同于Pod的生命周期。

初始化容器执行完,会下载一个 html 文件映射到emptyDir{},而主容器也是和 spec.volumes 里的emptyDir{} 进行映射,所以nginx容器的/usr/share/nginx/html目录下会映射 index.html 文件。

我们来创建下该Pod,然后验证nginx容器是否运行:

$ kubectl get pod init-demo

输出显示了nginx容器正在运行:

NAME      READY     STATUS    RESTARTS   AGE
nginx     1/1       Running   0          43m

在 init-demo 容器里的 nginx 容器打开一个 shell:

$ kubectl exec -it init-demo -- /bin/bash

在Shell里,直接查看下 index.html 的内容:

root@nginx:~# cat /usr/share/nginx/html/index.html

如果我们看到有百度相关的信息那么证明我们上面的初始化的工作就完成了。

这就是我们初始化容器的使用方法,到这里我们就把Pod的整个生命周期当中的几个主要阶段讲完了,第一个是容器的两个钩子函数:PostStart和PreStop,还有就是容器健康检查的两个探针:liveness probe和readiness probe,以及这节课的Init Container。下节课开始我们来讲解一些常用的控制器和Pod的结合。

【Kubernetes】Pod生命周期、初始化容器、主容器 Pod生命周期、初始化容器、主容器 阅读详情

相关推荐

Kubernetes K8S之Pod 生命周期与init container初始化容器详解

K8S中Pod的生命周期与init container初始化容器详解

踏歌行的专栏 5207

pod的初始化容器是干什么的

前言 环境:centos7.9 docker-ce-20.10.9 kubernetes-version v1.22.6 什么是pod的初始化容器 在pod中,为了能实现在业务容器启动之间做一些检查,k8s 提供了一种叫做初始化容器的机制来实现。 初始化容器是在pod的业务容器启动之前要运行的容器,主要是做一些业务容器的前置工作,它具有两大特征: 1、初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成; 2、初始化容器必须按照定义的顺序执行,当且仅当前一个

MssGuo的博客 2282

K8S 容器重启策略

今天我们来实验容器重启策略。如下:Pod的spec中包含一个字段,其可能取值包括Always、OnFailure和Never。默认值是Always。Pod的重启策略(restartPolicy)应用于Pod中的应用容器(也叫主容器,spec.containers定义的容器)和常规的Init容器(初始化容器)。AlwaysOnFailureNever所谓容器终止,就是指容器内运行的主进程终止。假设有如下三个节点的K8S集群:k8s31master是控制节点。

matrixlzp的博客 1993

Velero备份实战 - 基于Ceph的CSI快照

继CSI之后,卷快照在Kubernetes v1.12发布了alpha版,引入了以下几个关键的API对象:VolumeSnapshot ; VolumeSnapshotC ; VolumeSnapshotClass 本文介绍了怎么用velero通过Ceph的快照方式来备份恢复有状态的应用,可以看到,不论是删掉PV,删掉命名空间,还是损坏原始PV的数据,都可以通过velero把原始数据恢复回来。

weixin_54323634的博客 2273

容器组_初始化容器

Pod 可以包含多个工作容器,也可以包含一个或多个初始化容器,初始化容器在工作容器启动之前执行。初始化容器总是运行并自动结束kubelet 按顺序执行 Pod 中的初始化容器,前一个初始化容器成功结束后,下一个初始化容器才开始运行。所有的初始化容器成功执行后,才开始启动工作容器如果 Pod 的任意一个初始化容器执行失败,kubernetes 将反复重启该 Pod,直到初始化容器全部成功(除非 Pod 的 restartPolicy 被设定为 Never)

个人博客,记录了本人学习的各种有趣的技术。 1204

Kubernetes 初始化容器顺序启动

最近工作中需要保证容器启动之前PostgreSQL先启动,然后Apollo再启动,不然会出现配置加载错误的问题。Kubernetes的初始化容器就能够满足这种场景。 InitContainers能够按照资源文件中初始化容器的顺序依次启动 apiVersion: apps/v1 kind: Deployment metadata: name: openailab-discovery-ser...

专注基础架构领域 6189

学习笔记二十:Pod生命周期-启动钩子、停止钩子

Readinessprobe(就绪性检测):判断容器是否准备就绪并对外提供服务,将容器设置为不可用,不接受service转发的请求。Livenessprobe(存活性探测):判断容器是否处于runnning状态,根据重启策略决定是否重启容器。HTTPGetAction:通过向容器IP地址的某指定端口的path发起HTTP GET请求。ExecAction:在容器中执行一个命令,并根据返回的状态码进行诊断,只有返回0为成功。TCPSocketAction:通过与容器的某TCP端口尝试建立连接。

weixin_43258559的博客 1149

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

初始化容器(Init Container)是Kubernetes中一种特殊的容器,其运行方式与应用容器显著不同。它们的主要职责是在Pod中的应用容器启动之前,完成必要的初始化工作。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 5609

研发工程师玩转Kubernetes——初始化容器和普通容器的区别

初始化容器用于运行一次就可以退出的业务场景,而普通容器则要一直有前台程序在运行。

方亮的专栏 539

Velero 管理 Kubernetes 备份和还原

Velero是一个开源的?kubernetes?备份和还原管理工具,相比其它直接操作etcd集群备份的优势在于,它可以备份k8s的持久卷数据。它主要在生产中应用于灾难还原,集群迁移、数据保护等多种情况。 由于本套课程需要一些其它知识才能学习,因此需要您具备以下知识: 1.? 掌握Kubernetes集群的管理 2.? 具备ceph集群的基本知识,理解它的基本概念 该课程主要讲解以下几个方面: 1.? Ceph集群的块存储、文件系统、对象存储构建。 2.???Ceph块存储、文件系统和kubernetes的集成,并提供动态的pv。 3.??Velero和Ceph对象存储集成,来完成k8s的各种资源备份、还原管理。

Java网页访问报错?手把手教你解决JRE插件缺失和浏览器拦截问题(附详细截图)

本文针对Java网页访问时常见的JRE插件缺失和浏览器拦截问题,提供了详细的诊断与解决方案。文章首先解释了问题根源在于现代浏览器出于安全考虑停止了对Java插件的支持,然后手把手指导用户确认Java安装、在控制面板配置安全站点列表,并针对Chrome、Edge、Firefox等主流浏览器的不同拦截机制给出了具体的应对策略,最后提供了系统性的故障排查清单,帮助用户彻底解决访问障碍。

weixin_29233857的博客 219

kubernetes之初始化容器

参考:https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ 初始化容器是什么? 在kubernetes中,一个pod可以包含多个容器,其中的init container,顾名思义主要负责初始化工作,一个pod也可以包含多个init container。后文统一用"初始化容器"表示"init container"。...

山不转的博客 6708

NXP MCU CAN波特率(位时间)配置详解

1. 概述 本文将会详细讲解如何设置NXP MCU的CAN波特率、位时间、采样点等属性。 波特率即CAN总线传输频率,位时间是波特率的倒数,例如波特率是500K,那么位时间 = 1 / 500000 = 0.000002s = 2000ns。 我们先来看一下S32K144单片机的EB中与CAN总线波特率相关的可配置参数有哪些: ...

weixin_42967006的博客 9689

使用Kubernetes k8s管理容器化应用

Kubernetes是一个开源平台,最初由Google设计并贡献给社区,旨在简化容器化应用的部署和管理。Kubernetes可以自动调度容器到集群中的节点,并且能够保证容器按照预期的方式运行。通过本文,你已经学习了如何使用Kubernetes来管理一个简单的容器化应用。Kubernetes的强大之处在于它可以自动处理应用的部署、扩展和故障恢复,使得开发者可以专注于编写代码而不是运维细节。

qq_36287830的博客 1178

ANSYS 12.1避坑全记录:当Win7+VMware14遇到FLEXlm报错时的自救指南

本文详细介绍了在Windows 7和VMware14环境下安装和运行ANSYS 12.1时遇到的FLEXlm报错问题及其解决方案。通过虚拟机技术隔离时间同步问题,提供从环境配置到许可证管理的完整指南,帮助用户稳定运行这一老旧版本的工程仿真软件。

tt34567的博客 644

Linux下基于AHCI controller模块实现SATA Platform驱动附代码详细流程

本文主要是针对ARM A55集成了AHSATA controller模块开发sata驱动,通过Platform的形式在linux识别到SSD,本文详细讲述整个开发过程,同时对SATA Platform驱动进行讲解。1、配置SATA Phy的初始化;2、打开SATA Platform相关编译开关;3、配置设备树;4、linux启动识盘。

Luckiers的博客 2497

Kubernetes 系列 | k8s入门运维

可以通过查看Pod的Condition列表了解更多信息,pod的Condition指示pod是否已达到某个状态,以及为什么会这样,与状态相反,一个Pod同时具有多个Conditions。

weixin_48711696的博客 7408

【Bluetooth|蓝牙开发】三、一篇文章,带你总览蓝牙协议

1、开篇词 2、蓝牙开发入门 3、蓝牙协议栈总览 4、蓝牙协议栈——物理层 5、蓝牙协议栈——链路层 6、蓝牙协议栈——传输层 7、蓝牙协议栈——L2CAP协议 8、蓝牙协议栈——ATT协议 9、蓝牙协议栈——GATT协议 10、蓝牙通信流程分析 11、蓝牙协议栈——Bluez交叉编译 12、蓝牙调试工具汇总

Donge's Blog 1万+

K8s初始化容器与边车容器比对

Kubernetes中初始化容器(Init Containers)和边车容器(Sidecar Containers)是两类辅助容器,用途不同。初始化容器在主容器启动前运行,用于依赖检查、环境准备等一次性任务,且必须按顺序成功完成才会启动主容器。边车容器则与主容器并行运行,提供日志收集、代理等持续性辅助功能,共享Pod生命周期。选择时,预处理任务用初始化容器,持续辅助功能用边车容器。这两种容器模式增强了Kubernetes Pod的功能性和灵活性,是微服务架构中的重要设计模式。

weixin_45770491的博客 1130

20 Embedding 与向量检索:语义为什么能变成距离

Embedding 是 RAG 语义检索的数学基础。本文用工程视角讲清文本如何变成向量,为什么语义相近会表现为距离相近,Top-K 检索如何工作,以及在模型选择、同模型约束、精确匹配和召回评估上的常见坑。

老于的笔记的专栏 6202

【毕设实战】基于YOLOv8的HRSC2016船舶智能检测系统开发全指南(含可视化UI界面,打造海事领域高分毕设)

亲爱的同学,通过这篇教程,你已经掌握了“基于YOLOv8的HRSC2016微小船只检测系统”从数据集处理、模型训练到Tkinter界面开发的全流程。这个课题既贴合“海事智能化”的产业战略,又涵盖了“目标检测、深度学习、界面开发”等多个毕设评分点,非常适合作为计算机或海事工程专业的毕业设计。在实践中,你可能会遇到“海面背景复杂导致船只漏检”“微小船只识别精度不足”“UI与模型推理同步卡顿”等挑战——别担心,这些都是技术成长的必经之路。

know_F0727的博客 127

k8s kubernetes

(Container Runtime Interface): 容器运行时接口,用来运行容器,k8s通过这个接口去兼容不同的容器,目前主要的CRI有CRI-O和containered,dockershim在k8s的1.24版本后从kubelet中剥离出来,主要由docker维护(不是亲儿子k8s也不会管了):containerd由docker开发,是docker用来操作runc的handler,与docker平级,docker生成的images等资源与containerd生成的images等资源不共享。

六月长安的博客 2723

华为OD机试真题 新系统2026-04-15 C++ 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 210

K8s—特殊容器

K8s:初始化容器、临时容器

Yuanshigou9的博客 908

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Kubernetes之Pod初始化容器

Kubernetes之Pod初始化容器 概述 ​ 初始化是很多编程语言普遍关注的问题,甚至有些编程语言直接支持模式构造来生成初始化程序,这些用于进行初始化的程序结构称为初始化器或初始化列表。初始化代码要首先运行,且只能运行一次,它们常用于验证前提条件、基于默认值或传入的参数初始化对象实例的字段等。Pod中的初始化容器(Init Container)功能与此类似,它们为那些有先决条件的...

qq_29860591的博客 1072

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: Kubernetes笔记(八)--探针健康检查
下一篇: Kubernets笔记(十)--RC&RS
那记忆微凉
博客等级 码龄9年 412粉丝 387原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值