Pod的概念和组成
在安装k8s的文章中提到说,k8s在创建Pod的时候,需要拉取一个gcr.io/pause:2.0
的镜像。
Pod是K8s的基本概念。每个Pod都有一个特殊的被称为“根容器”的Pause容器。除了Pause容器,每个Pod内还有一个或多个用户的业务容器。如图所示:
那么,为什么K8s需要会设计出一个全新的Pod的概念并且Pod有这样的特殊的组成结构?
- 在一组容器作为一个单元的情况下,很难对“整体”简单地进行判断及有效地进行行动。例如,一个容器挂了,此时算是该容器组都挂了吗?引入业务无关的Pause作为Pod的根容器,以它的状态代表整个容器组的状态,可以简化该问题。
- Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂接的Volume。这样既简化了密切关联的业务容器之间的通信问题,也很好的解决了他们之间的文件共享问题。
K8s中的Pod分为两类:
- 普通Pod
- 静态Pod
普通Pod
普通Pod一旦被创建,就会被存入etcd中。之后,会被K8s Master调度到某个具体的Node上进行绑定,接下来被Pod被对应Node上kubelet进程实例化成一组相关的Docker容器并启动起来。在默认情况下,当Pod里的某个容器停止时,K8s会自动检测到问题并且重新启动这个Pod,如果pod所在Node宕机,则会将这个Node上的所有Pod重新调度到其他Node节点上。
静态Pod
与普通Pod不同,静态Pod并不会保存在K8s的etcd中,而是存放在某个具体Node上一个文件内,并且只在此Node上运行。
创建静态Pod有两种方式:配置文件方式和HTTP方式。
配置文件方式
设置kubelet的启动参数 --config
, 指定kubelet需要监控的配置文件所在的目录,kubelet会定期扫描该目录中.yaml或者.json文件。
修改kubelet配置,增加 KUBELET_ARGS="--config=/etc/kubelet.d/"
, 重启kubelet
在 /etc/kubelet.d/
添加static-pod.yaml
|
|
结果如图 static-pod-127.0.0.1:
由于静态Pod无法通过API Server管理,所以在master
节点是无法删除该Pod的.
如果要删除该Pod,只需要配置文件从/etc/kubelet.d/
目录删除即可。
HTTP配置方式
通过设置kubelet的启动参数--manifest-url
, kubelet将会定期懂该URL地址下载Pod的定义文件,并以yaml或者json的格式进行解析,然后创建Pod。