技术笔记分享

Pod介绍

Kubernetes并不直接运行容器,而是使用一个抽象的资源对象来封装一个或多个容器,这个抽象就被称为 Pod,它也是 Kubernetes 的最小调度单元,在Kubernetes中,容器不称为我们之前在Docker中所谓的容器,而是被称为 Pod。同一个 Pod 中可以有多个容器并且同一个Pod中的多个容器共享网络名称和存储资源,这些容器可通过本地回环接口 lo 直接通信,但彼此之间又在 Mount、User、PID等名称空间上保持了隔离。尽管 Pod 中可以包含多个容器,但是作为最小调度单元,它应该尽可能的保持 “小”,所以通常一个Pod中只有一个主容器和其它辅助容器,辅助容器指的是(Filebeats、zabbix_agent客户端等)。

Pod存在的意义

Pod主要为亲密性的应用而存在,例如像Nginx+PHP架构,应用+辅助容器,Nginx+Filebeats等类型的容器。

亲密性应用场景:

  • 两个应用之间发生文件交互,例如filebeats要读取nginx日志文件进行收集

  • 两个应用需要通过127.0.0.1或者socket通信,例如nginx+php需要通过lo接口或者socket通信

  • 两个应用需要发生频繁的调用

Pod的实现机制与设计模式

众所周知,容器之间是通过Namespace隔离的,Pod要想解决上述应用场景,那么就要让Pod里的容器之间高效共享,那么Pod之内的容器是如何进行网络共享的呢?

1.Pod之内的多个容器是怎么进行网络共享的呢?

kubernetes的解法是这样的:会在每个Pod里先启动一个infra container小容器,然后让其他的容器连接进来这个网络命名空间,然后其他容器看到的网络试图就完全一样了,即网络设备、IP地址、Mac地址等,这就是解决网络共享问题。在Pod的IP地址就是infra container的IP地址。

  • 1.k8s会在创建真正的业务容器钱在Pod中创建一个基础容器(infra container)的容器。

  • 2.然后让后创建的业务容器连接到基础容器中,一个Pod中的其它所有业务容器共享基础容器的网络、IP地址、Mac地址等。

  • 3.基础容器的IP地址就是Pod的IP地址。

  • 4.Pod启动的时候,无论Pod中有几个容器,都会创建一个基础容器(infra container),这个基础容器使用的是pause镜像,容器名称也被叫做pause,这个容器非常小,主要取决于它的镜像docker image只有几百kb, pause镜像使用汇编语言编写。

undefined

测试网络

我们在一个Pod中启动nginx和centos容器,然后在centos中通过lo接口访问nginx的80端口

pod被调度到了node1上,我们去node上可以查看由k8s启动的容器,有nginx-network和centos-network容器之外,还有基础容器infra container

在master节点上进入centos容器,然后通过lo接口访问nginx来进行测试

2.容器之间共享存储

一个Pod中有两个容器,一个是nginx,另一个是centos容器,那么centos容器就需要读取nginx的日志文件,这个时候就需要让logstash容器读取到nginx容器的日志文件。k8s通过volume将nginx日志文件挂载出来,在本地宿主机生成一个目录,然后centos容器再将挂载出来的日志目录挂载到它自己的容器中,这样就实现了两个容器共享一个文件。

通过一个yaml配置清单实现一个pod中多容器

写一个yaml配置清单并观察这两个容器的网络和存储是否像上面描述的一样。
下面清单中启动了两个容器,分别是nginx和centos容器,nginx容器循环每个一秒往/data/hello文件中写入1-100个数字,写到100个数字即停止,然后由Pod默认的重启策略将Nginx容器重启,重启后再次从1写入到100,以此循环,并且nginx容器挂载了名称为data的卷,挂载到/data目录。

centos容器也挂载了名称为data的卷,并且挂载到了/data下,同时指定命令动态查看 /data/hello 文件

查看centos-volume容器的日志可以看到正在动态查看我们指定的命令

undefined

我们在宿主机上可以找到容器中挂载的目录及在挂载目录中写入的文件

在Pod运行的Node主机上,进入 /var/lib/kubectl/pods/目录下,然后使用docker ps 命令查看容器生成的ID,通过ID在当前目录下进入后即可找到挂载的目录,如下图所示:

undefined

发表评论

邮箱地址不会被公开。 必填项已用*标注