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

概述

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.142ports:- 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-nginxlabels:app: nginx
spec:selector:matchLabels:tier: frontendreplicas: 1template:metadata:labels:tier: frontendspec:containers:- name: nginximage: nginxports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:ports:- port: 80selector:tier: frontend

##有初始化容器的pod

apiVersion: v1
kind: Pod
metadata:name: init-pod-1labels:app: init
spec:containers:- name: main-containerimage: busyboxcommand: ['sh', '-c', 'echo The app is running! && sleep 3600']initContainers:- name: init-serviceimage: busyboxcommand: ['sh', '-c', 'until nslookup nginx-service; do echo waiting for nginx-service; sleep 2; done;']- name: init-mysqlimage: busyboxcommand: ['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                                         10mNAME                            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-m1Normal  Pulling    13m   kubelet            Pulling image "busybox"Normal  Pulled     13m   kubelet            Successfully pulled image "busybox" in 15.979657153sNormal  Created    13m   kubelet            Created container init-serviceNormal  Started    13m   kubelet            Started container init-serviceNormal  Pulling    12m   kubelet            Pulling image "busybox"Normal  Pulled     12m   kubelet            Successfully pulled image "busybox" in 15.995762509sNormal  Created    12m   kubelet            Created container init-mysqlNormal  Started    12m   kubelet            Started container init-mysqlNormal  Pulling    12m   kubelet            Pulling image "busybox"Normal  Pulled     12m   kubelet            Successfully pulled image "busybox" in 15.976887445sNormal  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: nginximage: nginxports:- containerPort: 80volumeMounts:- name: workdirmountPath: /usr/share/nginx/htmlinitContainers:- name: installimage: busyboxcommand:- wget- "-O"- "/work-dir/index.html"- http://www.baidu.comvolumeMounts:- name: workdirmountPath: "/work-dir"volumes:- name: workdiremptyDir: {}

我们可以看到这里又出现了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.hqwc.cn/news/13680.html

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

相关文章

<Java导出Excel> 4.0 Java实现Excel动态模板字段增删改查

思路&#xff1a; 主要是同时操作两张表&#xff1a;一张存储数据的表&#xff0c;一张存储模板字段的表&#xff1b; 查询&#xff1a;只查询模板字段的表&#xff1b; 新增&#xff0c;修改&#xff0c;删除&#xff1a;需要同时操作两张表中的字段 如果两张表字段不一致&…

【Mac】安装DbServer

1.下载 链接: https://pan.baidu.com/s/13Vzsv1sLAq-J8RsRgtL-pw 提取码: 8gsr 2.安装 如果提示已损坏&#xff0c;无法打开。 解决方式&#xff1a; 打开“终端”&#xff0c;输入命令&#xff1a;sudo spctl --master-disable&#xff0c;这个过程中会提示要输入密码&…

硬件电路设计--运算放大器(一)参数和分类

文章目录 前言一、运放分类1.1 功能分类1.2 按单颗IC封装1.3 第一脚的判断 二、运放参数2.1 理想运放2.2 实际运放2.3 数据手册中的重要参数2.3.1 供电电压Vs&#xff08;power supply&#xff09;2.3.2 虚短虚断2.3.3 输入偏置电流Ib2.3.4 噪声Vn2.3.5 静态电流IQ2.3.6 输入失…

【Distributed】分布式监控系统zabbix应用(一)

文章目录 前言一、Zabbix基本概述1. Zabbix 的概念2. Zabbix 的工作原理3. Zabbix 6.0 新特性3.1 Zabbix 可以实现高可用3.2 Zabbix 新增监控系统 4. Zabbix 的构成5. Zabbix 的功能组件5.1 数据库5.2 Web 界面5.3 Zabbix Agent5.4 Zabbix Proxy5.5 Java Gateway 6. Zabbix 和 …

Oracle19c默认用户名system密码不正确不能登录问题解决

Oracle19c默认用户名system密码不正确不能登录问题解决 1、oracle 命令乱码问题 oracle乱码问题一般是由于oracle字符集设置和操作系统字符集设置不一致造成的。 查看oracle字符集方式如下&#xff1a; 1.进入sqlplus 命令&#xff1a; sqlplus /nolog2.以系统管理员身份连…

20中文字符识别(matlab程序)

1.简述 随着计算机科学的飞速发展&#xff0c;以图像为主的多媒体信息迅速成为重要的信息传递媒介&#xff0c;在图像中&#xff0c;文字信息(如新闻标题等字幕) 包含了丰富的高层语义信息&#xff0c;提取出这些文字&#xff0c;对于图像高层语义的理解、索引和检索非常有帮助…

android studio 4.0以上隐藏调用方法参数名提示

引入&#xff1a; android studio在编辑代码的时候&#xff0c;调用函数时会接口处会自动提示参数名&#xff0c;方便代码书写时对传参命名的规范性。 可以如果代码是魂效过的&#xff0c;那会适得其反&#xff0c;l,l1,l2,i,i1,i2这样的参数名提醒反而会混淆视听。 这时候可…

Vue项目在nginx部署启动

目录 1.打包 2.移动文件夹 3.修改配置文件 4.重启nginx即可通过指定端口访问。 1.打包 在package.json有一段代码是命令执行的&#xff0c;代码所示打包命令为build:prod,所以打包命令为npm install build:prod. "scripts": {"dev": "vue-cli-servi…

在SpringBoot中对RabbitMQ三种使用方式

基于API的方式 1.使用AmqpAdmin定制消息发送组件 Autowiredprivate AmqpAdmin amqpAdmin;Testpublic void amqpAdmin(){//1.定义fanout类型的交换器amqpAdmin.declareExchange(new FanoutExchange("fanout_exchange"));//2.定义两个默认持久化队列,分别处理email和sm…

TLS/SSL 协议

TLS/SSL 协议的工作原理 TLS/SSL 协议的工作原理 • 身份验证 • 保密性 • 完整 TLS/SSL 发展 TLS 协议 • Record 记录协议 • 对称加密 • Handshake 握手协议 • 验证通讯双方的身份 • 交换加解密的安全套件 • 协商加密参 TLS 安全密码套件解 对称加密的工作原理&am…

游戏反调试方案解析与frida/IDA框架分析

近来年&#xff0c;游戏黑灰产攻击趋势呈现出角度多样化的特点。据FairGuard游戏安全数据分析发现&#xff0c;游戏黑灰产攻击以工作室、定制注入挂、内存修改器、模拟点击、破解等形式为主。 游戏安全风险分布占比图 对于一款游戏而言&#xff0c;上述的风险中&#xff0c;被…

浅谈线段树

1.前言 Oi-Wiki上的线段树 同步于 c n b l o g s cnblogs cnblogs发布。 如有错误&#xff0c;欢迎各位 dalao 们指出。 注&#xff1a;本篇文章个人见解较多&#xff0c;如有不适&#xff0c;请谅解。 前置芝士 1.二叉树的顺序储存 2.线段树是什么&#xff1f; 线段树…