文章归档

Namespaces系列4:user namespace

User namespaces are have been introduced as early as Linux 3.5 and are considered as stable starting with Linux 4.3.

1. 简介

user namespace是最近才出现在内核主干里的,主要是为了隔离安全相关的标识和属性,例如 user IDs and group IDs (see credentials(7)), the root directory, keys (see keyctl(2)), and capabilities等等。但是从内核实现上来看,user namespace只是简单的提供了一种uid/gid映射机制,capabilities虽然与user namespace非常相关,但它不是user namespace中的概念,capabilities是进程的概念,它是进程的一种属性,它要远比user namespace出现的早

在这篇文章里,我们分四步走:

  1. 我们先来了解一下,user namespace的基本用法
  2. 以及user namespace如何结合capabilities实现容器的安全性隔离
  3. user namespace在解决什么问题?
  4. 内核实现
  5. 与其他namespace的交互以及兼容性问题

简单来说,有了这个东西之后,容器可以有一个假的root账户,在不影响宿主安全的情况下,最大限度的使用更多的内核特权功能,user namespace让容器变得更像虚拟机了

»» 继续阅读全文

文件系统:overlayfs

overlay文件系统的主要目的是要实现文件系统重叠,docker中的差分机制所依赖的文件系统分层就是依赖这种技术来实现的

1. upper and lower

overlay机制允许将两个文件系统重叠成一个文件系统,其中一个是upper,另一个是lower,对用户的可视顺序是: upper -> lower

简单来说,如果upper和lower同时存在一个相同的文件,那么用户看到的是upper中的文件,lower中的同路径文件会被自动隐藏

overlay只关心文件,目录是会被穿透的,所以严格来说,overlay重叠的是目录树,而不是“文件系统”

所有的修改都会写入upper,lower是只读的。upper的文件系统必须支持trusted.*扩展属性,所以upper是不支持NFS的

»» 继续阅读全文

tc: htb分层令牌桶

分层令牌桶是tc中最强大的工具,没有之一,htb使用令牌桶的原理,结合分类、过滤器,可以实现非常复杂的流控,更重要的是,htb支持流量租借,当孩子节点流量不足或者也叫带宽不足但是父亲节点流量仍有冗余的情况下,孩子节点通过超发模式使用父亲的带宽资源

1. 令牌桶

令牌桶是HTB的基础,HTB主要是在令牌桶的原理之上支持了分层机制

令牌桶算法是网络流量整形和速率限制中最常使用的一种算法,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送

»» 继续阅读全文

使用tc实现container级别的流控

关于tc的用法:http://pipul.org/2015/07/queueing-disciplines-for-bandwidth-management/

流控需要解决两个非常核心的问题:

  • 资源配额
  • 超发

超发和配额的区别在于,配额是分配给你能够保证你真实拥有的资源,当你需要使用就能立即能用的资源,能够完全独立支配而不受其他container的干扰。但是配额的问题在于很容易造成资源浪费或者无法应对峰值负载。因为流量是很容易具备时段性的

超发当你资源不足而别人资源冗余的时候,你能够使用别人的空闲资源

从业务方角度来看,这是一个成本控制的问题,从平台方的角度来看,这是一个提升整体的资源利用率的问题。

»» 继续阅读全文

The Linux Scheduler: a Decade of Wasted Cores

论文原址:http://www.ece.ubc.ca/~sasha/papers/eurosys16-final29.pdf

这是一篇很好的linux调度器综述论文,论文首先介绍了linux调度器的基本工作原理,然后介绍了调度器算法的改进历史,最后详细分析了现有调度器负载均衡算法的4个bug,正如论文的标题所说:a Decade of Wasted Cores,这些bug导致了内核在某些场景下很容易会出现多核负载不均衡的现象,例如一些核心非常忙,但是另外一些核心仍然处于idle状态,等等

»» 继续阅读全文

Dynamic writeback throttling

https://lwn.net/Articles/405076/

Dynamic writeback throttling最主要的核心思想就是IO带宽估算。

the bandwidth estimation allows the kernel to scale dirty limits and I/O sizes to make the best use of all of the devices in the system, regardless of any specific device's performance characteristics. 传统writeback机制的做法是,当进程脏页超过一定比例时,调用balance_dirty_pages()函数进入同步写dirty pages过程,直到dirty pages的比例下降到一定比例,之后才允许该进程返回。

该机制存在三个问题:

  1. 进程脏页比率多少才合适?
  2. 内存压力太大时,多个后台进程同时writeback,会产生大量的随机IO,设备吞吐量下降
  3. 如何更准确的估算设备的真实带宽?

Dynamic writeback throttling的基本做法是:

  1. 启发式的计算设备的真实带宽
  2. 用户进程不再主动同步写,而是通过wait方式等待后台进程刷脏页

»» 继续阅读全文

浅析 Linux 初始化 init 系统

  1. 浅析 Linux 初始化 init 系统,第 1 部分: sysvinit
  2. 浅析 Linux 初始化 init 系统,第 2 部分: UpStart
  3. 浅析 Linux 初始化 init 系统,第 3 部分: Systemd

其中关于systemd对系统启动速度的优化很有趣,另外systemd引入的资源隔离也是一个很值得思考的问题。

基于veth的网络虚拟化

关于Network Namespace的原理不再详解,请直接移步:Namespaces in operation, part 7: Network namespaces 

但是需要注意的,这个文章里network namespace操作所使用的是最新内核&操作系统提供的非常便利的ip netns工具,不过这些工具在低版本的操作系统上都是不提供的。如果真的需要使用network namespace,最好通过netlink编程的方式来实现,直接基于操作系统调用来完成所有设备的虚拟化工作 我们知道在clone进程的时候使用CLONE_NEWNET参数可以创建一个新的独立的network namespace,但是光有这个还是远远不够的,所有网络设备都没有初始化、没启动,这个时候的容器就是一个完全的离线的容器,不在任何网络里,也访问不了任何网络。 

为了让容器独立能够与外网接通,我们需要创建并初始化一些设备,让容器内的网络和外网互通,veth是一种比较简单的方案

»» 继续阅读全文

Namespaces系列3:network namespace

As the name would imply, network namespaces partition the use of the network—devices, addresses, ports, routes, firewall rules, etc.—into separate boxes, essentially virtualizing the network within a single running kernel instance. Network namespaces entered the kernel in 2.6.24

1. 简介

简单点来说,network namespace主要实现了一套独立的协议栈,为不同的应用程序实现完整的网络隔离

由于有了独立的网络协议栈,应用程序可以灵活自主的组建适合自己的网络架构。network namespace技术本身其实不复杂,复杂的是有了network namespace之后网络的构建,就像给你一堆服务器,交换机,路由器,你需要用网线把这些设备连接起来,并设置路由规则,防火墙规则,网络地址等等,才能实现网络访问

network namespace能解决很多问题,常见的如端口

在多个业务混部在同一个机器上的时候,端口协调是一件非常困难的事情,kubernetes在介绍自身的网络模型中也提到了这一点:

Coordinating ports across multiple developers is very difficult to do at scale and exposes users to cluster-level issues outside of their control. Dynamic port allocation brings a lot of complications to the system - every application has to take

»» 继续阅读全文

Namespaces系列2:mnt namespace

mnt namespaces是实现容器文件系统最核心的基础技术之一,mnt namespaces可以为容器提供一个独立的文件系统视图

这里我除了介绍mnt namespace相关技术之外,还介绍shared subtrees技术,which allows mount and unmount events to be propagated between mount namespaces in an automatic, controlled fashion.

1. 简介

mnt namespaces是linux最早引入的namespace,appearing in 2002 in Linux 2.4.19. 主要是为了隔离不同进程组可以看到的挂载点,meaning that processes in different namespaces see and are able to manipulate different views of the single directory hierarchy.

这里面的隔离有几个意思:

  1. 同一个mnt namespace下的所有进程看到的mount points一定是一样的
  2. 不同的mnt namespace下的进程看到的mount points不一定是一样的
  3. 不同的mnt namespace下所做的mount和umount操作,都是互相不可见的

这个不一定的原因是因为mnt namespace刚创建出来的时候,默认会继承父亲namespace的所有信息,但是如上面第三点说的,之后所做的任何mount & umount操作,都与父namespace无关,也和任何其他的namespace无关

操作系统启动的时候,内核会为系统初始化一个根mnt namespace,也叫"initial namespace". 后面的mnt namespace都是通过clone系统调用 + CLONE_NEWNS参数创建出来的,When a new mount namespace is created, it

»» 继续阅读全文

第 1 页,共 5 页12345