Kubernates中的pod

2021/06/29

Tags: Kubernates

摘要:运行在Kubernates中的容器:pod。由于不能将多个进程聚集在一个单独的容器中,我们需要一种更高级的结构将容器绑定在一起,将它们作为一个单元进行管理,这就是pod诞生的原因。


pod基本概念

pod是Kubernetes中最重要的概念,pod是Kubernetes中部署的最小单元,一个pod中可以有一个或多个容器,pod有自己独立的私有IP和主机名。

Kubernetes 集群中的 Pod 主要有两种用法:

一般情况下,如果不是多个容器需要共用net或volume,尽可能地把不同的容器放到不同的pod中,新建一个pod不需要耗费很多资源,Kubernetes可以很方便地对pod进行管理和扩容、缩容等操作,这种方式可以更好地利用基础资源。

总结来说,pod就是逻辑上的主机。

pod生命周期

创建pod流程

  1. 客户端提交Pod的配置信息(可以是yaml文件定义好的信息)到kube-apiserver;
  2. Apiserver收到指令后,通知给controller-manager创建一个资源对象;
  3. Controller-manager通过api-server将pod的配置信息存储到ETCD数据中心中;
  4. Kube-scheduler检测到pod信息会开始调度预选,会先过滤掉不符合Pod资源配置要求的节点,然后开始调度调优,主要是挑选出更适合运行pod的节点,然后将pod的资源配置单发送到node节点上的kubelet组件上。
  5. Kubelet根据scheduler发来的资源配置单运行pod,运行成功后,将pod的运行信息返回给scheduler,scheduler将返回的pod运行状况的信息存储到etcd数据中心。

删除pod流程

  1. pod从service的endpoint列表中被移除;
  2. 如果该pod定义了一个停止前的钩子,其会在pod内部被调用,停止钩子一般定义了如何优雅的结束进程;
  3. 进程被发送TERM信号(kill -14);
  4. 当超过优雅退出的时间后,Pod中的所有进程都会被发送SIGKILL信号(kill -9)。

pod常用命令

kubectl describe po cluster-admin-0 -n default # 获取指定namespaces下的pod详情,可以看出container信息
kubectl get pods --all-namespaces # 获取所有namespaces下的pod
kubectl get pods -n default # -n 获取指定namaspaces下的pod
kubectl get pod podname -nkube-system -oyaml # 获取pod的详情,-oyaml 以yaml格式输出,也可以 -ojson
kubectl exec -it taskcenter-0 -c loglistener -noceanus /bin/bash # 进入某个pod下的cotainer
kubectl logs tke-log-agent-2687c -c loglistener # 获取某个pod下cotainer的log,也可以加 -f 参数,类似于 tail -f

创建pod的方式

pod本身不具备故障重启以及副本等功能,一般使用其他的资源创建pod。

参考:

https://kubernetes.io/zh/docs/concepts/workloads/pods/

《Kubernetes in Action》