翻译自:https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/con...

概述

本文主要描述下在kubernetes的node节点中,kubelet管理container涉及到的environment。我们可以通过kubernetes cluster api来创建&管理container,那么kubernetes container environment则为集群中的container添加一些属性来描述一些集群信息

集群 可以通过这些 集群信息 来感知所创建的应用。此外,kubernetes container environment提供了一些“hook”,container可将这些hook作为可选功能来使用,就好比传统系统中来处理系统信号一样,这些hook的设计初衷是为了能够在kubernetes中更加简单方便的创建稳定可扩展的应用。

另一个关于container environment的重要部分是关于 container内部使用的“文件系统”。在kubernetes中,这个”文件系统“是一个image和多个volume的集合。

接下来的内容会聊聊 提供给container使用的 ”集群信息“ 、container和管理模块交互时使用的 hook 以及 对应的生命周期。

容器信息(Cluster Information)

在container的environment中可分为两类,一类是描述container本身信息,另一类描述了系统中其他对象的信息。

container 信息(Container Information)

目前在container中,一个比较有用的environment是描述这个container所属pod的”pod name“。container的hostname被设置为这个 ”pod name“,可以通过hostname命令 或者 libc中的gethostname函数获取到。此外,用户自定义的environment同样可以在container被用户有效使用。

官方计划在将来扩充container environment所能包含的信息,比如 所能使用的memory、重启次数、已经任何能够从GET api获取到的信息。

集群信息(Cluster Information)

当一个container通过kubernetes api来创建时,当前kubernetes集群中所包含的所有service信息都被作为environment写入container内部。

比如,一个service叫做foo,他映射的container的端口为bar,那么对应的environment为:

FOO_SERVICE_HOST=<the host the service is running on>
FOO_SERVICE_PORT=<the port the service is running on>

官方会尽量保证每个service都有独立不变的ip,所以通过dns的形式来访问service是一个不错的方法。

Container Hooks

Container Hooks目前正在积极开放之中,官方想把他作为kubernetes管理系统中的可扩展插件。
Container Hooks为container提供了在其生命周期中所触发的event的信息。比如,当container 启动,触发了PostStart hook。它们和docker或者其他系统产生的event不同,比如,output event提供已经发生的事件的日志,input hook提供了正在发生的事情的实时通知,而不是已经发生的log。

Hook细节

目前有两个在使用的hook,两个推荐的hook:
PreStart - Proposed
在container创建前触发他,它将提供这样的信息:在本次调用结束后这个container将会被创建。 此hook没有参数传递给handler。

PostStart
在container创建后触发他。没有参数传递给handler

PostRestart - Proposed
当一个container restart时,而不失第一次start,在PostStart handler之前调用他。没有参数传递给handler。

PreStop
这个hook在一个container被终止之前被调用。这个事件handler是阻塞的,在消息发送给docker deamon来delete container之前完成。docker发送SIGTERM信号不会受影响。
一个名为”reason“的参数会发送给handler,表明是因为什么原因被终止,他的值有以下:

  • Delete :表明有一个api的调用来删除这个pod
  • Health :表明对这个container的健康检查失败了。
  • Dependency :这个container或pod的依赖丢失,因此这个container需要restart。比如,pod包含的container破坏,container在mount PD时操作磁盘失败等。

Hook Handler Execution

当一个hook被触发,系统将会调用所有被注册在这个hook上的handler。在一个pod所包含的container中,hook handler的执行是同步的。这意味着,hook handler将会阻塞管理模块发送的其他操作指令,如果hook handler被阻塞,接下来的管理操作命令(包括健康检查)都会被阻塞,直到handler完成。hook handler只会影响本pod,不会对其他pod造成影响。官方当然希望用户能够保持hook handler越简单越轻量约好,当然不排除也有需要较长时间执行的handler(比如 在容器停止之前保存当前的状态)。

(hook交付保证)Hook delivery guarantees

hook handler实现(Hook Handler Implementations)

hook handler是hook 操作处理container的方式。container选择他们希望的handler类型来执行。kubernetes目前提供两种hook handler类型:

  • Exec - 在容器的namespace/cgroup中执行指定的命令。如果命令最后输出”ok“,则被认为是处理正确,其他输出则被当做失败(将会触发kubelet重启container)。参数以传统linux的方式被传递给指令,比如pre-stop.sh --reason=HEALTH
  • HTTP - 执行一个http请求。http的5xx错误或者无反应被当做是失败,参数以传统http请求的方式传递。

刘阳龙Herman
672 声望106 粉丝

Herman.Liu.1988.avi