Kubernetes之Pod初始化容器

news2025/1/13 17:33:48

Kubernetes之Pod初始化容器

概述

​ 初始化是很多编程语言普遍关注的问题,甚至有些编程语言直接支持模式构造来生成初始化程序,这些用于进行初始化的程序结构称为初始化器或初始化列表。初始化代码要首先运行,且只能运行一次,它们常用于验证前提条件、基于默认值或传入的参数初始化对象实例的字段等。Pod中的初始化容器(Init Container)功能与此类似,它们为那些有先决条件的应用容器完成必要的初始设置,例如设置特殊权限、生成必要的iptables规则、设置数据库模式,以及获取最新的必要数据等。

​ 有很多场景都需要在应用容器启动之前进行部分初始化操作,例如等待其他关联组件服务可用、基于环境变量或配置模板为应用程序生成配置文件、从配置中心获取配置等。初始化容器的典型应用需求有如下几种。

  • 用于运行需要管理权限的工具程序,例如iptables命令等,出于安全等方面的原因,应用容器不适合拥有运行这类程序的权限。
  • 提供主容器镜像中不具备的工具程序或自定义代码。
  • 为容器镜像的构建和部署人员提供了分离、独立工作的途径,部署人员使用专用的初始化容器完成特殊的部署逻辑,从而使得他们不必协同起来制作单个镜像文件。
  • 初始化容器和应用容器处于不同的文件系统视图中,因此可分别安全地使用敏感数据,例如Secrets资源等。
  • 初始化容器要先于应用容器串行启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得以满足。

​ Pod对象中的所有初始化容器必须按定义的顺序串行运行,直到它们全部成功结束才能启动应用容器,因而初始化容器通常很小,以便它们能够以轻量的方式快速运行。某初始化容器运行失败将会导致整个Pod重新启动(重启策略为Never时例外),初始化容器也必将再次运行,因此需要确保所有初始化容器的操作具有幂等性,以避免无法预知的副作用。

​ Init 容器与普通的容器非常像,除了如下两点:

  • 它们总是运行到完成,即它的本身是有周期的,并不是像nginx,tomcat那样一直堵塞在那里。
  • 每个都必须在下一个启动之前成功完成,即在真正容器启动之前,初始化容器都要成功跑完。

应用

下面这个pod,会先在初始化容器中往挂载的路径的index.html写入12222222,然后nginx的挂载静态文件下,读取index.html

apiVersion: v1
kind: Pod
metadata:
  name: "pod-life"
  labels:
    app: "pod-life"
spec:
  volumes:
  - name: content-vol
    emptyDir: {}
  initContainers:  ## Pod在启动containers之前,先要【运行完】initContainers的所有容器,所以这些容器必须有终结,不能一直运行
  - name: init-c-01
    image: alpine  ### 必须有终结的那个时刻,一般不要用一直启动的镜像
    command: ["/bin/sh","-c","echo 12222222 > /app/index.html;sleep 30;echo success;"]
    volumeMounts: 
     - name: content-vol
       mountPath: /app
  containers:
  ### docker run alpine 没有在后台一直启动的程序
  - name: pod-life-01
    image: "nginx" #默认的启动命令是启动nginx。nginx启动在后台一直有了
    volumeMounts: 
     - name: content-vol
       mountPath: /usr/share/nginx/html
  - name: pod-life-02
    image: "alpine"  #pod里面的containers都必须能启动起来,Pod会不断的重启这个容器
    command: ["/bin/sh","-c","sleep 30"]

应用后,查看日志

[root@k8s-01 ~]# kubectl logs -f --tail 200 pod-life -c init-c-01
success
[root@k8s-01 ~]#

查看pod,发现请求nginx的首页已经变成12222222

[root@k8s-01 ~]# kubectl get pods -o wide
NAME                                      READY   STATUS    RESTARTS        AGE    IP               NODE     NOMINATED NODE   READINESS GATES
counter                                   1/1     Running   0               35h    10.244.165.198   k8s-03   <none>           <none>
nfs-client-provisioner-69b76b8dc6-ms4xg   1/1     Running   1 (6d18h ago)   18d    10.244.179.21    k8s-02   <none>           <none>
nginx-5759cb8dcc-t4sdn                    1/1     Running   0               32m    10.244.179.50    k8s-02   <none>           <none>
pod-life                                  2/2     Running   0               117s   10.244.179.52    k8s-02   <none>           <none>
[root@k8s-01 ~]# curl 10.244.179.52
12222222
[root@k8s-01 ~]#

如果这个时候将yaml的命令改错

image-20220620113326173

那么初始化容器就会一直报错,重试,真正的容器也不会运行

Every 1.0s: kubectl get pods                                                                                                  Mon Jun 20 11:34:12 2022

NAME                                      READY   STATUS                  RESTARTS        AGE
counter                                   1/1     Running                 0               36h
nfs-client-provisioner-69b76b8dc6-ms4xg   1/1     Running                 1 (6d19h ago)   18d
nginx-5759cb8dcc-t4sdn                    1/1     Running                 0               47m
pod-life                                  0/2     Init:CrashLoopBackOff   3 (18s ago)     104s

实际应用

下面为kong的官方提供的yaml,就有一段初始化容器

initContainers:
      - command:
        - /bin/sh
        - -c
        - while true; do kong migrations list; if [[ 0 -eq $? ]]; then exit 0; fi;
          sleep 2;  done;
        env:
        - name: KONG_PG_HOST
          value: postgres
        - name: KONG_PG_PASSWORD
          value: kong
        image: kong:2.8
        name: wait-for-migrations

主要是查看是否对数据库进行初始化数据,外面嵌套一层循环,一直等待初始化完成,则退出循环,再启动kong,把命令拿出来到源码安装环境下执行:

[root@localhost ~]#  kong migrations list
2022/06/20 11:48:08 [warn] ulimit is currently set to "1024". For better performance set it to at least "4096" using "ulimit -n"
Executed migrations:
                                    core: 000_base, 003_100_to_110, 004_110_to_120, 005_120_to_130, 006_130_to_140, 007_140_to_150, 008_150_to_200, 009_200_to_210, 010_210_to_211, 011_212_to_213, 012_213_to_220, 013_220_to_230, 014_230_to_260, 015_260_to_270, 016_270_to_280
                                     acl: 000_base_acl, 002_130_to_140, 003_200_to_210, 004_212_to_213
                                    acme: 000_base_acme
                              basic-auth: 000_base_basic_auth, 002_130_to_140, 003_200_to_210
                           bot-detection: 001_200_to_210
                                  canary: 001_200_to_210
                               degraphql: 000_base
          graphql-rate-limiting-advanced: 000_base_gql_rate_limiting
                               hmac-auth: 000_base_hmac_auth, 002_130_to_140, 003_200_to_210
                          ip-restriction: 001_200_to_210
                                     jwt: 000_base_jwt, 002_130_to_140, 003_200_to_210
                              jwt-signer: 000_base_jwt_signer, 001_200_to_210
                                key-auth: 000_base_key_auth, 002_130_to_140, 003_200_to_210
                            key-auth-enc: 000_base_key_auth_enc, 001_200_to_210
                               mtls-auth: 000_base_mtls_auth, 001_200_to_210, 002_2200_to_2300
                                  oauth2: 000_base_oauth2, 003_130_to_140, 004_200_to_210, 005_210_to_211
                          openid-connect: 000_base_openid_connect, 001_14_to_15, 002_200_to_210
                    proxy-cache-advanced: 001_035_to_050
                           rate-limiting: 000_base_rate_limiting, 003_10_to_112, 004_200_to_210
                   response-ratelimiting: 000_base_response_rate_limiting
                                 session: 000_base_session, 001_add_ttl_index
                              vault-auth: 000_base_vault_auth
                              enterprise: 000_base, 006_1301_to_1500, 006_1301_to_1302, 010_1500_to_2100, 007_1500_to_1504, 008_1504_to_1505, 007_1500_to_2100, 009_1506_to_1507, 009_2100_to_2200, 010_2200_to_2211, 010_2200_to_2300, 010_2200_to_2300_1, 011_2300_to_2600, 012_2600_to_2700, 012_2600_to_2700_1, 013_2700_to_2800
                          enterprise.acl: 001_1500_to_2100
                   enterprise.basic-auth: 001_1500_to_2100
                    enterprise.hmac-auth: 001_1500_to_2100
                          enterprise.jwt: 001_1500_to_2100
                     enterprise.key-auth: 001_1500_to_2100
                 enterprise.key-auth-enc: 001_1500_to_2100
                    enterprise.mtls-auth: 001_1500_to_2100, 002_2200_to_2300
                       enterprise.oauth2: 001_1500_to_2100, 002_2200_to_2211
 enterprise.request-transformer-advanced: 001_1500_to_2100
enterprise.response-transformer-advanced: 001_1500_to_2100
[root@localhost ~]# echo  $?
0
[root@localhost ~]#

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

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

相关文章

Java.Integer.bitCount(int)源码解析

bitCount前言一、由易到难&#xff0c;头脑热身二、简单优化&#xff0c;一题多解三、分治优化四、bitCount(int)源码优化总结参考文献前言 如何求解一个二进制中1的个数&#xff1f;有常规的O(N)法&#xff0c;还有基于分治的O(logN)&#xff0c;即Java的bitCount(int)方法。…

CockroachDB-备份与恢复(1)备份架构

本文知识点来源于官网地址https://www.cockroachlabs.com/docs/stable/backup-architecture.html CockachDB备份以作业的方式操作&#xff0c;作业是可能跨越多个SQL会话的长期运行操作。与常规SQL语句不同&#xff0c;BACKUP语句在作业工作流中执行。备份任务有四个主要阶段:…

CDMP考试时间与报名方式

CDMP“数据管理专业人士认证”证书国际通用&#xff0c;行业认可度极高&#xff0c;是一项涵盖学历教育、工作经验和专业知识考试在内的综合资格认证&#xff0c;也是 目前全球唯一数据管理方面权威性认证 。CDMP考试时间是什么时候&#xff1f;怎样报名&#xff1f;今天小编来…

C语言 =(按位与后赋值)^=(按位异或后赋值) |=(按位或后赋值)

&(按位与后赋值&#xff09; x 0x02; x & 0x01; 按位与后的结果为&#xff1a;0x00 x 0x02; x & 0x01; 字符 & 的最早历史可以追溯到公元1世纪&#xff0c;最早是拉丁语et (意为and)的连写。最早的 & 很像 E 和 T 的组合&#xff0c;随着印刷技术的发展&…

[附源码]计算机毕业设计springboot付费自习室管理小程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]Python计算机毕业设计Django宠物领养与物品捐赠小程序

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

文件上传漏洞详解

文件上传漏洞详解1.文件上传漏洞1.1.文件上传漏洞定义1.2.文件上传漏洞原理1.3.文件上传思路1.3.1.常规类1.3.2.cms类1.3.3.编辑类1.3.4.其他类/CVE1.4.web界面存在的风险点1.5.文件上传实战思路2.文件上传绕过分类2.1.JS类防护2.1.1.前端验证  2.1.1.1.基本概念  2.1.1.2.…

普元中间件Primeton AppServer6.5部署SuperMap iServer

本文使用Windows环境普元中间件Primeton AppServer6.5&#xff08;以下简称PAS&#xff09;部署SuperMap iServer 一、部署前准备 本文使用SuperMap iServer 11.0.1&#xff08;10.2.1版本同理可以使用&#xff09; supermap-iserver-11.0.1-war.zip 安装完成的普元中间件PAS…

EEMD分解如何对IMF分量进行显著性检验?

EEMD简介 集合经验模态分解 (EEMD)方法是一种时间上局部的自适应时间序列分析技术, 适合于分析非线性、非平稳的时间序列. EEMD 方法改进了经验模态分解 (EMD)的 模态混叠问题 。EEMD 方法是利用多次测量取平均值的原理,通过在原数据中加入适当大小的白噪音来模拟多次观测的情…

【服务器数据恢复】hp服务器raid5磁盘掉线导致raid5不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 惠普ML系列某型号塔式服务器&#xff0c;5块SAS硬盘组建raid5磁盘阵列。 服务器故障&分析&#xff1a; 服务器中的一块硬盘掉线&#xff0c;由于磁盘阵列的冗余特性&#xff0c;服务器正常运行&#xff0c;用户没有察觉。直到另外一块硬盘掉…

JVM垃圾回收算法

Java有着自己一套的内存管理机制&#xff0c;不需要开发者去手动释放内存&#xff0c;开发者只需要写好代码即可&#xff0c;运行过程中产生的垃圾都由JVM回收。那JVM都是用哪些算法进行垃圾回收呢&#xff1f; 标记-清除(Mark-Sweep)算法 标记-清除(Mark-Sweep)算法是最早出…

分布式 ID 生成系统 Leaf 的设计思路,源码解读

什么是分布式ID&#xff1f; ID 最大的特点是 唯一 而分布式 ID&#xff0c;就是指分布式系统下的 ID&#xff0c;它是 全局唯一 的。 为啥需要分布式ID呢&#xff1f; 这就和 唯一 息息相关了。 比如我们用 MySQL 存储数据&#xff0c;一开始数据量不大&#xff0c;但是业…

别再纠结线程池大小 + 线程数量了,没有固定公式的

可能很多人都看到过一个线程数设置的理论&#xff1a; CPU 密集型的程序 - 核心数 1I/O 密集型的程序 - 核心数 * 2 不会吧&#xff0c;不会吧&#xff0c;真的有人按照这个理论规划线程数&#xff1f; 线程数和CPU利用率的小测试 抛开一些操作系统&#xff0c;计算机原理不…

水资源税取水计量监管系统 取用水户水量在线监测平台 水资源远程实时监控管理系统

平升电子水资源税取水计量监管系统/取用水户水量在线监测平台/水资源远程实时监控管理系统适用于水资源管理部门对地下水和地表水的用水量、水位、水质进行监测&#xff0c;还可扩展远程或自动控制泵/闸/阀实现用水量控制。系统帮助管理部门掌握所辖区域内水资源取用水情况&…

打电话用蓝牙耳机什么牌子好?打电话清晰的蓝牙耳机推荐

随着蓝牙耳机的普及&#xff0c;我们可以享受到沉浸式的音乐。在不打扰任何人的情况下&#xff0c;尽情的享受&#xff0c;使用蓝牙耳机有时候避免不了来电&#xff0c;为了保证通话的清晰&#xff0c;许多人在选购的时候也会更加的看重麦克风&#xff0c;下面小编整理了几款打…

如何使用JMeter操作Elasticsearch

JMeter是Apache组织基于Java开发的压力测试工具&#xff0c;用于对软件做压力测试&#xff0c;Elasticsearch是一个分布式、高扩展、高实时的搜索与数据分析引擎(简称ES)&#xff0c;下面来展示最基本的用JMeter操作ES示例。 打开JMeter工具&#xff0c;在测试计划下添加“线程…

【金万维】使用天联高级版登录U8,进行凭证打印操作。

【操作步骤】 通过“天联高级版客户端”登录 U8&#xff0c;打印凭证步骤&#xff1a; 第一步&#xff1a;首先查看一下天联高级版客户端的打印参数是否如下图所示。 &#xff08;一般软件初次安装后&#xff0c;默认即可。&#xff09; 第二步&#xff1a;进入U8后&#xff0…

web概述20

MVC模式 MVC全名是Model View Controller是模型视图控制器的缩写&#xff0c;是一种软件设计典范&#xff0c;是一种架构型的模式&#xff0c;本身不引入新功能&#xff0c;只是帮助将开发的结构组织的更加合理。 它使用一种业务逻辑、数据、界面显示分离的方法&#xff0c;将…

麦芽糖-聚乙二醇-顺铂 cisplatin-PEG-maltose

麦芽糖-聚乙二醇-顺铂 cisplatin-PEG-maltose 中文名称&#xff1a;麦芽糖-顺铂 英文名称&#xff1a;maltose-cisplatin 别称&#xff1a;生物素修饰麦芽糖 生物素-麦芽糖 麦芽糖-聚乙二醇-顺铂 cisplatin-PEG-maltose 顺铂-PEG-麦芽糖 纯度&#xff1a;95% 存储条件…

电动车充电费到了涨价的时候了,低能源使用成本正在成为过去

电动汽车以省钱成为各个新能源汽车企业吹嘘的宣传点&#xff0c;然而电动汽车车主如今正面临公共充电桩短缺的问题&#xff0c;公共充电桩的建设跟不上电动汽车增长的速度&#xff0c;导致电动汽车车主充电难问题日益突出&#xff0c;解决这个问题就只能通过涨价来解决供应短缺…