CKA每日一题——第8天 | initContainer概念、用法、使用场景简介

小玄儿
• 阅读 767
本活动在微信公众号【我的小碗汤】上举行,有送书活动!这里参与答题不能参与到送书活动哦!

昨日考题

提供一个pod的yaml,要求添加Init Container,Init Container的作用是创建一个空文件,pod的Containers判断文件是否存在,不存在则退出
注意:附带Pod完整yaml

昨日答案

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: cka-1126
  name: cka-1126
spec:
  initContainers:
  - image: busybox
    name: init-c
    command: ['sh', '-c', 'touch /tmp/cka-1126']
    volumeMounts:
    - name: workdir
      mountPath: "/tmp"
  containers:
  - image: busybox
    name: cka-1126
    command: ['sh', '-c', 'ls /tmp/cka-1126 && sleep 3600 || exit 1']
    volumeMounts:
    - name: workdir
      mountPath: "/tmp"
  volumes:
  - name: workdir
    emptyDir: {}

主Container的command就是判断文件是否存在,存在则不退出,不存在则退出;也可以用以下if判断:

command: ['sh', '-c', 'if [ -e /tmp/cka-1126 ];then echo "file exits";else echo "file not exits" && exit 1;fi']

昨日解析

本题的关键点是init容器与主容器需要共同挂载一个名为workdir的目录,init容器在里面创建一个空文件,主容器去检验文件是否存在,检验主要用的是shell的语法;

command: ['sh', '-c', 'ls /tmp/cka-1126 && sleep 3600 || exit 1']

这句话意思是:如果ls /tmp/cka-1126返回码为0,即文件存在,将sleep 3600秒;否则exit 1退出;

也可以用shellif语法判断。

官方文档地址:
https://kubernetes.io/docs/ta...
https://kubernetes.io/docs/co...

梳理概念

初始化容器,顾名思义容器启动的时候,会先启动可一个或多个容器,如果有多个,那么这几个Init Container按照定义的顺序依次执行,一个执行成功,才能执行下一个,只有所有的Init Container执行完后,主容器才会启动。由于一个Pod里的存储卷是共享的,所以Init Container里产生的数据可以被主容器使用到。

Init Container可以在多种K8S资源里被使用到如Deployment、Daemon Set、StatefulSet、Job等,但归根结底都是在Pod启动时,在主容器启动前执行,做初始化工作。

Init 容器支持应用容器的全部字段和特性,包括资源限制、数据卷和安全设置。然而,Init 容器不支持 Readiness Probe,因为它们必须在 Pod 就绪之前运行完成;在资源限制、调度方面也会略有不同。

应用场景

等待其它模块Ready:比如有一个应用里面有两个容器化的服务,一个是Web Server,另一个是数据库。其中Web Server需要访问数据库。但是当我们启动这个应用的时候,并不能保证数据库服务先启动起来,所以可能出现在一段时间内Web Server连接数据库错误。为了解决这个问题,我们可以在运行Web Server服务的Pod里使用一个InitContainer,去检查数据库是否准备好,直到数据库可以连接,Init Container才结束退出,然后Web Server容器被启动,发起正式的数据库连接请求。

初始化配置:比如集群里检测所有已经存在的成员节点,为主容器准备好集群的配置信息,这样主容器起来后就能用这个配置信息加入集群;目前在容器化,初始化集群配置文件时经常用到;

提供一种阻塞容器启动的方式:必须在initContainer容器启动成功后,才会运行下一个容器,保证了一组条件运行成功的方式;

其它使用场景:将pod注册到一个中央数据库、下载应用依赖等。

Kubernetes 1.5 版本 开始支持在annotations下用pod.beta.kubernetes.io/init-containers申明initContainer,像以下这样。

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
  annotations:
    pod.beta.kubernetes.io/init-containers: '[
        {
            "name": "init-myservice",
            "image": "busybox",
            "command": ["sh", "-c", "until nslookup myservice; do echo waiting for myservice; sleep 2; done;"]
        },
        {
            "name": "init-mydb",
            "image": "busybox",
            "command": ["sh", "-c", "until nslookup mydb; do echo waiting for mydb; sleep 2; done;"]
        }
    ]'
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']

Kubernetes 1.6 版本的新语法将 Init 容器的声明移到 spec 下,但是老的 annotation 语法仍然可以使用。

今日考题

创建Secret名为cka1127-secret,内含有password字段,值为cka1127,然后在名为cka1127-01的Pod1里使用ENV进行调用,名为cka1127-02的Pod2里使用Volume挂载在/data 下;
注意:提交评论:包含命令和yaml,以及注意点。可分多次评论。

作者简介

作者:小碗汤,一位热爱、认真写作的小伙,目前维护原创公众号:『我的小碗汤』,专注于写linux、golang、docker、kubernetes等知识等提升硬实力的文章,期待你的关注。转载说明:务必注明来源(注明:来源于公众号:我的小碗汤, 作者:小碗汤)

作者简洁

作者:小碗汤,一位热爱、认真写作的小伙,目前维护原创公众号:『我的小碗汤』,专注于写go语言、docker、kubernetes、java等开发、运维知识等提升硬实力的文章,期待你的关注。转载说明:务必注明来源(注明:来源于公众号:我的小碗汤,作者:小碗汤)
点赞
收藏
评论区
推荐文章
艾木酱 艾木酱
4年前
10.24程序员节!你盖楼,我送书~还能抽iPhone13!
每年10月24日被定义为程序员节。以一个节日的形式,向通过Coding改变世界,也以实际行动在浮躁的世界里,固执地坚持自己对于知识、技术和创新追求的程序员们表示致敬。2021年的程序员节这么快就来了,「」在这里祝程序员们节日快乐!10.24当天,凡是本平台()的注册用户,凭注册时使用的手机号即可参加“你盖楼,我送书”的活动。重点来了~第1、2
艾木酱 艾木酱
4年前
双十一盖楼大挑战,送书送资源再抽iPhone13!
特别的日子,需要特别的仪式~快来盖楼有大奖!活动期间,向「MemFireDB」公众号后台发送指定口令,即可参与双十一盖楼大挑战,送书再抽iPhone13的活动~活动详情No.111的快乐活动时间:11月08日11月11日抽到第11、22、33、44、55、66等楼层数为11的N倍的用户,将本篇文章或活动海报分享到朋友圈后,均可从下方任意挑选一本自己感兴
onlyloveyd onlyloveyd
5年前
Compose Weekly #2:Countdown Timer
本文同步发表于我的微信公众号,在微信搜索OpenCVorAndroid即可关注。前言最近Android官方发起了JetpackCompose的推广活动:JetpackCompose开发者挑战赛。活动时间一个月,每周一题,广大开发者根据官方需求,Clone官方模板工程并使用JetpackCompose技术结题后按要求提交,即可参与活动。
onlyloveyd onlyloveyd
5年前
Compose Weekly #1: 小狗领养应用
本文同步发表于我的微信公众号,在微信搜索OpenCVorAndroid即可关注。前言最近Android官方发起了JetpackCompose的推广活动:JetpackCompose开发者挑战赛。活动时间一个月,每周一题,广大开发者根据官方需求,Clone官方模板工程并使用JetpackCompose技术结题后按要求提交,即可参与活动。
Stella981 Stella981
4年前
Exceptionless
<divid"cnblogs\_post\_body"class"blogpostbodycnblogsmarkdown"<h1id"exceptionless.netcore开源日志框架"Exceptionless.NetCore开源日志框架</h1<blockquote<p作者:markjiang7m2<b
Wesley13 Wesley13
4年前
Java 并发编程
!file(https://img2018.cnblogs.com/blog/1411156/201908/14111562019083017335711525785135.jpg)<br/作者|加多<br/<br/关注阿里巴巴云原生公众号,后台回复关键字\\“并发”\\\\,即可参与送书抽奖!<br/
Wesley13 Wesley13
4年前
2019年度总结与2020展望【文末送书活动】
点击上方“中间件兴趣圈”,选择“设为星标”做积极的人,越努力越幸运!时光匆匆而过,2019即将逝去,迎来充满希望的2020年。回顾2019,中间件兴趣圈公众号始终坚持初心:为大家分享优质的原创技术文章,共同构建高质量的技术交流圈。2019中间件兴趣圈不仅陆续发表了Dubbo、ElasticJob、RocketMQ、
Wesley13 Wesley13
4年前
Java 8 停止维护,Java 9 难产,IDEA 2018 发布,还有……
祝大家五一劳动节快乐,工作顺利!又到了总结上个月干货的时候了,这个月我们带来了各种Java技术干货,各种送书抽奖福利,各种面试题分享,各种最新动态资讯等。5.1重磅活动|区块链免费送书&星球特价(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.
Stella981 Stella981
4年前
2019年前端开发前景如何?前端开发会被淘汰吗?
后台回复“送书”,免费参与送书活动在之前一段时间,网传有个技术团队做了个移动端的APP,发布上线时候称可以直接生成网页效果,于是有很多人一下子慌了。最近就有不少人纷纷来问李老师,“现在手机APP可以直接生成网页了,都可以取代前端开发工程师的工作了,以后APP发展越来越厉害,前端开发工程师的产品应用是不是
Wesley13 Wesley13
4年前
PHP算法之判断是否是质数
<h3质数的定义</h3<blockquote质数又称素数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数。</blockquote<h3实现思路</h3<p循环所有可能的备选数字,然后和中间数以下且大于等于2的整数进行整除比较,如果能够被整数,则肯定不是质数,相反,就是质数。</p<h3第一种算
可莉 可莉
4年前
2019年前端开发前景如何?前端开发会被淘汰吗?
后台回复“送书”,免费参与送书活动在之前一段时间,网传有个技术团队做了个移动端的APP,发布上线时候称可以直接生成网页效果,于是有很多人一下子慌了。最近就有不少人纷纷来问李老师,“现在手机APP可以直接生成网页了,都可以取代前端开发工程师的工作了,以后APP发展越来越厉害,前端开发工程师的产品应用是不是