Cloud Foundry’s 新容器技术: A Garden Overview

编译自:

http://blog.pivotal.io/cloud-foundry-pivotal/features/cloud-foundry-container-technology-a-garden-overview

http://underlap.blogspot.com/2014/06/warden-meets-libcontainer.html

CloudFoundry(CF)中很早就使用了VMware研发的Warden容器来负责应用的资源分配隔离和实例调度。可惜的是,这一本来可以成为业界标准和并掀起一阵革命的容器PaaS技术却因为Pivotal的方针路线上的种种原因被后来居上Docker吊打至今。最近CFer有醒悟的迹象,在Warden上进行了大量改进和升级,本文就来一窥CF新容器技术的一些要点。

Warden和Garden

Warden背景:

"CloudFoundry’s container technology is provided by Warden,which
was created by VMware’s Pieter Noorduis and others.Warden is a subtle combination of Ruby code, a core written inC, and shell scripts to configure the host and containers."

在此前的WardenDEA中,在每个安装好的DEA上都会运行Warden服务(Ruby写的,调用大量shell来配置host),用来管理Cgroup,Namespaces和以及进程管理。同时,Warden容器的感知和状态监控也由此服务来负责。作为一个C/S结构的服务,Warden使用了谷歌的protobuf协议来负责交互。每个容器内部都运行一个wshd
daemon(C语言写的)来负责容器内的管理比如启动应用进程,输出日志和错误等等。这里需要注意的正是由于使用了protobuf,warden对外的交互部分强依赖于wardenprotocol,使得warden对开发者的易用性大打折扣。

Wardenstructure

在CloudFoundry的下一代PaaS项目Diego中,Pivotal团队对于Warden进行了基于Golang的重构,并建立了一个独立的项目Garden。在Garden中,容器管理的功能被从server代码里分离出来,即server部分只负责接收协议请求,而原先的容器管理则交给backend组件,包括将接收到的请求映射成为Linux(假如是Linux
backend的话)操作。值得注意的是:这样backend架构再次透露出了warden跨平台的野心,可以想象一旦Windowsbackend被社区(比如IronFoundry)贡献出来后的威力。更重要的是,RESTful风格的API终于被引入到了Garden里面,原作者说是为了实验和测试,但实际上Docker最成功的一点正是友好的API和以此为基础的扩展能力。

Gardenstructure

Namespaces

容器化应用依然通过namespaces来定义它所能使用的资源。最简单的例子,应用的运行需要监听指定的端口,而传统方法中这个端口就必须在全局的host网络namespaces上可见。为了避免应用互相之间出现端口冲突,Garden服务就需要设置一组namepaces来隔离每个应用的IP和port(即网络namespace)。需要再次强调,容器化的应用资源隔离不同于传统的虚拟化技术,虽然我们在讲容器,但是我们并没有去创建“什么”,而是为实实在在运行着的应用进程划分属于它自己的“命名空间”。

Garden使用了除用户namespace之外的所有namespace技术。具体实现是使用挂载namespace的方法来用用户目录替换原host的root文件系统(使用pivot_root指令),然后unmount这个root文件系统使得从容器不会直接访问到该目录

备注:Linux在很早之前就支持了namespaces技术,从一开始为文件系统挂载点划分namespace,到最新的为用户添加namespace,具体演化参见:Articles
on Linux namespaces

ResourceControl

被限制在运行在namespaces中的应用可以在这个“匿名的操作系统环境“中自由的使用类似于CPU和MEM这样的资源,但是应用仍然是直接访问系统设备的。Linux提供了一系列controlgroups来将进程划分为层级结构的组然后将它们限制到不同的约束中。这些约束由cgroup中的resourcecontrollers来实现并负责与kernel子系统进行交互。举个例子:memoryresource
controller可以限制一个controlgroup中的进程能够在真实内存中使用的页数,从而确保这些进程在超出限制后被停止。

Garden使用了五种资源控制:cpuset(CPUs and memory nodes) , cpu (CPU bandwidth), cpuacct (CPUaccounting), devices (device access), and memory(memoryusage),并通过这些资源控制堆每一个容器设置一个controlgroup。所以容器中的进程将被限制在resourcecontrollers指定的资源数下运行(严格地说cpuacct仅统计CPUusage,并不做出具体限制)。

此外,Garden还使用setrlimit系统调用来控制容器中进程的资源使用;使用setquota来为容器中的用户设置配额。这一点上也同Warden相同。

NetworkingFacilities

简单来说,每个容器都运行在独立的网络namespace中,Garden负责控制进出容器的网络流量。Garden会创建一对veth(虚拟网卡)设备,为它们分配IP,然后将其中的一个放到容器的网络namespace中。接下来Garden会设置IP路由表来保证IP包能够正确地传入或传出容器。最后,网络包过滤规则会为容器创建防火墙来限制inbound和outbound的流量。这一点上与Warden原先的网络相同。

Containernetworking

RootFile System

Warden是允许用户自己指定一个root文件系统来供容器使用的。而Garden不仅继承了这个功能,更重要的是还能支持从Docker image来构建rootfs。同时,Garden在rootfs中引入了rw权限的层,所以容器可以叠加自己的rootfs而不影响其他容器(比如container A是warden rootfs,而container B是docker
rootfs)

GardenAPI

新的Garden API同样是基于Google protobuf的,包括如下所有操作:

  • Capacity– returns the memory and disk capacity of the host machine
  • Create– creates a container and returns its handle (a string which identifies the container)
  • Info –returns information about a specified container such as its IPaddress and a list of processes running in the container
  • Run –spawns a process in the container and streams its output back to theclient
  • Attach– starts streaming the output of a specified process ina specified container back to the client
  • List –lists all container handles
  • LimitBandwidth,LimitCpu, LimitDisk, LimitMemory – adjusts the limits of aspecified container for network bandwidth, CPU shares,disk
    usage, and memory usage, respectively
  • NetIn –maps a port on the host machine to a port in the specified container
  • NetOut– whitelists outbound network traffic from the specified containerto a specified network and/or port
  • StreamIn– copies data into a specified file in the specifiedcontainer’s file system
  • StreamOut– copies data out of a specified file in the specifiedcontainer’s file system
  • Ping –checks that the garden server is running
  • Stop –terminates all processes in a specified container but leaves thecontainer around (instopped state)
  • Destroy– destroys the specified container

Merge Warden with Docker?

与此同时,Pivotal还计划通过更通用的驱动层来将Docker直接merge到现有的系统中。主要实现方式是为前面所说的backend添加libcontainer-specific backend,如下图所示:

这样,用户的请求将通过这个backend翻译成libcontainer API来启动Docker镜像——比如将用户的应用run在Docker而不是Warden容器中。但是这个feature是作为一个长期计划与Garden并行的,主要原因应该是libcontainer的API并没有完全ready,目前还在采用很初级的替代方案。

综上,CF的新容器技术向后来者Docker展示了友好的一面,并且把握住了Docker image这一核心value而不是费力不讨好地支持所有Docker feature。但是这此的改动还是一次被动的应对,恐怕只有Windows backend和libcontainer backend的及时release才能迅速扭转局面。

时间: 2024-07-31 09:12:33

Cloud Foundry’s 新容器技术: A Garden Overview的相关文章

Cloud Foundry技术全貌及核心组件分析

原文链接:http://www.programmer.com.cn/14472/ 历经一年多的发展,Cloud Foundry的架构设计和实现有了众多改进和优化.为了便于大家了解和深入研究首个开源PaaS平台——Cloud Foundry,<程序员>杂志携手Cloud Foundry社区开设了“深入Cloud Foundry”专栏,旨在从架构组成.核心模块功能.源代码分析等角度来全面剖析Cloud Foundry,同时会结合各行业的典型案例来讲解Cloud Foudry在具体应用场景中的表现.

如何在SAP云平台的Cloud Foundry环境下添加新的Service(服务)

我想在SAP云平台的Cloud Foundry环境下使用MongoDB的服务,但是我在Service Marketplace上找不到这个服务. cf marketplace返回的结果也没有. 解决方案 退回到Global Account,点击Entitlement,发现没有给Subaccount分配MongoDB: 分配成1,保存即可. 再回到organization的space下面,发现现在MongoDB服务可用了. cf marketplace能看到MongoDB服务的版本. 要获取更多Je

Pivotal Cloud Foundry安全原理解析

云计算相关的技术几乎都对传统网络架构和安全规则产生一定的冲击,Pivotal Cloud Foundry(PCF)也不例外,去年8月为了说服专业安全组织同意PaaS部署方案,特意为他们深入讲了下PCF的安全机制,虽然这种原理性的东西不符合开博的宗旨,但是为了防止大家也要说服这样的组织,分享出来也算是云计算实务的一部分.不过说实话,个人以为既然我们开始拥抱云计算和大数据,那在安全上就应该有新的认识和实践. 本文是基于PCF1.2进行的说明,现在的版本里Availability Zone和App S

Cloud Foundry中warden的网络设计实现——iptable规则配置

在Cloud Foundry v2版本中,该平台使用warden技术来实现用户应用实例运行的资源控制与隔离. 简要的介绍下warden,就是dea_ng如果需要运行用户应用实例(本文暂不考虑warden container提供staging打包环境),则发送相应请求给warden server,由warden server来创建warden container,并在warden container内部运行应用实例,而warden container的具体实现中使用cgroups等内核虚拟化技术,

Cloud Foundry中DEA启动应用实例时环境变量的使用

在Cloud Foundry v2中,当应用用户须要启动应用的实例时.用户通过cf CLI向cloud controller发送请求,而cloud controller通过NATS向DEA转发启动请求.真正运行启动事宜的是DEA,DEA主要做的工作为启动一个warden container, 并将droplet等内容拷贝进入container内部.最后配置完指定的环境变量,在这些环境变量下启动应用的启动脚本. 本文将从阐述Cloud Foundry中DEA怎样为应用实例的启动配置环境变量. DE

Cloud Foundry buildpack实务解析

与service broker相比,buildpack的实务操作就容易多了,单就通用概念来说,其实用不着单写一篇,但是处女座强迫症发作,所以还是写一下,使CF这个框架对外扩展的两个维度(代码使用的服务和代码运行的环境)是完整的.这篇主要会写buildpack的基本实现逻辑,然后举三个需要修改buildpack的需求,进行实际操作描述. 基本原理 CF运行应用的基本过程是将用户发布的应用程序包解压开,然后将自己的所有buildpack拿来,按照指定顺序与程序包进行匹配,直到找到第一个能够运行这些代

Cgroup maintainer李泽帆:解剖Linux内核容器技术

摘要:Cgroup和namespace等内核特性如何出现,在社区处于怎样的开发状况?Docker如火如荼,内核社区是否会因此加紧完善容器技术的隔离性安全性?华为Linux内核高级工程师李泽帆将在2015 Container技术峰会上详细解说. 2015年4月16-18日,由CSDN主办.CSDN专家顾问团支持的OpenCloud 2015大会将在北京国家会议中心拉开帷幕.为期三天的大会,以推进行业应用中的云计算核心技术发展为主旨,聚焦技术创新与应用实践,设置了"2015 OpenStack技术大

外网如何访问 Service?- 每天5分钟玩转 Docker 容器技术(139)

除了 Cluster 内部可以访问 Service,很多情况我们也希望应用的 Service 能够暴露给 Cluster 外部.Kubernetes 提供了多种类型的 Service,默认是 ClusterIP. ClusterIP Service 通过 Cluster 内部的 IP 对外提供服务,只有 Cluster 内的节点和 Pod 可访问,这是默认的 Service 类型,前面实验中的 Service 都是 ClusterIP. NodePort Service 通过 Cluster 节

Cloud Foundry平台中国唯一云供应商,阿里云持续链接Cloud Foundry/Kuber

摘要: 日前,在Cloud Foundry Summit 2018大会上,基金会执行董事Abby Kearns宣布,阿里云成为Cloud Foundry平台中国区唯一公共云基础设施提供商:"中国企业将在Cloud Foundry和阿里云共同作用下得到更加优质的体验". 日前,在Cloud Foundry Summit 2018大会上,基金会执行董事Abby Kearns宣布,阿里云成为Cloud Foundry平台中国区唯一公共云基础设施提供商:"中国企业将在Cloud Fo