<从Docker到Kubernetes之技术实战>教程作业(一)

<从Docker到Kubernetes之技术实战>教程作业(一)

一. 研究cgroup的作用和基本用法

概念

Cgroups 是 control groups 的简称,是 linux 内核提供的一种可以限制/记录/隔离进程组所使用的物理资源的机制.最初由 google 的工程师提出,后来被整合进 linux 内核

作用

cgroups 适用于多种应用场景,从单个进程的资源控制,到实现操作系统层次的虚拟化.cgroups 提供了以下功能:

  • 限制集成租可以使用的资源数量
  • 进程租的优先级控制.
  • 记录进程组使用的资源数量.
  • 进程组隔离.
  • 进程租控制.

相关概念

  • Task: 即进程
  • Subsystem: 即资源控制器,例如内存子系统是控制内存大小的控制器,CPU子系统是控制CPU分配的控制期,通过cat /proc/cgroups可查看系统支持的subsystem(该命令亦可用来判断系统是否支持cgroup,如果hierarchy项非0,说明相应的子系统已经被mount,此时如果再mount这个子系统到其它的目录就可能提示busy错误)
  • Hierarchy:即由不同cgroup组成的一个树形层级结构,也就是mount的一个cgroup文件系统。
[root@010c4aeffea8 cgroup]# cat /proc/cgroups
#subsys_name    hierarchy   num_cgroups enabled
cpuset  1   3   1
cpu 2   6   1
cpuacct 3   3   1
blkio   4   3   1
memory  5   4   1
devices 6   3   1
freezer 7   3   1
net_cls 8   3   1
perf_event  9   3   1
net_prio    10  3   1
hugetlb 11  3   1

基本用法

1. 创建一个容器
docker run -ti --privileged=true centos:lastest /bin/bash
#增加–privileged=true选项,使得容器内的root用户将拥有真正的root权限,否则仅仅是外部的一个普通用户权限
2. 安装/启动服务
yum install libcgroup ibcgroup-tools
3. 创建/配置 cgroup
mkdir -p /cgroup/cpu/{large,small,mini}
#等同于cgcreate -g cpu:large

echo "10000" > /cgroup/cpu/mini/cpu.cfs_quota_us 
echo "30000" > /cgroup/cpu/small/cpu.cfs_quota_us 
echo "50000" > /cgroup/cpu/large/cpu.cfs_quota_us 
4. 测试
  • 1 创建测试程序 loop.sh
#/bin/sh
while :   
do 
    x=x+1 
done
  • 4.2 执行任务
sh loop.sh >/dev/null 2>&1 &
  • 4.3 将其进程号假如到 cgroup 中
echo 118 >/cgroup/cpu/mini/tasks 将pid为118的进程加入mini组 
  • 4.4 使用 htop 查看效果

在加入 cgroup 前,该进程占用100%cpu

之后 cpu 占用最大为10%

二. 研究Linux中的命名空间隔离技术

Namespaces 提供了虚拟化的一种轻量级形式,使得我们可以从不同的方面查看运行系统的全局属性.

传统上,linux 的许多资源是全局管理的,比如Linux 下的所有用户通过 uname 调用返回的系统信息都是相同的,每个用户是通过一个全局唯一的 UID 号来标识的.虚拟化需要解决的是,如何位每个用户提供一台计算机,可以让每个用户像独占一台计算机一样的来使用物理机.

实现的一种方案是使用 KVM 活 VMWare 提供的虚拟化环境. 另外一种就是 Namespaces 提供的一种比较轻量级的解决方案.在虚拟化的系统中,一台物理机可以运行多个内核,可能是并行的多个不同的操作系统.而命名空间则是在一台物理机上只使用一个内核,讲全局的系统资源进行抽象,每一个 namespace 都有属于自己的系统资源, 而对其他namespace 中的系统资源则是透明的. 基于这种机制, 实现了基于容器的虚拟化技术.

目前Linux实现了六种类型的namespace,每一个namespace是包装了一些全局系统资源的抽象集合:

  • PID: 进程隔离
  • NET: 管理网络接口
  • IPC: 管理跨进程通信的访问
  • MNT: 管理挂载点
  • UTS: 隔离内核和版本标识

在有了这些隔离的资源以后,就需要通过 cgroup 来对其进行管理了.

Docker 基于 cgroup 和 namespaces 的技术,使得 Docker 容器具备了以下能力:

  • 文件系统隔离: 每个容器都有了自己的 root 文件系统
  • 进程隔离: 每个容器都运行在自己的进程环境中
  • 网络隔离: 容器建的虚拟网络接口和 IP 地址都是分开的
  • 资源隔离和分组:使用 cgroup 将 CPU 和内存等系统资源独立的分配给每个 Docker 容器

三. 研究Docker全生命周期开发流程并给出你的见解

1. 有利于开发过程中的部署及测试

开发过程中需要使用不同的开发环境,比如现网是 centos,开发是 mac,就可以使用 docker 在本机上构建一个 centos 的镜像,通过容器来运行应用,来模拟真实环境.另一方面,相当于提供了一个相对独立的测试环境, 为开发和测试人员提供了一个轻量级的沙盒环境.

2. 可移植性有利于复杂环境的搭建及发布

一个团队中使用相同的开发或测试环境, 就不需要再每个人去自己搭建, 只要一个成员构建好自己的镜像,将其共享给其他成员就可以达到实现快速,统一搭建环境的目的.同时,还可以公布 dockerFile,方便其他人员基于这个基础版本的修改即个性化定制, 使得环境的标准化和版本控制更加容易的推进.

3. 测试及问题定位

可以快速验证同一个应用在不同环境中运行的结果, 对于由于环境差异导致的运行报错,可以快速的重现从而进一步进行问题定位.

4. 集群测试

在一个宿主机上可以模拟多个终端,来进行发布和部署.

四. 下载一个Docker的JDK镜像,用解压软件打开,研究分层目录的结构并说说你对Docker Image分层与合并的理解

导出镜像:

使用 docker export 导出容器到本地

将生成的 tar 解压后看到的目录与容器中的文件目录是一致的.比如在容器中新增一个 test 的文件夹, 那么在导出镜像的文件中也同样存在一个 test 的文件夹

使用 dockerFile 构建过程

  1. 从基础镜像运行一个容器.dockerFile 中的 from 指令
  2. 执行一条指令,对容器做出修改
  3. 执行类似 docker commit 的操作,提交一个新的镜像层
  4. 基于这个新的镜像运行一个新的容器
  5. 再返回第二步,直至所有命令执行完毕

也就是说在构建一个自定义镜像的过程中,每个镜像层文件都是只读的,每次基于上一层的修改并不会直接作用于这个镜像文件,而是重新构建一个新的镜像文件,然后再基于这个新的镜像运行一个新的容器.
在构建的过程中,docker 会自动删除中间的容器,但不会删除镜像, 这样就保留了每个命令执行的结果,我们可以通过基于中间镜像文件来运行一个容器的方式,来对命令进行 debug.

另一方面,中间镜像还起到了缓存的作用,docker 可以自动重用之前已经有的缓存, 就不需要每次需要很长的时间, 当然也可以使用--no-cache选项来禁用缓存.使用 docker history可以查看一个镜像文件的构建过程.

2015-12-12 20:053