kubernetes学习(二) --------docker的基本命令,namespace和cgroups

前文

  关于k8s的书籍和官网看的很多,但要数讲的最深的,当属张磊在极客时间上的课程《深入剖析Kubernetes》,对应链接:https://time.geekbang.org/column/intro/100015201。本文引用文章知识总结分享

docker命令

  命令docker help即可获得,常用命令如下:

Docker环境信息 info、version
容器生命周期管理 Create、exec、kill、pause、restart、rm、run、start、stop、unpause
镜像仓库命令 login、logout、pull、push、search
镜像管理 build、images、import、load、rmi、save、tag、commit
容器运维操作 attach、export、inspect、port、ps、rename、stats、top、wait、cp、diff
系统日志信息 events、history、logs

  其中docker info和version就能看到docker的基本信息,特别是docker info,里面记录了运行的容器数量、镜像数量、使用的storage driver(比如Aufs、overlay2)等;
  身为开发者,上述的命令基本都有用到过,如果发现有陌生的命令,建议看下官网学习了解下

docker核心原理

  容器本质上就是宿主机的进程,通过namespace实现资源隔离,通过cgroups实现资源限制,通过写时复制(copy-on-write)实现高效文件操作。虽然在表面上看,容器间是互相隔离的,但实际上隔离的并不彻底,因为容器本质上是进程,而很多资源和对象是不能被隔离的,比如:时间,在任意容器里执行更改时间命令,则宿主机也会变更;同时比如/proc保存进程信息的目录也不能被隔离,这导致容器执行top所能看到的资源和宿主一样,而且当部分应用需要用到这部分资源(/proc)时,就会不受控制(这里可以用lxcfs来做容器的/proc来规避掉这块,因为top是读/proc/stat里的数据,所以通过lxcfs来自动读取容器里cgroup限制的数据,就可以避免这块);还有,因为内核默认用的是宿主机的内核,这导致宿主机如果低版本内核,则无法使用高版本的特性,windows则无法搭建linux的容器。
  容器中一个非常重要的概念:容器是单进程模型,单进程的意思是只有容器启动时entrypoint CMD启动的进程才是可控的,其他的进程比如exec进入容器执行ping等的命令则不是容器启动后由docker控制的。由于这点特性,所以在容器里一般会以进程组的方式管理,此时supervisor就可以充当该角色。当然如果后续k8s上了后,由于pod才是最小单位,可以灵活用单pod管理多容器的方式来做这块。

namespace相关

  namespace的隔离可以巧妙隔开容器,系统调用上通过setns()加入存在的namespace,docker exec就是通过这个实现。另外namespace的隔离主要包含以下六项:

UTS(UNIX Time-sharing System)隔 主机名与域名
IPC(Inter-Process Communication进程间通信) 信号量、消息队列和共享内存
PID 进程编号,可以通过 /proc/pid/ns 查看指定进程号的namespace,如果namespace相同,则说明互通
NetWork 网络资源的隔离,在docker里通过veth pair(虚拟网络设备对:有两端,类似于管道,将数据从一端传入另一端。比如容器的1号进程创建时,docker daemon会先创建这个veth 
Mount 挂载,最典型的docker中volume就是依赖于mount namespace来实现挂载的隔离
User 用户和用户组
cgroups相关

  早期叫process container,谷歌工程师提出;07年变更为control groups;cgroups本质上是给任务(task)上钩子,当task运行过程中会不断触发钩子所附带的子系统进行检测,得到数据并进行相关的处理。
  cgroup几个重要作用:资源限制、优先级分配、资源统计、任务控制(挂起、恢复)
  在docker容器里,资源限制就是通过cgroups实现,可以通过一个例子来实现。cgroups的目录位于linux:/sys/fs/cgroup,可以通过mount查看都有哪些限制:mount -l|grep cgroup,最典型的就是cpu、memory的限制。
  进入/sys/fs/cgroup/cpu,随意建个目录test,则会自动生成cpu相关的限制,其中cpu.cfs_period_us和cpu.cfs_quota_us是控制cpu的两个值,后者/前者得到的值则是进程可以在cpu里使用的百分比,比如分别写入100000和20000,则进程只允许占到20%,可以在后台起个死循环进程:

while : ; do : ; done &

  通过top命令可以看到一个占满100%cpu的进程,此时将这个进程id写入test目录下的tasks,再用top观察就可以识别其百分比大幅度下降。

extra

什么是进程?
答:将程序运行起来就是进程,如何运行?计算机本质上只认识0和1,代码编写的程序,就是二进制文件,也叫代码的可执行对象(executable image),当其执行时,操作系统接收到后,利用cpu+内存来实现程序的运行,其中堆栈负责存储指令和变量,寄存器负责存储值,加上各类文件和IO设备,就运行了起来。详细的可参考书籍:《程序员的自我修养: 链接、装载与库》

容器本质上就是一个单进程,或者说是进程组?
答:容器本质上进程组,也就是单进程+其子进程是可控的,但并不是说容器里只有一个进程,比如我们还可以进入容器执行ping、netstat等命令形成额外进程,但这些进程并不是容器启动后控制运行的,能控制运行的有且只有一个。所以一般会用supervisor这类进程管理工具来实现单容器多进程。当然,后续容器编排可以支持 docker-compose、Kubernetes来实现更专业的控制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值