Kubernetes入门(一)
“ 从今天开始,准备结合自己这段时间学习Kubernetes的进展,慢慢总结一些学习心得,就当是帮助自己成长吧”
小鲸鱼有大能量
01.从PaaS到Docker
我们大家应该或多或少都知道PaaS,他是云计算的基础。但是,使用PaaS,用户就必须为每种语言,每种框架甚至每个版本的应用维护一个打好的包。这个打包过程,没有什么章法可循,而且还会经常出现莫名其妙的问题,你必须要摸清本地应用和远端PaaS匹配的“脾气”才能搞定。
相比于传统的PaaS系统,Docker的镜像功能从根本解决了应用打包的顽疾。所谓Docker镜像,其实就是一个压缩包。大多数Docker镜像是直接由一个完整的操作系统的所有文件和目录构成的,所以这个压缩包里的内容跟你本地开发和测试环境用的操作系统是完全一样的。这个压缩包赋予了你一种极其宝贵的能力:本地环境和云端环境的高度一致!这就是Docker镜像的精髓。
02.Docker依赖技术
容器其实是一种沙盒技术,沙盒就是能够像一个集装箱一样,把你的应用“装”起来的技术。这样,应用于应用之间,就因为有了边界而不会相互干扰;而被装进集装箱的应用,也可以被整体移动。容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。Cgroups技术用来制造约束,Namespace技术用来修改进程试图。
1.Namespace,送你的障眼法
它其实只是Linux创建新进程的一个可选参数。在Linux系统中创建进程,就是调用clone(),int pid = clone(main_function, stack_size, SIGCHLD, null);
而在用clone()系统调用创建一个新进程时,可以在参数中指定CLONE_NEWPID参数,
int pid = clone(main_function, stack_size,CLONE_NEWPID | SIGCHLD, null);
这时新创建的这个进程将会“看到”一个全新的进程空间,在这个进程空间里,它的PID是1。当然,这个进程在宿主机真实的进程空间里,不会是1,还是他真正的PID。这样就达到了如下图效果,在Docker容器中只能看到在容器中运行的进程。“ 从今天开始,准备结合自己这段时间学习Kubernetes的进展,慢慢总结一些学习心得,就当是帮助自己成长吧”
除了上面说的PID Namespace之外,Linux系统还提供了Mount,UTS,IPC,Network和User这些Namespace。
总结:Docker其实就是在创建容器进程时,指定了这个进程所需要启用的一组Namespace参数。这样容器就只能看到当前Namespace所限定的资源、文件、设备、状态,或者配置。所以说,容器,其实只是一种特殊的进程。
2.Cgroups,不让容器过度膨胀
Cgroups的全称是Linux ControlGroup。最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。同时还可以对进程进行优先级设置、审计,还能将进程挂起和恢复等操作,Cgroups在Linux中提供的是文件操作接口。
运行Docker的时候,可以通过设置参数来限制容器能够使用的资源,例如:
docker run -d --name web42 --blkio-weight 100–memory 10M --cpu-quota 25000 --cpu-period 2000 --cpu-shares 30training/webapp python
03.Docker的弊端
首先,既然容器只是运行在宿主机上的一种特殊进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。虽然我们可以在容器里通过Mount Namespace单独挂载其他不同版本的操作系统文件,比如CentOS或者Ubuntu,但这并不能改变共享宿主机内核的事实。所以,我们不能在Windows宿主机上运行Linux容器,或者是在低版本的Linux宿主机上运行高版本的Linux容器。
其次,在Linux内核中,有很多资源和对象是不能被Namespace化的,比如典型的:时间。比如在容器中修改了系统时间,宿主机的时间也会随之改变。
- 下期预告
当然以上还只是Docker最核心最基础的技术,在下次的文章会继续介绍Docker镜像原理,Volume和Overlay等技术,都是个人的一些学习心得,希望能够和大家一起成长,毕竟在现在这个AI大潮中,我们也不能落下啊!!
共同学习,写下你的评论
评论加载中...
作者其他优质文章