容器内部时间比宿主机玩八个小时_如何在主机上调试容器、在容器中操作主机...

1. 一个奇怪的需求

老板有个奇怪的需求,通过一个 kubeconfig 文件,获取主机的各种状态信息,比如进程列表、进程状态等。

第一反应就是,老板是不是不懂容器,容器怎么能这样玩,这样玩还要什么容器,内心万马奔腾。

直到最近遇到了一个命令行工具,才发现原来小丑是我自己。下面一起来看看,我发现了什么吧。

2. 容器的原理

沙箱是一个虚拟环境,在沙箱内部进行的操作对外部没有影响。沙箱与沙箱之间是隔离的,也是不可见的,看不到彼此的存在。

我们常说的容器就是基于 Linux 的 Cgroups 和 Namespace 技术构建的一个沙箱环境。

1cf11a10810657e73ed42762818f5f14.png

从图中,可以看到,容器与容器的边界就是通过 Cgroups 和 Namespace 这两种技术控制的。下面简单描述一下这两种技术:

  1. Namespace

不同 Namespace 下的资源相互独立、不可见。Linux 从 2.4.19 完成了支持 Mount Namespace,2.6.19 完成了支持 UTS、IPS Namespace,2.6.24 完成了支持 PID Namespace,2.6.29 完成了支持 Network Namespace,3.8 完成了支持 User Namespace 。其中,除了 User Namespace ,其他都需要以 root 权限创建。同时,在 4.6 中已经新增了 Cgroup namespace,目前 RunC(Docker 提供的运行时) ,已经合并了相关的 PR: https://github.com/opencontainers/runc/pull/1916 。下面是其中的 7 种 Namespace。

  • Mount namespace,隔离文件系统挂载点。一个 Namespace 中,程序对文件的修改,只影响自身的文件系统,而对其他 Namespace 没有影响。

  • UTS namespace,隔离主机名和域名信息。每个 Namespace 中,主机和域名信息相互独立。

  • IPC namespace,隔离进程通信的行为。只有一个 Namespace 中的进程可以互相通信。

  • PID namespace,隔离进程的 PID 空间。不同 Namespace 中的进程 PID 可以重复,互不影响。PID 为 1 的进程是其他所有进程的父进程,因此这个 Namespace 非常有意义。

  • Network namespace,隔离网络资源。每个 Namespace 都具有独立的网络栈信息,容器运行时仿佛在一个独立的网络中。

  • User namespace,隔离用户和用户组。同一个用户在不同的 Namespce,可以具有不同的角色,用来保障安全性。

  • Cgroup namespace,隔离 Cgroup 的可见性。每个 Namespace 中,都具有独立的 cgroupns root 和 cgroup filesystem 视图。

  1. Cgroups

上面将一组进程放置到一个 Namespace,对外隔离,对内共享资源,接着使用 Cgroups 对其进行资源的控制。Cgroups 提供了四个功能:

  • 资源限制。针对一个进程或进程组,设置资源消耗限制。比如内存超出限制,会导致申请内存失败。
  • 资源统计。统计 CPU 使用时长、内存用量等。
  • 任务控制。控制进程的状态,可以挂起、恢复进程。
  • 优先级分配。设置进程的优先级。

利用 Namespcae 和 Cgroups 提供的沙箱环境,再加上文件系统技术,就支持起了容器技术。</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值