从一个开发者角度理解k8s之一---Docker

Docker


k8s是基于容器的集群管理平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。而我们当前使用的容器大多数都是docker容器,并且k8s最底层的容器运行时实现就是docker。

以前说到docker,首先反应过来的一些概念是沙盒虚拟机,对于docker和虚拟机的区别,是不大了解的。

虚拟机的工作原理是通过Hypervisor的硬件虚拟化功能模拟出一个操作系统所需要的各种硬件,比如CPU\内存、I/O设备等,然后,在虚拟的硬件上安装了一个新的操作系统。这样的缺点是占用了非常多的资源。

而docker则是通过Linux两种基础技术:NamespaceCgroups实现了容器的隔离与限制功能。并不需要安装整个的操作系统。

Namespace

namespace

1.PID Namespace

我们都知道docker容器其实只是一种特殊的进程而已,因此只会有一个主进程,也就是1号进程。PID Namespace 的作用是用来隔离进程,利用 PID Namespace 可以实现每个容器的主进程为 1 号进程,而容器内的进程在主机上却拥有不同的PID,也就是它真实的PID。linux中创建线程的方法是clone()。可以在参数中指定CLONE_NEWPID参数,这时,这个新创建的进程将会有一个全新的进程空间,在这个进程空间里,它的PID是1。但是在宿主机真实的进程空间里,这个进程的PID还是真实的数值,比如100。这个namespace里的进程看不到宿主机里真正的进程空间,也看不到其他PID进程或者其他namespace里的进程情况。

2.Mount Namespace

假如我们通过clone()创建一个新的子进程,并且指定CLONE_NEWNS(启用 Mount Namespace)参数。这时候通过mount命令挂载,挂载的目录就是一个独立的隔离环境,它对宿主机是不可见的。

还有其他Network、User等Namespace,这里不作赘述。

总结:Namespace技术实际上是修改了应用进程看待整个计算机视图的视野,只能看到某些特定内容,但对于宿主机来说,这些被隔离了的进程跟其他进程并没有太大区别。

Cgroup

虽然namespace隔离了环境,但在宿主机上,它和其他资源还是平等竞争的关系,也就是说他们能使用的资源(内存、CPU等),随时可以被其他进程占用。Cgroup就是linux内核用来为进程设置资源限制的重要功能。

cgroups 框架提供了以下内容

资源限制: 可以为我们的进程组配置内存限制或cpu个数限制又或者仅限于某个特定外围设备。

优先级: 一个或多个组可以配置为优先占用 CPU 或磁盘 I/O 吞吐量。

资源记录: 监视和测量组的资源使用情况。

控制: 可以冻结或停止和重新启动进程组。

具体用法就不说了。。

总结

Docker容器其实就是一个启用了多个Linux Namespace 的应用进程,而这个进程能够使用的资源受Cgroups配置的限制。这也是docker要比虚拟机轻量级的重要原因。



推荐一个纪录片:Kubernetes: The Documentary中文字幕完整版


kubernetes(简称k8s,k和s之间有8个字母)


引用:https://zhuanlan.zhihu.com/p/391525180,《深入剖析Kubernetes--张磊》

你可能感兴趣的:(从一个开发者角度理解k8s之一---Docker)