一、什么是容器

容器实质上是一个进程,只是这个进程通过linux提供的namespace机制进行了隔离,以及通过cgroups限定了这个进程可以占用的系统资源。而且容器进程就代表我们的应用本身,并没有一个专门的容器应用,容器只是帮我们在启动我们的进程之前,帮我们做了一些隔离和资源限制地设置。(容器是一个单进程的模型,即容器所代表的这个进程,运行的就是我们要跑的程序本身。)

  • 容器通过 PID namespace,使得在容器自己看来,自己是PID=1的进程,但是在宿主机上容器进程PID还是原来的。
  • 容器通过 network namespace,屏蔽了网络设备
  • 容器通过Mount namespace,屏蔽了宿主机上的文件系统,并通过chroot命令,将容器进程的根目录挂载到指定的文件夹,这样容器进程在启动时在宿主机创建一个文件夹,并通过chroot命令将容器进程的根目录指定为这个文件夹 (其实就是将镜像所组成的rootfs文件系统挂载到容器的根目录上)。
  • 容器通过在/sys/fs/cgroup目录下,自动创建一个资源限制组,然后将容器的PID写入控制组,从而实现容器的资源限制

注意:

  • 由于容器只是一个特殊的进程,所以容器会和宿主机其他进程共享内核,所以有一些无法被namespace隔离的资源就需要谨慎对待,比如时间。

二、什么是容器镜像

容器镜像实际上就是一个联合文件系统rootfs(linux的文件系统是一个目录树,每个目录可以挂载别的文件系统,所以可以将rootfs挂载到容器进程的某个目录上,并更改那个目录作为容器进程所能 “看到” 的根目录)

之所以采用联合文件系统是为了最大程度的重用已有的文件,即docker的镜像是分层的,基础层是整台宿主机共享的,只读的,容器可以更改的只有最上面的读写层,删除基础层的文件也只是在读写层创建一个whiteout文件,将基础层的对应文件给覆盖掉,类似于隐藏文件。

容器在读写层之下,基础层之上用于存储那些容器进程启动要用到,但是提交景象又不需要的一些参数的Init层,该层用于操作比如启动进程绑定的端口号等等,这些参数启动容器需要,但是提交镜像又要剥离出去,所以在读写层和基础层之外,因为读写层的内容生成新的镜像后,就会成为新镜像基础层的一部分。

在这里插入图片描述

三、什么是Volume

Volume实质上就是挂载操作,在Mount namespace将挂载镜像之前,容器是可以看到宿主机的目录的,但是宿主机看不到容器进程的目录,此时通过挂载操作,将宿主机的某个目录对应的inode挂载到容器的某个目录下(此时对该目录操作,只影响宿主机,不影响容器镜像),从而实现容器往这个目录中存储东西,容器销毁后,宿主机依然保留。

由于这个挂载点被Mount namespace屏蔽了,宿主机是不知道容器进程内部的目录结构是什么样子的。(底层原理是什么呢? 宿主机和容器看到的目录表不同?目录表存储的内容不一样?)

四、什么是k8s、Pod

k8s是一个管理容器、编排容器的平台,将容器比作云计算平台的进程,k8s则是云计算平台的操作系统。

k8s分为master节点和node节点,master节点管控整个集群,包括 api server、scheduler、controller、etcd几个部分,node包括kublet、容器运行时、kube-proxy等几部分。

需要注意,master节点上的组件都是通过容器方式运行的,所以master和普通node的区别只是容器中运行的程序不一样。(所以master节点也是一个node节点,只是不可被调度而已——通过打上“污点”实现,所以master节点也有kublet组件),kublet组件是k8s最核心的组件。

master的容器是如何启动的呢?

  • 通过kublet以static pod的方式启动,k8s集群在启动时,kubelet会扫描某个固定的目录,把那个目录下的声明api对象的yaml文件读取并生成对应的pod。

pod又是什么呢?

  • pod是为了解决超亲密关系的,即有可能几个进程他们需要共享网络、磁盘等资源,此时将他们放到一个命名空间下,当作一个单位来进行调度,这就是pod。pod是一个逻辑上的概念,实质就是一组共享某些资源的容器进程。类似于云计算平台上的一台虚拟机。
  • 如何实现呢?其实就是pod所属的这几个容器被当作原子单位分配一个node,然后k8s为他们配置共享的网络命名空间,共享的volume等等

五、k8s里的volume

容器的volume和宿主机绑定,但是k8s中容器恢复重启会被重新创建,可能会被调度到一个新的node上,所以k8s中的volume一般都是远程存储,即一个额外的公共存储。

六、k8s的控制器模式

七、k8s的网络原理

八、k8s的调度原理

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐