范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

容器底层原理探秘

  这篇分享用Namespace和Cgroup的底层原理带着大家直观感受一下容器的玩法,更多相关知识点请自行查阅官方文档。Namespace
  Linux Namespace 有如下种类:
  注意,后面的模拟代码会用到相关的系统调用参数!
  1.1 相关系统调用
  与 Linux Namespace 相关的系统调用如下:
  1、chroot(),即 change root directory(更改root目录),在Linux系统中,系统默认的目录结构都是以 "/",即以根(root)开始的,而在使用chroot之后,系统的目录结构将以指定的位置作为 "/" 位置Linux Namespace 在此基础上,提供了对UTS、IPC、mount、PID、network、User等的隔离机制Docker优先使用 pivot_root 系统调用,如果系统不支持,才会使用chroot
  2、clone(),实现线程的系统调用,用来创建一个新的进程,并可以通过设计上述参数达到隔离
  3、unshare(),使某进程脱离某个namespace
  4、setns(),把某进程加入到某个namespace
  5、execv(),这个系统调用会把当前子进程的进程空间全部覆盖掉容器初始化进程 dockerinit 需要在容器内完成一系列初始化操作,比如完成根目录的准备、挂载设备和目录、配置 hostname 等然后,通过 execv() 系统调用,让应用进程(最后在Dockerfile里执行的ENTRYPOINT)取代自己,成为容器里的 PID=1 的进程
  注意,后面的模拟代码会用到相关的系统调用!
  1.2 模拟Docker镜像
  一个最常见的 rootfs,或者说容器镜像,会包括如下所示的目录:
  因为我们只是模拟,所以只创建几个目录:
  拷贝命令到新创建的bin目录:
  注意,还需要把命令依赖的so文件拷贝到lib目录,查找so文件需要用到 ldd 命令:
  还有这些文件我们不希望写死在镜像中,如下图所示:
  因此,我们在rootfs外面再创建一个conf目录,把上面3个文件放进去,然后把这个conf目录mount进容器,具体操作看后面的代码。
  关于mount再多说一嘴,其主要作用就是,允许你将一个目录或者文件,而不是整个设备,挂载到一个指定的目录上。并且,这时你在该挂载点上进行的任何操作,只是发生在被挂载的目录或者文件上,而原挂载点的内容则会被隐藏起来且不受影响 。
  简单来说,绑定挂载实际上是一个inode(不清楚inode是啥的自行google吧)替换的过程,如下图所示:
  最后一步,执行chroot命令,告诉操作系统,我们将使用 $HOME/test 目录作为 /bin/bash 进程的根目录:
  这个挂载在容器根目录上,用来为容器进程提供隔离后执行环境的文件系统,就是所谓的"容器镜像"。至于很多同学都知道的 UnionFS,说白了,就是基于旧的rootfs以增量的方式来维护 而已。
  有兴趣的同学可以用下面的代码再来模拟一遍Docker:
  1.3 模拟Docker网络
  容器有自己的 Network Namespace 和与之对应的网络接口eth0,宿主机上也有自己的eth0,而宿主机上的eth0对应着真正的物理网卡,也就是说,宿主机上的eth0才可以和外面通讯。那么容器是怎么跟外面通讯的呢?
  如上图所示,要解决容器与外面通讯需要解决两个问题:让数据包从容器的 Network Namespace 发送到宿主机的 Network Namespace 上,一般有两种方案,我们重点讲解使用得最多的 veth 方案,至于 macvlan/ipvlan 会简单提一下数据包发到宿主机 Network Namespace 后,还要解决数据包怎么从宿主机上的eth0发送出去的问题
  首先,启动一个不带网络配置的容器:
  找到这个容器进程的pid:
  通过 /proc/$pid/ns/net 这个文件得到容器 Network Namespace 的ID,然后在 /var/run/netns/ 目录下建立一个符号链接,指向这个容器的 Network Namespace:
  完成这步操作之后,在后面的 ip netns 操作里,就可以用pid的值作为这个容器的 Network Namesapce 的标识了。
  接下来,用 ip link 命令来建立一对veth的虚拟设备接口,分别是veth_container和veth_host:
  把veth_container这个接口放入到容器的 Network Namespace 中:
  把veth_container重新命名为eth0,因为这时候接口已经在容器的 Network Namesapce 里了,所以不会和宿主机上的eth0命名冲突:
  接着对容器内的eth0做基本的网络IP和缺省路由配置:
  完成这一步,就解决了让数据包从容器的 Network Namespace 发送到宿主机的 Network Namespace 上的问题,如下图所示:
  将veth_host这个设备接入到docker0这个bridge上:
  至此,容器和docker0组成了一个子网,docker0上的IP就是这个子网的网关IP,如下图所示:
  要让子网可以通过宿主机上eth0去访问外网,还需要添加下面的iptables规则:
  最终的veth网络配置如下图所示:
  最后测试一下是否能ping通外网:
  如果发现ping不通,先检查下是否打开IP转发功能:
  这里简单提一嘴 macvlan/ipvlan 方案:对于macvlan,每个虚拟网络接口都有自己独立的mac地址;而ipvlan的虚拟网络接口是和物理网络接口共享同一个mac地址。同时它们都有自己的 L2/L3 的配置方式。有兴趣的同学可以按照如下步骤为容器手动配置上ipvlan的网络接口:docker run --init --name ipvlan-test --network none -d busybox sleep 36000   pid1=$(docker inspect ipvlan-test | grep -i Pid | head -n 1 | awk "{print $2}" | awk -F "," "{print $1}") echo $pid1 ln -s /proc/$pid1/ns/net /var/run/netns/$pid1   ip link add link eth0 ipvt1 type ipvlan mode l2 ip link set dev ipvt1 netns $pid1   ip netns exec $pid1 ip link set ipvt1 name eth0 ip netns exec $pid1 ip addr add 172.17.3.2/16 dev eth0 ip netns exec $pid1 ip link set eth0 up
  完成上面的操作后,ipvlan网络二层的连接如下图所示:
  有兴趣的同学可以再深入思考下Kubernetes相关的网络问题:Pod内的网络通信同节点Pod之间的网络通信跨节点Pod通信Pod与非Pod网络的实体通信Cgroup
  使用Cgroup可以根据具体情况来控制系统资源的分配、优先顺序、拒绝、管理和监控,提高总体效率。
  2.1 Cgroup子系统
  下面列举的是 Cgroup V1 相关子系统:blkio,这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘、固态硬盘、USB 等)cpu,这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问cpuacct,这个子系统自动生成 cgroup 中任务所使用的 CPU 报告cpuset,这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点devices,这个子系统可允许或者拒绝 cgroup 中的任务访问设备。freezer,这个子系统挂起或者恢复 cgroup 中的任务memory,这个子系统设定 cgroup 中任务使用的内存限制,并自动生成内存资源使用报告net_cls,这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包net_prio,这个子系统用来设计网络流量的优先级hugetlb,这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统
  Linux Cgroups 给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下,可以通过 mount 命令查看:
  如果没有看到上述目录,可以自行做mount,如下所示:mkdir cgroup mount -t tmpfs cgroup_root ./cgroup mkdir cgroup/cpuset mount -t cgroup -ocpuset cpuset ./cgroup/cpuset/ mkdir cgroup/cpu mount -t cgroup -ocpu cpu ./cgroup/cpu/ mkdir cgroup/memory mount -t cgroup -omemory memory ./cgroup/memory/
  一旦mount成功,那些mount的目录下面就会有很多相关文件,如下图所示:
  2.2 限制CPU的栗子
  在使用 CPU Cgroup 前,先介绍三个重要的参数:
  1、cpu.cfs_period_us,用来配置时间周期长度,一般它的值是 100000,单位是微秒(us)
  2、cpu.cfs_quota_us,用来配置当前Cgroup在设置的周期长度内所能使用的CPU时间数,单位也是微秒(us),通常不会修改
  3、cpu.shares,用来设置CPU的相对值,并且是针对所有的CPU(内核),默认值是1024。假设系统中有两个Cgroup,分别是A和B,A的shares值是1024,B的shares值是512,那么A将获得1024/(1204+512)=66%的CPU资源,而B将获得33%的CPU资源,注意相对值这个概念:如果A不忙,没有使用到66%的CPU时间,那么剩余的CPU时间将会被系统分配给B,即B的CPU使用率可以超过33%如果又添加了一个新的Cgroup C,且它的shares值是1024,那么,A的限额变成了1024/(1204+512+1024)=40%,B的变成了20%
  了解了上面的参数,那么应该能看懂下面这条docker命令:
  接下来,我们使用原生的Cgroup来实现上面的命令。
  首先,创建一个 CPU Cgroup:
  设置 cpu.cfs_quota_us 为 20000:
  查看当前Shell进程的PID:
  然后,在bash中启动一个死循环来消耗cpu,正常情况下应该使用100%的CPU,即消耗一个内核:
  将这个测试Shell进程的PID加入 CPU Cgroup:
  加入之后可以看到CPU使用率降到了20%:
  关于Kubernetes的CPU限制出门右转看 [Assign CPU Resources to Containers and Pods](https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/)。
  2.3 Cgroup V2
  Cgroup有V1和V2两个版本,V1版本中的 blkio Cgroup 只能限制 Direct IO,不能限制 Buffered IO。
  这是因为 Buffered IO 会把数据先写入到内存 Page Cache 中,然后由内核线程把数据写入磁盘,而Cgroup V1 的子系统都是独立的 ,即 Cgroup V1 blkio 的子系统是独立于 memory 子系,所以无法统计到由 Page Cache 刷入到磁盘的数据量。
  这个 Buffered IO 无法被限速的问题,在 Cgroup V2 里被解决了。Cgroup V2 从架构上允许一个控制组里有多个子系统协同运行 ,这样在一个控制组里只要同时有 io 和 memory 子系统,就可以对 Buffered IO 作磁盘读写的限速,如下图所示:
  虽然 Cgroup V2 能解决 Buffered IO 磁盘读写限速的问题,但是目前 runC、containerd以及Kubernetes都是刚刚开始支持 Cgroup V2,所以还需要等待一段时间。

锂矿双雄业绩飙升背后锂电市场量价齐升本报记者茹阳阳吴可仲北京报道锂电赛道持续火热,位居上游的部分锂资源企业在三季度的业绩实现大幅增长。其中,被称为锂矿双雄的天齐锂业(002466。SZ)和赣锋锂业(002460。SZ股市如是因此大跌,那我说跌的好10月26日,河北省医用药品器材集中采购中心发布关于开展20种集采医用耗材产品信息填报工作的通知(下称通知),通知中将角膜塑形用硬性透气接触镜(俗称OK镜)拟纳入集采范围。由此,相期货市场能被准确预测吗我是交易员K,点击关注,每天分享期货交易的干货,陪你洞见交易真相,品味期货人生我最开始做交易的时候,身边也有不少的大神,他们在某一段时间总是表现的洋洋得意,交流时会提及自己的预测有江西绿色金融改革纵深发展经济日报南昌讯(记者赖永峰刘兴)日前,中国建设银行江西新余市分行与仙女湖旅游投资发展集团有限公司完成仙女湖(湖体)生态系统生产总值(GEP)抵质押绿色信贷项目签约。8亿元整体授信,大湾区专精特新企业布局东盟,金融活水如何滴灌实体经济?21世纪经济报道记者胡录深圳报道随着数字手绘在漫画游戏平面插画建筑设计及3D动画影视制作等领域的应用不断扩展,深圳汉王友基的数字绘画板手写板,在跨境电商平台已成为爆款产品。东南亚跨曾经最好的中杯三星手机三星S10,可惜性能沦为千元机水平三星S10这个10是指盖乐世S系列已经出到第十代的意思,三星粉丝更愿意称作它为十代,先于时代。也可以理解为10力雄厚。当年这台手机卖的贼贵,仅仅是中杯S108128G预约价为630富士康怎么了?公司做出最新情况说明昨日(10月29日)起,河南多地政府致信本地在郑州富士康工作人员,今天此事有了富士康方面的回应后续。今天(10月30日)下午,郑州发布连发两条消息,通告富士康给员工连发三条关爱通知7家航空公司前三季度亏超千亿元头部航司恢复多条国际航线10月30日晚间,海航控股(600221)发布2022年第三季度报告,前三季度营业收入187。3亿元,同比减少31。29。归属于上市公司股东的净亏损208。39亿元,归属于上市公司在银行存多少钱,才能成为尊贵的黑卡客户?大小银行差别很大?说到黑卡,很多人的第一印象就是美国运通公司于1999年推出百夫长卡,该卡被称为卡中之王,全球顶级富豪的身份象征!它号称无所不能,甚至可以让已经起飞的飞机为你而掉头,那么现实如此吗?德赫亚悲情落选奏响传统型门将的挽歌北京时间10月29日,西班牙国家队公布了参加卡塔尔世界杯的55人大名单,英超豪门曼联的主力门将德赫亚出人意料的落选大名单,将彻底无缘11月开幕的世界杯。根据西班牙阿斯报提供的名单,华为夺冠!Q3国内折叠屏销量公布,三星占比不到其一半?市场调研机构IDM宣布2022年第三季度国内折叠屏手机销量数据,出货量突破100万台,同比去年增长246,创造有史以来销量最高纪录。榜单显示,华为以44。9份额高居榜首,几乎拿下该
长肉最快的4大素菜,热量比红烧肉还高,减肥你还不知道吗长肉最快的4种素菜,热量比红烧肉还高,难怪总容易长胖。哈喽,大家好。我是大厨江一舟。今天又到了和大家分享美食的时刻了,你准备好了吗?随着生活水平的不断提高,越来越多朋友的饮食也是种吃姜不去皮,吃错害自己?生姜要不要去皮?尽量别做错导语生姜是我们生活中非常常见的一种食品,我们几乎每天都与生姜打交道,可是生姜的用法,你又真的了解吗?去皮还是不去皮呢?吃姜不去皮,吃错害自己?生姜要不要去皮?尽量别做错生姜不仅是一发芽的洋葱红薯大蒜生姜到底能不能吃?让专家告诉你天气炎热,买回家的红薯洋葱大蒜和生姜等食物,稍不留神就容易发芽,夏天食物发芽是常见的事,有些食材不注重储存,就容易发芽。那么这些食材发芽后还能不能吃呢?关于这个问题,每个人的看法都这3种水果被称为是最伤身体的水果,但多数人爱吃,赶快了解一下水果,在我们生活中来说,应该是一种健康的食物。不仅如此,在生活中,为了我们的健康,还经常被倡导要多吃水果。因为水果中含有大量的维生素及膳食纤维素等营养元素,若是在生活中经常食用,可肾友一天可以吃多少水果?如何选择适合自己的水果呢?一天可以吃多少水果?中国居民膳食指南指出成年人每天应摄入200350克新鲜水果,同样适用于CKD12期的肾友们。常见水果,比如苹果梨等,约等于您的一个拳头大小,每天是可以吃12个的搭乘神十三回来的太空种子怎么样了?最新情况来了4月16日,神舟十三号飞船顺利完成全部既定任务返回地球,跟随航天员一同返航的还有12000颗种子。如今,一个多月过去了,这些种子有啥变化?太空种子茁壮成长在内蒙古,工作人员正在培育吃醋能软化血管软化鱼刺?你也太天真啦,醋的这些好处对我们有益Hello,大家好,我是农民营养师聊养生。欢迎大家收看本期养生节目。相信我们很多人的家里都有醋,很多人都听说过醋有软化血管,还有软化鱼刺的说法,吃醋能软化血管软化鱼刺吗?今天我们就2斤花生5斤水,教你在家自制豆腐,白白嫩嫩,不管怎么做都好吃大家好,只需准备2斤花生和5斤水,我们自己在家就能制作出白白嫩嫩q弹软嫩的花生豆腐,喜欢吃豆腐的朋友们,可以来学一学啦。提到豆腐,相信每个人都不陌生,作为一种我们生活中常见的食材,煮粽子用凉水还是开水?煮多久?牢记3要2不要,香糯不夹生多学学多看看!点击关注,每天精彩不断!导读煮粽子用凉水还是开水?煮多久?牢记3要2不要,香糯不夹生!相信大家也知道,再过几天,就是一年一次的端午节了,在端午节前后的时候,我们肯定是睡觉时总在凌晨34点醒?医生或暗示着3大病症,别忽视睡觉,是人类不可缺少的一种生理现象,人的一生中,睡眠占了将近13的时间,而睡眠质量的好坏与身体健康与否有着密切关系,由此可见,睡眠对一个人是多么的重要。睡眠对人类身体的影响是全方位一失眠就吃安眠药,医生告诉你这是不对的只要一失眠就服用安眠药,这是一个很大的错误,很多时候失眠只是一个并发症,所以有时候失眠吃安眠药效果并不好,这种情况,就要分析引起失眠的原因。第一个是焦虑症,焦虑症的患者经常会因为心