k8s中初始化容器(init container)的作用及其使用方法
概述
在容器的部署过程中,有的时候需要在容器运行之前进行一些预配置的工作,比如下载配置,判断某些服务是否启动,修改配置等一些准备的工作,想要实现这些功能,在k8s中可以使用初始化容器,在应用容器运行之前进行一些预处理的工作。
本文档介绍在k8s中初始化容器的使用方法。
使用方法
以下的例子使用初始化容器,在nginx容器启动之前下载一个index.html文件
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: initnginx
spec:
initContainers:
- name: install
image: busybox
command:
- wget
- "-O"
- "/var/index.html"
- "https://www.baidu.com"
containers:
- name: nginx
image: 172.20.45.174:81/base/nginx:1.15-alpine
ports:
- containerPort: 80
dnsPolicy: Default
EOF
查看pod的状态
[root@nccztsjb-node-11 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cm-test-app 1/1 Running 0 20h
cm-test-nginx 1/1 Running 0 175m
cm-test-pod 1/1 Running 0 20h
initnginx 0/1 Init:0/1 0 16s #在初始化阶段
nginx-test-5c7f8fc697-lrvpm 1/1 Running 0 32d
nginx-test-5c7f8fc697-whx4g 1/1 Running 0 32d
web-0 1/1 Running 0 32d
web-1 1/1 Running 0 32d
web-2 1/1 Running 0 32d
# 初始化容器运行完成后,pod状态变为Running
[root@nccztsjb-node-11 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cm-test-app 1/1 Running 0 20h
cm-test-nginx 1/1 Running 0 178m
cm-test-pod 1/1 Running 0 20h
initnginx 1/1 Running 0 9s
nginx-test-5c7f8fc697-lrvpm 1/1 Running 0 32d
nginx-test-5c7f8fc697-whx4g 1/1 Running 0 32d
web-0 1/1 Running 0 32d
web-1 1/1 Running 0 32d
web-2 1/1 Running 0 32d
[root@nccztsjb-node-11 ~]#
查看初始化容器的日志
[root@nccztsjb-node-11 ~]# kubectl logs initnginx -c install
Connecting to www.baidu.com (103.235.46.39:443)
wget: note: TLS certificate validation not implemented
saving to '/var/index.html'
index.html 100% |********************************| 2443 0:00:00 ETA
'/var/index.html' saved
[root@nccztsjb-node-11 ~]#
说明执行命令是成功的。
进入容器中,查看是否存在该文件
[root@nccztsjb-node-11 ~]# kubectl exec -it initnginx -- bash
[initnginx root:~]# cd /var/
[initnginx root:/var]# ls
cache empty git lib local lock log opt run spool tmp
[initnginx root:/var]#
发现并没有该文件!
问题在于install容器和nginx容器不是同一个容器所以,下载的/var/index.html只是在install容器的/var目录下。
为了实现nginx可以访问初始化容器中的内容,可以挂载一个数据卷进行2个容器的共享,修改pod定义如下:
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: initnginx
spec:
initContainers:
- name: install
image: busybox
command:
- wget
- "-O"
- "/work-dir/index.html"
- "https://www.baidu.com"
volumeMounts:
- name: workdir
mountPath: /work-dir
containers:
- name: nginx
image: 172.20.45.174:81/base/nginx:1.15-alpine
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
dnsPolicy: Default
volumes:
- name: workdir
emptyDir: {}
EOF
这样的化,2个容器中就都挂载了workdir这个数据卷,初始化容器中下载的文件,就可以被nginx应用容器来使用了。
创建pod后查看nginx容器中的文件
[root@nccztsjb-node-11 ~]# kubectl exec -it initnginx -- bash
[initnginx root:~]# cd /usr/share/nginx/
[initnginx root:/usr/share/nginx]# ls
html
[initnginx root:/usr/share/nginx]# cd html/
[initnginx root:/usr/share/nginx/html]# ls
index.html
[initnginx root:/usr/share/nginx/html]# cat index.html
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
[initnginx root:/usr/share/nginx/html]#
发现index.html文件已经生成了,就是在初始化容器中创建的文件被挂载到nginx中来使用。
查看初始化容器的日志
[root@nccztsjb-node-11 ~]# kubectl logs initnginx -c install
Connecting to www.baidu.com (103.235.46.39:443)
wget: note: TLS certificate validation not implemented
saving to '/work-dir/index.html'
index.html 100% |********************************| 2443 0:00:00 ETA
'/work-dir/index.html' saved
[root@nccztsjb-node-11 ~]#
OK,通过日志发现是向/work-dir/目录中写了index.html文件。
以上就是初始化容器的基本的用法。
查看pod的事件也可以看到pod中容器运行的顺序
[root@nccztsjb-node-11 ~]# kubectl describe pod initnginx
Name: initnginx
Namespace: default
Priority: 0
Node: 172.20.59.57/172.20.59.57
Start Time: Tue, 11 Jan 2022 13:49:57 +0800
Labels: <none>
Annotations: cni.projectcalico.org/podIP: 172.23.29.31/32
cni.projectcalico.org/podIPs: 172.23.29.31/32
Status: Running
IP: 172.23.29.31
IPs:
IP: 172.23.29.31
Init Containers:
install:
Container ID: docker://9d2aec37255a02a2b13abced64717057eb100dd329bc6b6529211e30595f1c93
Image: busybox
Image ID: docker-pullable://busybox@sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
Port: <none>
Host Port: <none>
Command:
wget
-O
/work-dir/index.html
https://www.baidu.com
State: Terminated
Reason: Completed
Exit Code: 0
Started: Tue, 11 Jan 2022 13:50:05 +0800
Finished: Tue, 11 Jan 2022 13:50:08 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-8ss8s (ro)
/work-dir from workdir (rw)
Containers:
nginx:
Container ID: docker://9f088e80c72e6691ea48bf3a9edf3983ccf8e8d32dd17e27425916efdfec4ff4
Image: 172.20.45.174:81/base/nginx:1.15-alpine
Image ID: docker-pullable://172.20.45.174:81/base/nginx@sha256:478a73bcec93acc3e814ddd6fb2f95c6f6b4b0d0f168a4feaa039513d260a5d9
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 11 Jan 2022 13:50:08 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/usr/share/nginx/html from workdir (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-8ss8s (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
workdir:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
SizeLimit: <unset>
default-token-8ss8s:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-8ss8s
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 6m27s default-scheduler Successfully assigned default/initnginx to 172.20.59.57
Normal Pulling 6m26s kubelet Pulling image "busybox"
Normal Pulled 6m20s kubelet Successfully pulled image "busybox" in 6.378365555s
Normal Created 6m20s kubelet Created container install
Normal Started 6m19s kubelet Started container install
Normal Pulled 6m16s kubelet Container image "172.20.45.174:81/base/nginx:1.15-alpine" already present on machine
Normal Created 6m16s kubelet Created container nginx
Normal Started 6m16s kubelet Started container nginx
[root@nccztsjb-node-11 ~]#
即先创建初始化容器,运行结束后,才是运行nginx这个应用容器。
初始化容器使用的说明
关于初始化容器的使用,有几点说明
- 在pod中可以有一个或者多个初始化容器
- 初始化容器执行成功后,应用的容器才能被执行
- 初始化容器是仅运行一次的任务
k8s中初始化容器(init container)的作用及其使用方法的更多相关文章
- kubernetes之初始容器(init container)
系列目录 理解初始容器 一个pod里可以运行多个容器,它也可以运行一个或者多个初始容器,初始容器先于应用容器运行,除了以下两点外,初始容器和普通容器没有什么两样: 它们总是run to complet ...
- k8s中解决容器时差问题
解决k8s的pod容器的时差常用的两种方式: 1.通过设置pod 模板中的环境变量 env解决 在pod的模板中添加以下: apiVersion: v1 kind: Podmetadata: na ...
- 在Android开发中替换资源图片不起作用的解决方法
现象 在android开发中,经常会需要替换res\drawable中的图片,打开res\layout下的文件预览布局页面发现图片已经被替换,但在模拟器或者真实机器上运行时发现该图片并没有被替换,还是 ...
- K8S 中的容器编排和应用编排
众所周知,Kubernetes 是一个容器编排平台,它有非常丰富的原始的 API 来支持容器编排,但是对于用户来说更加关心的是一个应用的编排,包含多容器和服务的组合,管理它们之间的依赖关系,以及如何管 ...
- scrapy中crawlspide中callback和follow函数的作用及使用方法
Rule(LinkExtractor(allow=r'i/tems'),callback='parse_item',follow=True) 当前代码的含义就是将当前页面及按照allow=r'i/t ...
- Java中遍历容器List、Map、Set的方法总结
List List<String> list = new ArrayList<>(); list.add("张三"); list.add("李四& ...
- 容器中的容器——利用Dind实现开箱即用的K3s
我在学习 Rancher 和 Minikube 的时候,发现它们都可以在自己的容器环境中提供一个 K3s 或 K8s 集群.尤其是 Minikube ,用户可以在它的容器环境中执行 docker ps ...
- Init Container(初始化容器)
在很多应用场景中,应用在启动之前都需要进行如下初始化操作. ◎ 等待其他关联组件正确运行(例如数据库或某个后台服务). ◎ 基于环境变量或配置模板生成配置文件. ◎ 从远程数据库获取本地所需配置,或者 ...
- Pod初始化容器之Init Container
Init 容器的介绍 Pod能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的 Init容器Init 容器与普通的容器非常像,除了如下两点: c Init 容器总是运行 ...
随机推荐
- shell脚本 Linux系统巡检
一.简介 源码地址 日期:2018/4/12 介绍:非常详细的Linux系统巡检脚本,截图为一部分输出 效果图: 二.使用 适用:centos6+ 语言:中文 注意:无 下载 wget https:/ ...
- 一文详解面试常考的TopK问题
首发公众号:bigsai ,转载请附上本文链接 前言 hello,大家好,我是bigsai哥哥,好久不见,甚是想念哇! 今天给大家分享一个TOPK问题,不过我这里不考虑特别大分布式的解决方案,普通的一 ...
- 为什么没有APS排产的MES是没有灵魂的?
ERP系统在于对整个企业与集团企业间的全面管控,APS系统是生产规划及排程系统,MES系统重点在于车间现场的管理,下面用最简单方式讲讲ERP系统.APS系统和MES系统之间的区别与联系. 没有APS计 ...
- CF157A Game Outcome 题解
Content 有一个 \(n\times n\) 的矩阵,每个元素都有一个权值.求所有满足其所在纵列所有元素权值和大于其所在横列所有元素权值和的元素个数. 数据范围:\(1\leqslant n\l ...
- python enumerate枚举用法总结
enumerate()说明 enumerate()是python的内置函数enumerate在字典上是枚举.列举的意思对于一个可迭代的(iterable)/可遍历的对象(如列表.字符串),enumer ...
- 【C语言】Socket发送HTTP-TCP请求,数据有字符串插入
问题描述: 场景:编写Socket接口,向LOKI发送POST请求查询数据 BUG发现位置:通过cJSON读取时间戳,发现被截断. 现象:通过read()去读取返回的数据,数据行中被插入字符:如下 c ...
- 【LeetCode】703. Kth Largest Element in a Stream 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 小根堆 日期 题目地址:https://leetco ...
- Multiple(poj1465)
Multiple Time Limit: 1000MS Memory Limit: 32768K Total Submissions: 7183 Accepted: 1540 Descript ...
- hdu-4561 连续最大积( 水题)
http://acm.hdu.edu.cn/showproblem.php?pid=4561 求连续最大积. 他妈的狗逼思路到底咋说..... 思路是 %&*()*(&--))*)*& ...
- Python 英语单词本
python pymysql re requests socket库的简单运用 要考试了,这里用所学的知识做一个实例 pymysql库 这个库是用来连接数据库的,使用数据库语句在python里创建表和 ...