龙空技术网

单一Pod上的容器是怎么共享网络命名空间的?

愿从心出发 217

前言:

当前朋友们对“apache服务启动脚本”可能比较关心,大家都想要了解一些“apache服务启动脚本”的相关内容。那么小编在网络上网罗了一些有关“apache服务启动脚本””的相关资讯,希望同学们能喜欢,各位老铁们快快来学习一下吧!

容器和虚拟机比较

虚拟机在基础架构之上有一个虚拟机监控的程序,在它上面会有不同的操作系统,在不同的操作系统之上再运行独立的应用程序;采用容器技术的好处是运行相同的应用程序,使用容器额外开销比较少,这也是它比较受欢迎的原因;

docker有个后台进程使用containerd,它是专门用来管理容器以及容器镜像的一个应用,当然这个容器镜像要符合OCI(开放容器标准),它会通过runc进行一个解包的处理,runc是专门用来运行容器中应用的。

容器技术的核心功能

命名空间(Namespace)

Linux命名空间提供了一种内核级别隔离系统资源的方法,通过将系统的全局资源放在不同的Namespace中来实现资源隔离的目的。

文件系统隔离进程隔离网络资源隔离用户和用户组隔离主机名和域名隔离进程间通信隔离

控制组(CGroup)

Linux控制组是一个内核功能,用于限制,记录和隔离一个或多个进程,对CPU、内存、磁盘I/O、以及网络的使用量及访问。

限制进程组可以使用的资源数量进程组的优先级控制,比如给特定进程组分配特定的CPU使用率记录进程组使用的资源数量进程组控制,比如将进程组挂起和恢复

其实进程和进程之间是运行在同一个操作系统之上的,所谓的隔离是逻辑上的隔离,通过这两种技术可以起到限制进程使用资源的目的。

启动了一个apache pod。

这是当前k8s集群里使用到的容器,其中很多是系统容器不需要管。

容器列表里面有很多pause这样的容器镜像所启动的容器,所启动的apache容器和某一个pause容器共享一个网络命名空间。

查看某个容器的描述,

这是进程的相关配置,其中entrypoint.sh是apache的启动脚本,

这个是命名空间配置,隔离apchae所使用的命名空间,pid是apache进程本身在整个进程树上是根进程,network是apache进程通信的网络隔离。

网络命名空间依赖446476这个进程,

可以看到apache本身的进程是446531,很明显apache的网络是由446476这个进程所影响的,那这个进程是什么?

看下这个进程的状态,

发现这个进程目前处理sleeping状态,本身不干活,那么它存在的意义是什么?

集群节点上运行着linux操作系统,在上面运行所有的容器在逻辑上是隔离的,是因使用了命名空间和控制组这样的技术。

当前机器本身就是k8s集群的一个node节点,

直接通过ps命令可以看到apache和pause这样的进程,因为它是运行在本机操作系统上的进程,但是pause进程在启动的时候,会创建各种各样的命名空间,从而把pause这个进程隔离起来,从而把它视为运行在一个独立的操作系统上的一个进程,然后它进入了一个休眠的状态,它的任务已经完成了。

后面启动的apache进程在某些命名空间上会attach到这个pause命名空间,2个命名空间关联起来,apache也可以把自己看作一个独立在操作系统中的一个进程。

pause创建了命名空间,apache的进程关联到这个命名空间中。

k8s的pause首先会启动pause这个进程去创建一个命名空间,然后在k8s的pause里面,无论有多少个container,都会共享同一个命名空间,比如共享一个网络命名空间,它有独立的端口范围、主机名,路由。

从pod的角度来看它就是一个pod在运行,其实这个pod里面的所有的容器通过共享命名空间来实现一个独立的封装,也就是说封装在pod里面的这些进程它们彼此之间都是可以共享同一个命名空间。

首先模拟一下启动pause这样一个进程从而创建各种各样的命名空间,

做了一个docker镜像用来模拟pause容器,

把容器里面的8080端口暴露在主机的80端口上,运行容器了之后,直接删除镜像,

这个容器本身有它独立的命名空间,后面就需要一个应用的容器关联到这个pod上,这里用了一个python的容器 ,python比较容易启动web服务,

新启动的python的容器,本身会attach到pause容器上,本身和pause容器共享同一个网络命名空间,

python容器把80应用跑起来了,进入python里面,发现机器名和pause共享同一个机器名,因为在run python的时候并没有指定host name,而是运行pause的时候指定的,

在python容器中启动一个web服务,

当把web server跑在apache容器上,它实际上和pause容器共享了同一个网络命名空间,

再启动一个python容器,

依然使用8080端口,会有端口冲突。

在一个容器里面生成新文件,在另外一个容器里面是没有这个文件的,说明文件系统是独立的,但是网络空间却是共享的。

总结

容器是通过命名空间相互隔离的系统进程K8s pod是一个抽象的概念,使用Pause容器创建命名空间并与用户进程容器共享在一个K8s pod中用户进程容器之间通过网络命名空间交换网络数据在一个K8s Pod中用户进程容器共享同一主机名、端口范围、网络路由一个node上启了10个pause,并且每个pause里面有10个容器,其实本质上来讲在操作系统上启动了100个进程,只不过通过命名空间的方式把它们进行分组进行隔离。

标签: #apache服务启动脚本