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 容器总是运行 ...
随机推荐
- 微信小程序项目使用npm安装vant-weapp的正确步骤,简单易懂!!
微信小程序项目使用npm安装vant-weapp的正确步骤 1.在当前小程序项目目录npm init -y 构建npm项目 2.运行命令 npm install vant-weapp -S --pro ...
- 数据脱敏 t-closeness介绍与实现
数据脱敏 t-closeness介绍与实现 本文主要基于t-closeness的首次提出团队Ninghui Li, Tiancheng Li, Suresh Venkatasubramanian发表的 ...
- 建立资源的方法(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 终于,进入第5章资源计划编制了,所以就不能还在任务工作表里厮混了是吧,那就先进入资源工作表吧:[任务]>[甘特图]& ...
- java File 类对操作系统文件目录进行操作:增删查
File类 1,概述 File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成. 2,构造方法 public File(Strin ...
- Java 数据类型:集合接口Map:HashTable;HashMap;IdentityHashMap;LinkedHashMap;Properties类读取配置文件;SortedMap接口和TreeMap实现类:【线程安全的ConcurrentHashMap】
Map集合java.util.Map Map用于保存具有映射关系的数据,因此Map集合里保存着两个值,一个是用于保存Map里的key,另外一组值用于保存Map里的value.key和value都可以是 ...
- ELK 使用filebeat替代Logstash收集日志
使用beats采集日志 之前也介绍过beats是ELK体系中新增的一个工具,它属于一个轻量的日志采集器,以上我们使用的日志采集工具是logstash,但是logstash占用的资源比较大,没有beat ...
- Python3 中bytes数据类型深入理解(ASCII码对照表)
bytes的来源 bytes 是 Python 3.x 新增的类型,在 Python 2.x 中是不存在的. bytes 的意思是"字节",以字节为单位存储数据.而一个字节二进制为 ...
- 系统丢包net.netfilter.nf_conntrack_max 超限查看
sysctl net.netfilter.nf_conntrack_max 查看限制 sysctl net.netfilter.nf_conntrack_count 查看当前是否超限 echo n ...
- 经验:如何使用replace而不丢失数据
背景:replace很好用,的应用场景比较多,但是直接使用可能会造成一引起字段的值丢失. 解决方法: 一.原始数据 select id,f1,f2 ,flag from update_test; id ...
- Spring核心原理之IoC容器初体验(2)
本文节选自<Spring 5核心原理> 1 IoC与DI基本概念 IoC(Inversion of Control,控制反转)就是把原来代码里需要实现的对象创建.依赖,反转给容器来帮忙实现 ...