Container 内核原理介绍

24
Container 内内内内内内 内内内 @ UCloud

description

Container 内核原理介绍. 邱模炯 @ UCloud. 虚拟化技术: VM 与 Container. App. App. App. Binaries/ Libraries. Binaries/ Libraries. Binaries/ Libraries. App. App. App. Guest Kernel. Guest Kernel. Guest Kernel. Binaries/ Libraries. Binaries/ Libraries. Binaries/ Libraries. Hypervisor(VMM). - PowerPoint PPT Presentation

Transcript of Container 内核原理介绍

Page 1: Container 内核原理介绍

Container 内核原理介绍邱模炯 @ UCloud

Page 2: Container 内核原理介绍

虚拟化技术: VM 与 Container

Hardware

Host Kernel

Hypervisor(VMM)

GuestKernel

Binaries/Libraries

App

System Virtualization

GuestKernel

Binaries/Libraries

App

GuestKernel

Binaries/Libraries

App

Hardware

Host Kernel

Binaries/Libraries

App

Binaries/Libraries

App

Binaries/Libraries

App

Container Virtualization

Page 3: Container 内核原理介绍

虚拟化技术: VM 与 Container

Hardware

Host Kernel

Hypervisor(VMM)

GuestKernel

Binaries/Libraries

App

System Virtualization

GuestKernel

Binaries/Libraries

App

GuestKernel

Binaries/Libraries

App

Hardware

Host Kernel

Binaries/Libraries

App

Binaries/Libraries

App

Binaries/Libraries

App

Container Virtualization

namespace & cgroup

内容:•namespace•cgroup•aufs•两者对比

Page 4: Container 内核原理介绍

namespace :进程组虚拟化的手段• 进程运行环境有哪些?

– VFS mount, 即文件系统 rootfs– uid, gid– network, 即独立的网络设备和 tcpip– pid, 父 pid– devices, hostinfo,

IPC, /proc, /sys 等

• 进程虚拟化 / 隔离• 已有 ns

– pid :进程 ID– mnt :文件系统挂载点– net :网络栈– uts :主机名– ipc :进程间通信– user :用户 ID, 组 ID ,

capabilities

• 子进程自动继承父的 ns

Page 5: Container 内核原理介绍

nsproxy 相当于运行环境struct task_struct{ struct nsproxy *nsproxy ...}

struct task_struct{ struct nsproxy *nsproxy ...}

struct task_struct{ struct nsproxy *nsproxy ...}

struct nsproxy: uts_namespace ipc_namespace pid_namespace mnt_namespace net

struct nsproxy: uts_namespace ipc_namespace pid_namespace mnt_namespace net

UTS0

UTS1

PID0

PID1

NET0

MNT0

IPC0

NET1

Page 6: Container 内核原理介绍

mnt ns 提供私有的 rootfs• 每个 mnt ns 有自己的 rootfs ,相对于 host 的根目录

struct mnt_namespace{ struct mount * root; ...}

Page 7: Container 内核原理介绍

pid ns 映射后的 pid 空间struct pid_namespace{ struct pidmap pidmap[PIDMAP_ENTRIES]; ...}

Page 8: Container 内核原理介绍
Page 9: Container 内核原理介绍

net ns 提供独立的网络栈每一个 ns• 私有的网络设备

– lo, veth 等虚设备– 物理网卡

• 独立的协议栈– ipv4, ipv6 (含

IP 地址和路由表)– tcp, sctp, dccp– iptables 规则– ipvs 等

Page 10: Container 内核原理介绍

其他 ns• uts, ipc• user ns

– C1 的 1001 id 和 C2 的 1001 不是同一– 主要处理 uid, gid, capabilities 的虚拟化– 3.8 版本提交;需要文件系统配合,目前不完善

• 还有什么 namespace 没有实现?– time, device, security keys, security

Page 11: Container 内核原理介绍

namespace 能做到什么?虚拟机,但资源无保证• 独立的 mnt ( chroot )• 独立的 pid 空间• 独立的网络协议栈• uts• uid, gid• ipc Hardware

Host Kernel

Binaries/

Libraries

App

Binaries/Libraries

App

Binaries/Librarie

s

App

namespace

Page 12: Container 内核原理介绍

cgroup: 资源隔离和统计

/cgroup

cont1 cont2

apache mysql ftp

group1: 内存上限 3072M ,group2: 内存上限 1024M ,

哪些控制组• memory

• usage_in_bytes• limit_in_bytes• stat• kmem...• kmem.tcp...• memsw...

• cpu• blkio• cpuset, freezer, net_cls,

net_prio, devices, perf, cpuacct, hugetlb

mount –t cgroup none /cgroup

ulimit 的群体版

Page 13: Container 内核原理介绍

cgroup: 内存子系统接口memory.limit_in_bytesmemory.soft_limit_in_bytesmemory.usage_in_bytesmemory.failcntmemory.max_usage_in_bytesmemory.stat

memory.kmem.limit_in_bytesmemory.kmem.usage_in_bytesmemory.kmem.failcntmemory.kmem.max_usage_in_bytes

memory.kmem.tcp.xxx

总体内存

kmem 内存kmem.tcp 内存

Page 14: Container 内核原理介绍

cgroup: 内存子系统原理mem_cgroup

mm_struct

task_struct

mm_struct

task_struct

page page_cgroup

-mem_cgroup 包含该 group 允许使用内存上限,当前使用量, LRU 等信息-每个进程 task_struct 知道自己属于哪个 group

-每个页面 page 有对应的page_cgroup 信息,从page_cgroup 可知道该页面属于哪个 group

- 在 page fault 或分配 page cache 页面时,系统会设置page_cgroup 属于哪个mem_cgroup

Page 15: Container 内核原理介绍

cgroup: CPU 子系统接口cpu.shares group 间 CPU 调度权重cpu.stat

cpu.cfs_period_uscpu.cfs_quota_us

cpu.rt_runtime_uscpu.rt_period_us

Page 16: Container 内核原理介绍

cgroup: CPU 子系统原理Complete Faire Scheduling 调度的基础是 red-black tree ,二叉排序树。启用 cgroup前,所有可运行进程都被排序

p1

p2

p3

p4

p6

p5

group1 group2

root

p1

p2

p3 p4

p5

p6

启用 cgroup后,变为两级调度!第一级: container 间第二级: container 内

Page 17: Container 内核原理介绍

cgroup: 其它子系统• blkio

• cpuset, freezer, net_cls, net_prio, devices, perf, cpuacct, hugetlb

Page 18: Container 内核原理介绍

namespace + cgroup 能做到?

虚拟机且资源有保证但,如何使得 container 精简?

Hardware

Host Kernel

Binaries/Libraries

App

Binaries/Libraries

App

Binaries/Libraries

App

namespace & cgroup

Page 19: Container 内核原理介绍

aufs overview • Another Union File System 同类: Overlayfs

/basebootbinliblib64usrsbin

/c1data

mount -t aufs -o br=/base=ro:/c1=rw none /union

/unionbootbinliblib64usrsbindata

Page 20: Container 内核原理介绍

aufs: 原理

aufs

Page 21: Container 内核原理介绍

aufs: 有待完善• 一个写操作导致整个文件的拷贝• branch 文件重名时的处理• 如何确保可预测可推理的行为

– “ 下层”文件被绕开修改– “ 上层”编辑文件,新

branch 恰有同名文件

/rw(none)

/rofileA

/newfileA

/unionfileA

Page 22: Container 内核原理介绍

Container VS VM: 内核是运行环境的一部分• 内核版本与 libc 有一定耦合• 内核特性• 系统调用, /proc, /sys• 磁盘设备名• 系统配置文件 硬件

用户态环境

内核

程序

VM

Container

Page 23: Container 内核原理介绍

Container VS VM :应用场景• 性能和大小

– 运行开销、部署速度、启动速度• 迁移• 隔离和安全适用场景 ?

Page 24: Container 内核原理介绍

Thank You