Pod概念

深入理解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里的所有容器,共享网络和存储。
img

共享网络:

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写的不规范,应用程序不是主进程
原文地址:https://www.cnblogs.com/Spider-Man-1/p/12739839.html