目录
1 隔离相关
主要通过设置namespaces以及control Group (Cgroup)控制组进行隔离,其他还涉及到Capability、Seccomp、AppArmor、Selinux
其中namespaces涉及到几个方面
Namespace | 系统调用参数 | 隔离内容 |
Cgroup | CLONE_NEWCGROUP(创建新的cgroup命名空间) | Cgroup 根目录 |
IPC | CLONE_NEWIPC(创建新的IPC命名空间) | System V IPC, POSIX 消息队列等 |
Network | CLONE_NEWNET(创建新的网络名称空间) | 网络设备,协议栈、端口等 |
Mount | CLONE_NEWNS(创建新的装载命名空间) | 挂载点 |
PID | CLONE_NEWPID(创建新的PID命名空间) | 进程ID |
User | CLONE_NEWUSER(创建新的USR命名空间) | 用户和group ID |
UTS | CLONE_NEWUTS(创建新的UTS命名空间) | Hostname和NIS域名 |
linux下namespase的创建
通过unshare创建,查看unshare的描述和用法
通过unshare创建一个pid namespace
cgroup
容器场景下常用的cgroup
cgroup名 | 主要作用 |
cpu | cpu share 和 cupset,控制 CPU 的使用率 |
memory | 控制进程内存的使用量 |
device | device 控制了你可以在容器中看到的 device 设备 |
freezer | 它和第三个 cgroup(device)都是为了安全的。当你停止容器的时候,freezer 会把当前的进程全部都写入 cgroup,然后把所有的进程都冻结掉,这样做的目的是,防止你在停止的时候,有进程会去做 fork。这样的话就相当于防止进程逃逸到宿主机上面去,是为安全考虑 |
blkio | blkio 主要是限制容器用到的磁盘的一些 IOPS 还有 bps 的速率限制 |
pid | pid cgroup 限制的是容器里面可以用到的最大进程数量 |
2 容器存储
docker对镜像的存储,底层基于不同操作系统,涉及到 AUFS、btrfs、devicemapper 还有 overlay
以overlay为例子:
更多容器系统相关参考Linux overlay文件系统解析 - 简书
3 容器引擎
在k8s创建pod的时候,首先通过apiserver接受用户创建请求,apiserver讲信息持久化到etcd,此时调度器Scheduler会watch到etcd中的变化,Scheduler主要承载有调度算法,根据算法将pod Bind到Node节点;Node节点运行的kubelet讲watch到的etcd变化进行pod创建,kubelet通过CRI调用dockershim,之后调用containerd,执行runc启动容器,借用一张图(pod启动过程 - 简书)
containerd start流程
containerd exec流程
start和exec的主要区别:
- exec 的时候,需要把这个进程加入到一个已有的 namespace 里面;
- start 的时候,容器进程的 namespace 是需要去专门创建。