【基础架构】K8s Container

原文:https://mp.weixin.qq.com/s?__biz=MzA4MjM3NzE5MQ==&mid=2649662355&idx=1&sn=df6e7ddc07cf1075a2b95bb8fcefd271&chksm=879ca31bb0eb2a0d92e3dd26cedcd7918253f0d3a082021774c42da1671f78993ed0bc752d76&cur_album_id=1987595953092034565&scene=189#wechat_redirect

一、Container简介

容器和虚拟机器一样,可以让我们将应用程序与依赖库及其他依附元件封装在一起,提供隔离的环境来执行软件服务。但对比VM而言,容器提供的是一种逻辑封装机制,能够将应用程序从实际执行所在环境中抽取出来。这种分离的方式可以便于轻松、一致地部署容器型应用程序。

  容器化提供了一种便利的分工模式,当开发人员专注于应用程序逻辑与依附元件时,IT运维团队可将注意力集中到部署与管理上,不用担心诸如特定软件版本与应用程式特定设定之类的应用程式细节。

  目前kubernetes 1.18 版本支持的容器类型为: 

 

 

 

   标准容器(主容器)、Sidecar容器、Init容器以及Ephemeral容器。

  在对4种类型的容器进行解析前,简单了解下Pod的生命周期。一个Pod的生命活动涉及到Container相关活动事件:

 

 

   上层展示了一个Pod的完整生命周期,包含Init Container、Pod Hook、健康检查等三个核心组成部分,整个Pod生命周期围绕“挂起(Pending)”、“运行中(Running)”、“成功(Succeeded)”、“失败(Failed)”以及“未知(Unknown)”等状态运行。

1、Pod Hook

  图中还有一个被称为“Pod Hook”的事件,由Kubelet发起,其在容器中的进程启动前或者容器的进程终止之前执行,我们可以同时为Pod中的所有容器都配置Hook(钩子)。K8s生态中提供了2中Hook函数:

  PostStart:此函数在容器创建后立即执行,主要用于资源部署、环境准备等。但是,并不能保证钩子将在容器ENTRYPOINT之前运行,因为没有参数传递给处理程序。不过需要注意的是,如果钩子花费太长时间以至于不能运行或者挂起,容器将不能达到Running状态。

  PreStop:此函数在容器终止之前立即被调用。主要用于优雅关闭应用程序、通知其他系统等。其基于阻塞模型,因此必须在删除容器的调用发出之前完成。如果钩子在执行期间挂起,Pod阶段将停留在Running状态并且永不会达到Failed状态。(这里存疑,pod有一个terminationGracePeriodSeconds时间,如果到达terminationGracePeriodSeconds时间PreStop仍然未执行完成,可能Pod仍然会结束)。

 

2、Init Container——初始化容器

  Init Container是一种特殊容器,在Pod内的应用容器启动之前运行。Init Container可以包括一些应用镜像中不存在的使用工具及脚本。

  Init Container作为预先型容器,主要做容器运行前的初始化工作,可以为一个或者多个,若为多个的话,这些容器会按依据定义的规则顺序依次执行。一个Pod里面的所有容器是共享数据卷和Network Namespace的,所以Init Container里面产生的数据可以被主容器使用到。从上面的Pod生命周期的图中可以看出初始化容器是独立于主容器之外的,只有所有的初始化容器执行完之后,主容器才会被启动。

  Init 容器能做什么?

  (1)Init容器可以包含一些安装过程中应用容器不存在的实用工具。例如,在容器运行过程中需要使用类似sed、awk、lsof、netstat或dig这样的工具,以便debug,可以将这些放到Init容器去安装这些工具;一些配置或者敏感信息也可以放到Init容器;

  (2)Init容器可以安全地运行指定的工具,避免类工具运行使得应用镜像的安全性降低;

  (3)Init容器能以不同于Pod内应用容器的文件系统试图运行;

  (4)Init容器必须在应用容器启动之前运行完成,因此Init容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内所有应用容器会并行启动。

  

3、Ephemeral Container——临时容器

  临时容器,在当前的Pod中临时运行,完成使命后自动销毁。由于缺少对资源或执行的保证,且永远不会自动重启,不适用于构建应用程序,通常借助其进行调试、问题排查等。临时容器使用与常规容器相同的ContainerSpec节进行描述,但很多字段不兼容且不允许。

  

4、Sidecar Container——边车容器

  K8S内置的Sidecar功能将确保边车在正常业务流程开始之前就启动并运行,即通过更改Pod的启动生命周期,在Init容器完成后启动Sidecar容器,在Sidecar容器就绪后启动业务容器,基于启动流程保证其顺序性。

 

5、Standard Container——标准容器

posted @ 2022-07-15 17:51  stay_heart  阅读(701)  评论(0)    收藏  举报