Kubernetes系列(2)—— 深入理解Pod
我们知道,容器编排是整个Kubernetes的核心所在,而Pod又是编排的核心所在,所以,理解好Pod,才能理解整个Kubernetes的编排。
下面我们重点对于Pod做个详细的解析。
一.Docker简介
在详细进行Pod分析之前,有必要对Docker做个简要的归纳,因为对于Kubernetes来说,docker容器才是真正需要去管理的对象,离开了容器空谈编排,无异于空中楼阁。
那么我们首先来简单梳理一下容器&Docker相关的知识点:
1.基本概念
• 直译为“集装箱”,作用在于将货物打包,并且能够做到相互隔离。

国内有个高大上的译名为“容器”,相信如果你周末报个小班,跟你女朋友说,我去学集装箱。。。
• 软件开发/部署经历的3个阶段:
物理机——VM——容器
物理机时代,很多人甚至很多团队共同使用一套开发环境,这使得对于资源的使用经常出现争抢的情况,而且对于系统的配置会因为项目需要经常变更,导致其他人员出现各种问题。且一旦开发环境出现机器故障,需要一个很长的修复时间,甚至需要整个环境重新配置,严重情况下会出现数据丢失等等
VM时代,很好的解决了上述的物理机问题,将一台物理机隔离开,每个人有独立的工作空间,不会相互干扰,但是由于每个VM需要一个底层的操作系统支撑,导致我们每个物理机上能隔离开的VM不会太多,一台性能好的物理机能隔离出10几个虚拟机已经是很优秀的配置了。
容器时代,Docker的出现,很好的解决了VM对于操作系统强依赖的问题,Docker的隔离机制使得底层的操作系统在容器间可以共享,并且在共享操作系统的文件被修改时不会影响到不相干的容器。

• Docker的架构图:

在Docker里面我们需要清楚3个重要的概念:

• Image(镜像): 由文件系统叠加而成,最底端是一个文件引导系统,即bootfs。Docker用户不会与引导文件系统有直接的交互。Docker镜像的第二层是root文件系统rootfs,通常是一种或多种操作系统,例如ubuntu等。在Docker中,文件系统永远都是只读的,在每次修改时,都是进行拷贝叠加从而形成最终的文件系统。Docker称这样的文件为镜像。

镜像的特征是:所有层都是只读的,除了最底层,其他层都有一个指针指向下一层。
• Container(容器):定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

• Repo(仓库):Docker官方维护一个Common的专门存放Image的仓库,也可以创建自己的私有仓库用以保存自己的镜像。

2.常用指令:
• docker create <image-id>:用于创建容器,为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。
• docker start <container-id>:为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。
• docker run <image-id>:docker create + docker start
• docker ps –a :列出所有存在的容器(运行态和非运行态)
• docker images –a:列出了所有的镜像,也可以说是列出了所有的可读层。如果你想要查看某一个image-id下的所有层,可以使用docker history来查看。
• docker commit <container-id>:将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像。
二.Pod的基本用法
1.动态创建Pod
在使用Docker时,可以使用docker run命令创建并启动一个容器,在Kubernetes系统里面,对于长时间运行的容器是有要求的:主程序需要一直在前台执行,如果我们在docker里启用后台执行程序,那么在kublet创建包含这个容器的Pod之后运行完该命令,即认为Pod执行结束,将立刻销毁Pod。一旦我们使用ReplicationController,则系统会监测到Pod已经终止,会根据Pod的replicas的副本数量生成一个新的Pod,而一旦创建出新的Pod,就将在执行完后台启动命令后,陷入无限循环中。这就是Kubernetes需要我们自己创建的Docker镜像以一个前台命令作为启动命令的原因。
Pod的基本用法为:
• Pod可以由1个或多个容器组合而成,例如:

这个frontend Pod在启动成功以后,将启动一个Docker容器
• 另一个场景是,当frontend和redis两个容器应用为紧耦合关系时,应该组成一个整体对外提供服务:配置文件为:test.yaml

属于一个Pod的多个容器应用之间相互访问时仅需通过localhost就可以通信。也就是说,我们在容器name:frontend的php网页中嵌入:“localhost:6379”即可以对redis-master进行访问。
运行下列指令即可创建:

2.静态Pod:
静态Pod是由kublet进行管理的仅存在于特定Node上的Pod,他们不能通过API S而ver进行管理,无法与RC、Deployment进行关联,并且kubelet无法对其进行健康检查。
创建静态Pod有两种方式:配置文件方式和Http方式,这边不多做赘述~
三、Pod容器共享Volume
在同一个Pod中多个容器能够共享Pod级别的Volume。Volume可以被定义为各种类型,多个容器各自进行挂载操作,将一个Volume挂载为容器内部需要的目录:

此处设置的Volume名为app-logs,类型为emptyDir,挂载到tomcat容器内的/usr/local/tomcat/logs目录,同时挂载到logreader容器内的/log目录。如果tomcat往该volume下写文件的同时,logreader就可以开始读取文件了。