怎么hack kubernetes的pod的启动停止?求方向


目前我们采用Kubernetes的rc来管理集群中的容器生命周期,replication controller能够帮助我们做到在集群中的一个pod挂掉时在集群上重新启动一个新的pod,还有pod副本数量的增加减少。

现在的我们碰到的问题是:

当每个pod启动时,我们有一段脚本给这个pod的container分配ovs的ip,这个还好一些,可以启动后慢慢完成,但在pod关闭时,我们需要关闭Tengine到这个pod的流量,并删除ip等等操作。

pod的启动和关闭影响到 这么几个操作,rolling update, resize, 等等。

目前考虑到的方案是监控etcd里面的event,但这个方式一个是滞后,还有是流量会中断。

是否可能hack kubernetes,或者Docker的某些地方,让pod在启动和关闭时触发调用我们自己的代码?
我阅读了部分kubelet源代码,但现在还没找到很好的切入点。

---------

后面如果我找到方案的话也会在这个贴内更新。
已邀请:

杨章显 - 思科系统运维工程师

赞同来自: FanLin 难易


hi,

在kubelet中,每个节点上Pod的变化主要由func (kl *Kubelet) syncLoop(updates <-chan PodUpdate, handler SyncHandler),func (kl *Kubelet) syncPod(pod *api.Pod, mirrorPod *api.Pod, runningPod kubecontainer.Pod) error和func (kl *Kubelet) killPod(pod kubecontainer.Pod) error这几个函数来控制。因此,如果想要在pod启动或者关闭时触发自己的代码,在这几个地方可以做些修改,仅作为参考:
  1. 如启动Pod时,事实上,启动pod时最先启动的是pod infra容器,即network容器,所以可以在启动network容器时调用特定代码,比如分配IP,这样其他容器就继承network容器的网络空间。所以可以在这个函数func (dm *DockerManager) CreatePodInfraContainer(pod *api.Pod, generator kubecontainer.RunContainerOptionsGenerator, runner kubecontainer.HandlerRunner) (DockerID, error)中做一些修改。
  2. 如果想在pod删除时做其他动作,比如删除你自己的IP,可以看看func (kl *Kubelet) killPod(pod kubecontainer.Pod) error这个函数,在删除network容器时调用额外的代码删除IP。


除此之外,你也可以把你分配IP地址的代码实现为k8s的network plugin, 这样k8s时会在pod启动或者删除时调用你的network plugin的逻辑来实现网络管理,而不需要你自己管理,具体你可以参看pkg/kubelet/network下面接口。建议使用这种,易于扩展,松耦合,好管理。

希望能给你带来点启发。

FanLin - Docker&CoreOS爱好者

赞同来自:


从 Docker 层面有一个可能的思路是在 Dockerfile 指定 ENTRYPOINT 为一个脚本文件,然后在脚本文件里加上特定信号的捕捉器,在捕捉器里面处理 Pod 退出时的逻辑。

例如这个入口脚本就用了类似的功能。
function shutdown {
->  退出时的清理工作...
}
trap shutdown SIGTERM SIGINT  #注册信号捕捉器 

不确定 Kubernetes 关闭 Pod 时候,容器的入口程序会不会收到特定的信号。只是想到这么个点子,提供一个思路,没有实际测试过,不一定可行。

要回复问题请先登录注册