Kubernetes init container
简介
在很多应用场景中,应用在启动之前都需要进行如下初始化操作:
- 等待其他关联组件正确运行(例如数据库或某个后台服务)
- 基于环境变量或配置模板生成配置文件
- 从远程数据库获取本地所需配置,或者将自身注册到某个中央数据库中
- 下载相关依赖包,或者对系统进行一些预配置操作
kubernetes v1.3引入了一些alpha版本的新特性init container(在v1.5版本时被更新为beta版本),用于在启动应用容器之前 启动一个或多个“初始化”容器,完成应用容器所需的预置条件。init container与应用容器本质上是一样的,但它们是仅运行一次就结束的任务,并且必须在成功执行完成后,系统才能继续执行下一个容器。根据pod的重启策略,当init container执行失败,在设置了RestartPolicy=Never时,pod将自动启动失败;而设置RestartPolicy=Always时,Pod将会被系统自动重启。
配置
下面以一个nginx应用为例,在启动nginx之前,通过初始化容器busybox为nginx创建一个index.html的主页文件。这里为init container和nginx设置了一个共享的volume,以供nginx访问init container设置的index.html文件:
nginx-init-containers.yaml内容如下:
apiVersion: v1
kind: Pod
metadata:
name: nginx
annotations:
spec:
initContainers:
- name: install
image: busybox
command:
- wget
- "-O"
- "/work-dir/index.html"
- "http://kubernetes.io"
volumeMounts:
- name: workdir
mountPath: "/work-dir"
containers:
- name: workdir
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
dnsPolicy: Default
volumes:
- name: workdir
emptyDir: {}
init container与应用容器的区别
简单的说明一下两者的区别:
- init container的运行方式与应用容器不同,它们必须先于应用容器执行完成,当设置了多个init container时,将按顺序逐个运行,并且只有前一个init container运行成功后才能运行后一个init container。当所有init container都成功运行后,kubernetes才会初始化pod的各种信息,并开始创建和运行应用容器。
- 在init container的定义中也可以设置资源限制、volume的使用和安全策略等等。但资源限制的设置与应用容器不同:
- 如果多个init container都定义了资源请求/资源限制,则取最大的值作为所有init container的资源请求值/资源限制值。
- pod的有效资源请求值/资源限制值取以下二者中的较大值:
- 所有应用容器的资源请求值/限制值之和
- init container的有效资源请求值/限制值
- 调度算法将基于pod的有效资源请求值/限制值进行计算,也就是说init container可以为初始化操作预留系统资源,即使后续应用容器无须使用这些资源。
- pod的有效QoS等级适用于init container和应用容器。
- 资源配额和限制将根据pod的有效资源请求/限制,与调度机制一致。
- init container不能设置readinessProbe探针,因为必须在它们成功运行以后才能继续运行pod中定义的普通容器。将pod重启时,init container将会重新运行,常见的pod重启场景如下:
- init container的镜像被更新时,init container将重新运行,导致pod重启,仅更新应用容器的镜像只会使得应用容器被重启。
- pod的infrastructure容器更新时,pod将会重启。
- 或pod中的所有应用容器都终止了,并且RestartPolicy=Always时,则pod将会重启。
Kubernetes init container的更多相关文章
- kubernetes之初始容器(init container)
系列目录 理解初始容器 一个pod里可以运行多个容器,它也可以运行一个或者多个初始容器,初始容器先于应用容器运行,除了以下两点外,初始容器和普通容器没有什么两样: 它们总是run to complet ...
- k8s 使用 Init Container 确保依赖的服务已经启动
k8s 使用 Init Container 确保依赖的服务已经启动 Intro 最近 helm 3 正式发布了,dotnetcore 3.1 也正式发布了,最近打算把我的活动室预约项目做一个升级,项目 ...
- init container
init container与应用容器在本质上是一样的, 但它们是仅运行一次就结束的任务, 并且必须在成功执行完成后, 系统才能继续执行下一个容器, 可以用在例如应用容器启动前做一些初始化工作,当in ...
- Init Container(初始化容器)
在很多应用场景中,应用在启动之前都需要进行如下初始化操作. ◎ 等待其他关联组件正确运行(例如数据库或某个后台服务). ◎ 基于环境变量或配置模板生成配置文件. ◎ 从远程数据库获取本地所需配置,或者 ...
- Pod初始化容器之Init Container
Init 容器的介绍 Pod能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的 Init容器Init 容器与普通的容器非常像,除了如下两点: c Init 容器总是运行 ...
- k8s中初始化容器(init container)的作用及其使用方法
概述 在容器的部署过程中,有的时候需要在容器运行之前进行一些预配置的工作,比如下载配置,判断某些服务是否启动,修改配置等一些准备的工作,想要实现这些功能,在k8s中可以使用初始化容器,在应用容器运行之 ...
- K8S钩子操作
简介 我们知道,K8S可以在应用容器启动之前先执行一些预定义的操作,比如事先生成一些数据,以便于应用容器在启动的时候使用.这种方式可以通过init container技术实现,具体可以参考<Ku ...
- 详细了解 Linkerd 2.10 基础功能,一起步入 Service Mesh 微服务架构时代
Linkerd 提供了许多功能,如:自动 mTLS.自动代理注入.分布式追踪.故障注入.高可用性.HTTP/2 和 gRPC 代理.负载均衡.多集群通信.重试和超时.遥测和监控.流量拆分(金丝雀.蓝/ ...
- Kubernetes(k8s)容器运行时(CRI)
Kubernetes节点的底层由一个叫做"容器运行时"的软件进行支撑,它负责比如启停容器这样的事情.最广为人知的容器运行时当属Docker,但它不是唯一的.事实上,容器运行时这个领 ...
随机推荐
- Sprint9
进展:完善设置事件提醒界面,增加调用手机铃声部分,以及是否选择振动,以及可以添加事件进行保存.
- Java锁的种类以及辨析
锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类 ...
- 第一个spring冲刺第二天
讨论成员:王俊凯.罗凯杰.王逸辉.马志磊 地点:宿舍 话题:讨论关于安卓的控件的应用和如何调用 选题:四则运算 方向:更加实用的计算器功能,功能更加实用并且简单,没有太多的繁琐操作,可以的话会加上些趣 ...
- week3c:个人博客作业
程序测试: 一个基本的测试. 在Visual Studio 2013 中使用C++单元测试 操作如下: 这是我学到的过程. 有复杂程序的测试.以后有时间再弄.
- Xcode7~8版本过渡导致的问题
现有项目是早期Xcode7编写的,一直到现在还是使用Xcode7编写.近期一位用户手机下载App出现闪退现象,该用户手机系统(iPhone 6 iOS8.1.2)经查实是由于CoreFoundatio ...
- sprintf函数 %6.2f
%6.2f6表示数据表示至少6位,后面的.2表示小数点后保留两位 比如2342.123415用这个表示的话,结果就是2342.12如果不足六位就会在前面补空格超过六位的话正常显示 代码例子:int m ...
- mysql my.cnf 或my.ini配置文件参数解释(转):
#*** client options 相关选项 ***# #以下选项会被MySQL客户端应用读取.注意只有MySQL附带的客户端应用程序保证可以读取这段内容.如果你想你自己的MySQL应用程序获取这 ...
- 【百度】大型网站的HTTPS实践(二)——HTTPS加密算法介绍
大型网站的HTTPS实践(二)——HTTPS加密算法介绍 原创 网络通信/物联网 作者:AIOps智能运维 时间:2018-11-09 15:09:43 358 0 前言 在上一篇文章中,我们简要 ...
- C#中重写(override)和覆盖(new)的区别
重写 用关键字 virtual 修饰的方法,叫虚方法.可以在子类中用override 声明同名的方法,这叫“重写”.相应的没有用virtual修饰的方法,我们叫它实方法.重写会改变父类方法的功能.看下 ...
- 关于svn和maven结合使用的讨论
目前项目组在开发一个项目,由多个子模块构成,构建工具是maven,版本控制工具是svn.本文想对如何结合使用maven和svn提出一点初步的想法 一.只有svn的情况 首先考虑没有maven的情况.这 ...