深入理解Pod对象
Pod基本概念
- 一组容器的集合
- 一个Pod中的容器共享网络和存储
- Pod是短暂的
- 最小部署单元
Pod存在的意义
Pod解决多进程模型,为亲密性场景而存在(这里指的多进程模型,并不是容器只能运行一个进程,只是容器没有管理多个进程的能力,因为容器PID是它本身)
亲密性应用场景:
- 两个应用之间发生文件交互 (典型组合: WAR包+ Tomcat服务器,将WAR 包和 Tomcat服务器做成两个镜像,声明 hostPath类型的目录, WAR包容器只做拷贝包到宿主机目录)
- 两个应用需要通过127.0.0.1通信(典型组合:Nginx+PHP)
- 两个应用需要发生频繁的调用
Pod实现原理
Pod只是一个逻辑的概念,真正管理的还是Linux中的Namespace和Cgroups,并没有一个真正的Pod的边界或者隔离环境。
Pod里的所有容器,共享网络和存储。
共享网络:
Pod中会有一个中间容器,名字叫做Infra容器,镜像是pause, 这个Infra容器永远是第一个被创建的容器,用户容器可以加入到Infra容器的Network Namespace当中。
-
这就意味着 一个 Pod只有一个IP地址,就是这个Pod的Network Namespace对应的IP地址;
-
Pod的生命周期只和Infra容器有关,与 容器 A、B 无关;
-
Pod中的容器可以直接通过localhost进行通信;
共享存储:
这样,一个Volume对应宿主机的目录对于Pod来说只有一个,只要Pod挂载了这个宿主机目录,就可以直接挂载到容器中的指定目录
这时候都两个容器都声明挂载了shared-data这个Volume, 对应宿主机的目录是 /data ,这时候你在容器A创建出来的文件就会被挂载的容器B的目录当中;
Pod对象的生命周期
- Pending 这个状态意味着,Pod的YAML文件已经提交给了Kubernetes,API对象已经被创建并保存在ETCD当中. 但是这个Pod里的容器因为某种原因不能被顺利创建. 比如,调度不成功。
- Running 这个状态意味着,Pod已经调度成功,和一个具体的节点进行了绑定,它包含的容器都已经创建成功,并且至少有一个正在运行中。
- Succeeded 这个状态意味着,Pod里的所有容器都正常运行完成,并且已经退出,这种情况一般运行在一次性任务比较常见。
- Failed 这个状态意味着Pod里至少有一个容器以不正常状态退出,这种情况就要看容器的运行日志或者Pod的Events信息。
- Unknown 这个是个异常状态,这个Pod的状态不能持续被Kubelet回报给kube-apiserver,很可能是主从节点之间通信出了问题。
Pod的Running状态服务无法提供访问
- 有一些Pod的状态是Running,但是应用已经停止服务,一般有几个原因:
- 程序本身有 BUG,该返回200的时候,因为代码问题,返回500
- 程序因为内存问题,已经僵死,进程在,但是无响应
- 程序出现死循环
- Dockerfile写的不规范,应用程序不是主进程