专栏首页我的小碗汤备战CKA每日一题——第8天

备战CKA每日一题——第8天

昨日考题

提供一个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/tasks/configure-pod-container/configure-pod-initialization/ https://kubernetes.io/docs/concepts/workloads/pods/init-containers/

梳理概念

初始化容器,顾名思义容器启动的时候,会先启动可一个或多个容器,如果有多个,那么这几个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,以及注意点。可分多次评论。

本文分享自微信公众号 - 我的小碗汤(mysmallsoup),作者:小碗汤

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 必须掌握的 | chrome开发者工具骚技巧

    对于每个前端从业者来说,除了F5键之外,用的最多的另外一个键就是F12了。最近大神(@小鱼二)推荐我一个网站,才知道chrome还有各种骚姿势。这个网站是:um...

    我的小碗汤
  • ElasticSearch学习笔记之原理介绍

    ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsear...

    我的小碗汤
  • Go语言 nil 的作用

    最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例都是来自于视频。

    我的小碗汤
  • Python读书笔记10(不可变列表-元组)

    今天和大家分享的内容较少,和大家介绍一个新朋友即可! 元组! 元组,何方神圣?他其实就是一个固执的列表而已。 一、元组的声明(小括号) ? 元组的声明是用小括...

    用户1332619
  • 2019年,希望所有的程序员都能逃过这些梗……

    作为一个资深的老程序员,我感觉我很有资格说这个话,不管你学的是Java、c++、PHP、安卓、IOS。只要你是程序员,你就绕不开这个梗。

    iOSSir
  • 设计模式-组合模式(Composite)

    定义 将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.

    高广超
  • 为什么高端人才会使用「拍卖」选工作?

    想象一下,当你在一个网站上递交你的简历后,你会像珐琅彩瓷一样被各个公司竞相拍卖,确定到合适的「买主」之后,专车把你送到面试的地点;入职当天,你会收到精心准备的小...

    Crossin先生
  • Request——Node世界中被依赖最多的库No.2

    Simplified HTTP request client,一个简单化的HTTP请求客户端,单单从字面上不太容易理解是用来做什么用的。 安装很容易npm i...

    用户1183026
  • 语义版本号(Semantic Versioning)

    发布于 2018-04-12 12:20 更新于 2018-06...

    walterlv
  • SpringBoot 看似复杂的Environment,其实很简单

    喜欢写代码,讨厌配环境 我相信这十个字的小标题代表了大多数码农的心声。 十年前读大学时,学校开设了C语言还有C++。但是学习这两种语言,对于新手来说非常没...

    Java3y

扫码关注云+社区

领取腾讯云代金券