【kubernetes系列】kubernetes之initcontainer初始化容器

news2024/9/25 19:23:03

概述

Init Container就是用来做初始化工作的容器,可以是一个或者多个,如果有多个的话,这些容器会按定义的顺序依次执行,只有所有的Init Container执行完后,主容器才会被启动。我们知道一个Pod里面的所有容器是共享数据卷和网络命名空间的,所以Init Container里面产生的数据可以被主容器使用到的。 Init Container与应用容器本质上是一样的,但他们是仅运行一次就结束的任务,并且必须在成功执行完后,系统才能继续执行下一个容器。

一个pod完整的生命周期如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OWDfQO1O-1688367047497)(image/pod-init-1.png)]

从上面这张图我们可以直观的看到PostStart和PreStop包括liveness和readiness是属于主容器的生命周期范围内的,而Init Container是独立于主容器之外的,当然他们都属于Pod的生命周期范畴之内的。

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

应用场景

在很多应用场景中,应用在启动之前都需要进行初始化操作,如:

  • 等待其他关联服务正确运行(例如数据库或某个后台服务)
  • 基于环境变量或配置模板生成服务所需配置文件
  • 从远程数据库获取本地所需配置,或者将自身注册到某个中央数据库中
  • 下载相关依赖包,或者对统进行一些预配置操作

示例1

我们先来测试使用initcontainer创建一个服务依赖的场景的Pod:

##引入了外部mysql
[root@k8s-m1 k8s-total]# cat mysql-svc.yml 
kind: Endpoints
apiVersion: v1
metadata:
  name: mysql-production
subsets:
  - addresses:
      - ip: 192.168.2.142
    ports:
      - port: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-production
spec:
  ports:
    - port: 3306

##部署nginx
[root@k8s-m1 k8s-total]# cat my-nginx.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      tier: frontend
  replicas: 1
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - port: 80
  selector:
    tier: frontend

##有初始化容器的pod

apiVersion: v1
kind: Pod
metadata:
  name: init-pod-1
  labels:
    app: init
spec:
  containers:
  - name: main-container
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-service
    image: busybox
    command: ['sh', '-c', 'until nslookup nginx-service; do echo waiting for nginx-service; sleep 2; done;']
  - name: init-mysql
    image: busybox
    command: ['sh', '-c', 'until nslookup mysql-production; do echo waiting for mysql; sleep 2; done;']
#部署
[root@k8s-m1 k8s-init-container]# kubectl apply  -f mysql-svc.yml  -f  my-nginx.yml  -f init-pod-1.yml 

#查看
[root@k8s-m1 k8s-total]# kubectl get ep,po
NAME                               ENDPOINTS                                                  AGE
endpoints/nginx-service            10.244.42.159:80                           10m
endpoints/mysql-production         192.168.2.142:3306                                         10m

NAME                            READY   STATUS    RESTARTS   AGE
pod/init-pod-1                   1/1     Running   0          10m
pod/my-nginx-7ff446c4f4-tbtpc   1/1     Running   1          10m

我们可以 describe 下看看详细信息:

[root@k8s-m1 k8s-total]# kubectl describe pod init-pod-1 
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  13m   default-scheduler  Successfully assigned default/init-pod-1 to k8s-m1
  Normal  Pulling    13m   kubelet            Pulling image "busybox"
  Normal  Pulled     13m   kubelet            Successfully pulled image "busybox" in 15.979657153s
  Normal  Created    13m   kubelet            Created container init-service
  Normal  Started    13m   kubelet            Started container init-service
  Normal  Pulling    12m   kubelet            Pulling image "busybox"
  Normal  Pulled     12m   kubelet            Successfully pulled image "busybox" in 15.995762509s
  Normal  Created    12m   kubelet            Created container init-mysql
  Normal  Started    12m   kubelet            Started container init-mysql
  Normal  Pulling    12m   kubelet            Pulling image "busybox"
  Normal  Pulled     12m   kubelet            Successfully pulled image "busybox" in 15.976887445s
  Normal  Created    12m   kubelet            Created container main-container

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

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

示例2

接下来我们测试使用initcontainer创建一个做初始化配置工作的Pod:

[root@k8s-m1 k8s-init-container]# cat init-pod-2.yaml 
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容器是否运行:

[root@k8s-m1 k8s-init-container]# kubectl apply  -f init-pod-2.yaml 
pod/init-demo created
[root@k8s-m1 k8s-init-container]# kubectl get po -o wide
NAME                        READY   STATUS    RESTARTS   AGE    IP              NODE     NOMINATED NODE   READINESS GATES
init-demo                   1/1     Running   0          60s    10.244.42.155   k8s-m1   <none>           <none>

[root@k8s-m1 k8s-init-container]# curl 10.244.42.155 

正常效果我们可以看到有百度相关的信息,就可以证明我们上面的初始化的工作正常完成。

更多关于kubernetes的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出

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

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

相关文章

日本PSE认证341种B类产品为非特定电器和材料类清单

以上清单为官方网站直译&#xff0c;可能存在差异&#xff0c;具体以官方为准。

为什么普通人升级电脑的意愿消逝了

简洁版答案&#xff1a;需求消逝了。 市场调研机构Canalys数据显示&#xff0c;今年一季度&#xff0c;中国市场整体PC出货量同比下降24%至890万台&#xff0c;已是连续第五个季度下跌。今年截至618结束&#xff0c;都没有一家主要的PC厂商愿意发战报。PC市场怎样走出寒冬&…

微服务系列文章之 seata 事务模式

XA模式 XA 规范 是 X/Open 组织定义的分布式事务处理&#xff08;DTP&#xff0c;Distributed Transaction Processing&#xff09;标准。 XA 规范 描述了全局的TM与局部的RM之间的接口&#xff0c;几乎所有主流的数据库都对 XA 规范 提供了支持。 两阶段提交 XA是规范&…

若依新建模块后,swagger扫描不到新模块中的controller接口

框架默认情况下,只能扫描ruoyi-admin模块下的controller接口。如果需要扫描其它子模块中的swagger注解,那么需要调整一下swagger相关内容。 目录 1、前置条件 2、解决办法 1、前置条件 首先,我们要知道,默认情况下swagger依赖包是放置在项目根pom.xml文件中的。 swagge…

Redis三大集群模式

Redis 支持三种集群方案 主从复制模式Sentinel&#xff08;哨兵&#xff09;模式Cluster 模式 为什么要使用集群模式 [1]解决单机故障问题 [2]解决单机压力问题 Redis 集群的三种模式&#x1f349; 一.主从复制模式&#x1f349; 主从复制原理&#x1f95d; 从服务器连接…

【软件测试】高级测试进阶 Centos7安装 Docker容器(详细步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 OS 安装环境要求 …

移动应用加固:政务APP如何保障安全?

政务APP是政府部门为了方便公民办理政务事务而开发的移动应用程序。由于政务APP涉及到大量的敏感信息和政府机密&#xff0c;因此面临着多种安全风险的挑战。《国务院办公厅关于印发全国一体化政务服务平台移动端建设指南的通知》&#xff08;以下简称“通知”&#xff09;要求…

JAVA开发运维(linux环境防火墙与端口开启使用总结记录)

一、问题背景&#xff1a; 将web项目开发完成&#xff0c;需要上到生产环境。那么我们应用调用的一些ip&#xff0c;端口都是要设置的&#xff0c;比如说应用提供给谁访问&#xff0c;那些人不能访问&#xff0c;应用的端口是多少&#xff0c;也是需要开启才能访问的。在实际研…

用BBI指标如何分析平台现货白银走势?

分析平台现货白银走势&#xff0c;主要有几种理论&#xff0c;包括指标类&#xff0c;价格形态类&#xff0c;切线类和K线理论类等几种方法。其实&#xff0c;技术指标依赖投资者开发的算法&#xff0c;被认为是相对更先进的技术&#xff0c;所以也深受很多投资者喜爱。今日&am…

SQL Server创建定时维护计划(备份数据库)

一.备份前将日志收缩至1MB 1.连接数据库——管理——维护计划——新建维护计划 在左下角找到执行T-SQL语句任务将其拖拽到右侧&#xff0c;点击编辑将数据库改为简单模式的SQL语句添加到里面&#xff0c;添加完成后设置执行计划任务 设置执行时间计划任务 2.将数据库log日志收缩…

zynq emio 外接emmc/SD 相关问题与描述总结

在使用emio的情况要注意&#xff0c;由于通过PL的扩展&#xff0c;导致一些问题&#xff0c;如时钟时序&#xff0c;数据、cmd的方向控制都需要注意。 A、emio的clk和clk_fb要短接&#xff08;原因是要通过反馈修复clk输出时序&#xff09;&#xff0c;可通过内部直接短接&…

GC回收器演进之路

目录 未来演进方向 历经之路 引用计数法 标记清除法 复制法 标记整理 分代式 三色标记法的诞生 三色标记法的基本概念 产生的问题 问题 1&#xff1a;浮动垃圾 问题 2&#xff1a;对象消失 遍历对象图不需要 STW 的解决方案 屏障机制 插入屏障&#xff08;Dijks…

springboot web

Springboot入门介绍 一、Spring框架概述 1.1 什么是Spring Spring是一个开源框架&#xff0c;Spring是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》。Spring是为了解决企业级应用开发的复…

【生活分享】《哈姆雷特》· 苏州站 - 有趣的观后感

平时博客里大部分都是写技术相关的文章&#xff0c;感觉内容还是比较单一的&#xff0c;也想分享一下最近的一些有趣的生活~ 6月30号的时候&#xff0c;便订好了7月2号徐俊导演编排的《哈姆雷特》音乐剧。而实际上&#xff0c;苏州场 7月1号就上映了&#xff0c;但感觉那天太晚…

python函数调用时的关键字参数

python 函数调用使用关键字参数来确定传入的参数值&#xff1b; 使用关键字参数允许函数调用时参数的顺序与声明时不一致&#xff0c; Python 解释器能够用参数名匹配参数值&#xff1b; 在命令行定义一个函数printstu&#xff1b; 如下都可以正确调用&#xff1b; printstu(…

❤ 15个基于Vue3.0全家桶的优秀开源项目

❤ 15个基于Vue3.0全家桶的优秀开源项目 Vue Admin Better github : https://github.com/chuzhixin/vue-admin-better vue admin better 对比其他来源 admin 框架有如下优势: 支持前端控制路由权限 intelligence、后端控制路由权限 all 模式 已知来源 vue admin 框架中首家支…

【Spring Cloud Alibaba】OpenFeign的使用

Feign is a Java to HTTP client binder inspired by Retrofit, JAXRS-2.0, and WebSocket. Feign’s first goal was reducing the complexity of binding Denominator uniformly to HTTP APIs regardless of ReSTfulness. Feign是一个Java到HTTP的客户端绑定器&#xff0c;灵…

点云模型概述

点云与三维图像 三维图像是一种特殊的信息表达形式&#xff0c;其特征是表达的空间中三个维度的数据。和二维图像相比&#xff0c; 三维图像借助第三个维度的信息&#xff0c;可以实现天然的物体和背景解耦。 对于视觉测量来说&#xff0c;物体的二维信息往往随射影方式而变化…

2023年,从初级岗进阶到中级测试工程师岗,突破内卷...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 初级测试如何成长…

vue3----解决字体包太大响应慢以及打包文件大的问题 解决font-spider 报错问题

vue3----解决字体包太大响应慢以及打包文件大的问题 && 解决font-spider 报错问题 前言&#xff1a;使用font-spider压缩字体&#xff08;亲测可用&#xff09; 参考链接&#xff1a;https://blog.csdn.net/nanchen_J/article/details/126973856 一、解决字体包太大响应…