54 CHEN

Cloud Foundry之warden代码解读-part3

warden 简介 cloudfoundry是vmvare推出来的开源PaaS平台,warden是其核心部分的资源管理容器,完成了各种资源分配的事情。

代码位置在: https://github.com/cloudfoundry/warden

根据part2里提到的过程,本节以create命令为例进行追踪。

调用过程:
bin/warden-repl » lib/warden/repl.rb » Warden::Client » warden.sock » lib/warden/server.rb « Warden::Server.run! « Rakefile
处理调用:
server.rb > ClientConnection > receive_request > process(request) > process_container_request(request, container) > base.rb > dispatch(request, &blk) > send(do_method, request, response, &blk) -> linux.rb > do_xxx > shell script

过程放大

一、进入repl命令行

1.1 名词

bundle:主要用于管理Ruby应用程序的依赖关系,并按照此依赖关系安装所需的Gems。当运行bundle install命令来安装Gems时,bundler会使用当前目录下的名为Gemfile的文件来处理依赖关系。
gem:就是ruby的软件包,一个gem就是一个ruby软件。
Gemfile:定义了各种依赖情况,bundler命令必须在存在此文件的目录下执行。
Gemfile.lock:记录本机目前所有依赖的gem命令和版本。
rake:编译工具,类似java的ant。
Rakefile:rake命令所定义的配置任务文件,类似ant.xml。

1.2 进入

#sudo bundle exec bin/warden-repl

使用bundle exec来保证项目依赖的gem版本。在bin目录下有warden-repl脚本(ruby),这将会执行lib/warden/repl.rb文件,先会使用Warden:Client发起对warden.sock的连接,然后在start方法中对命令行模式的交互进行反馈。

二、输入create 当输入create时,repl.rb执行到process_line中的respond_to的判断:

2.1 respond_to?

if respond_to? words[0].to_sym。。。
这种写法的意思是,当前对象中是否有方法名为words[0].to_sym变量值的方法。

2.2 create

repl.rb果断有这个create方法,然后talk_to_warden。就进入了client写的过程了。

三、warden收到create的响应

3.1 warden server的启动

早在part2中,使用了命令:

sudo bundle exec rake warden:start[config/linux.yml]

就已经启动了warden。
这将使在bundle定义的环境下,执行warden/warden/Rakefile里写好的任务:Warden::Server.run!。

3.2 warden server的响应

在lib/warden/server.rb中,run!方法下,使用了EM的start_unix_domain_server的方法启动了一个unixsock,第二个参数ClientConnection定义了接收到东西怎么处理。
ClientConnection中的process方法具体处理了create:

when Protocol::CreateRequest
container = Server.container_klass.new
container.register_connection(self)
response = container.dispatch(request)

container_klass为配置中的Warden::Container::Linux。

最终,将会执行linux.rb中的do_create方法。

四、shell脚本中的猫腻 warden/root/linux中,有大量的sh脚本,里面通过一系列的命令,完成了基础环境的搭建,非常值得一读。

4.1 linux/base/setup.sh

这个脚本在运行安装warden时会被执行,按照执行过程:
1)分析本机最近的apt源地址。
2)debootstrap到/tmp/warden中
3)debootstrap的作用见前面的文章,主要是可以用于在系统的某个目录中安装一套基本系统. http://www.54chen.com/architecture/cloud-foundry-warden-part1.html
4)使用chroot将子系统中的缺失软件安装好

4.2 base.rb的dispatch create过程

1)拼接before_create
2)执行 linux.rb中的 features/quota.rb的 before_create方法
2.5)执行base中的before_create方法,产生一个十六进制的handle值(也就是每个contaner的标识)
3)setquota
4)linux.rb do_create

4.3 linux.rb的do_create过程

1)create.sh脚本的执行:传入目录,检查是否存在;unshare -m setup.sh。
2)unshare的作用是在指定的环境下执行程序setup.sh,不影响上一级环境。
3)此处的setup.sh与base/setup.sh相比,没有了debootstrap的过程。
4)setup.sh中设置了cgroup、磁盘挂载、限额、网络。
5)紧接着如果需要会执行hook-parent-before-clone.sh
6)修改limits.conf的参数
7)执行start.sh:建立子网,打通两条ssh通道。
8)完成create

五、交互演示

$ sudo bundle exec bin/warden-repl
warden> list
[“16bp35aue5i”]
warden> stop 16bp35aue5i
“ok”
warden> list
[“16bp35aue5i”]
warden> destroy 16bp35aue5i
“ok”
warden> list
nil
warden> create
16bp35aue5j
warden> info 16bp35aue5j
{“state”=>“active”,
“host_ip”=>“10.254.0.5”,
“container_ip”=>“10.254.0.6”,
“container_path”=>"/tmp/warden/containers/16bp35aue5j",
“memory_stat”=> <:protocol::inforesponse::memorystat cache: rss: mapped_file: pgpgin: pgpgout: swap: pgfault: pgmajfault: inactive_anon: active_anon: inactive_file: active_file: unevictable: hierarchical_memory_limit: hierarchical_memsw_limit: total_cache: total_rss: total_mapped_file: total_pgpgin: total_pgpgout: total_swap: total_pgfault: total_pgmajfault: total_inactive_anon: total_active_anon: total_inactive_file: total_active_file: total_unevictable:>,
“cpu_stat”=> <:protocol::inforesponse::cpustat usage: user: system:>,
“disk_stat”=> <:protocol::inforesponse::diskstat bytes_used: inodes_used:>}

warden> spawn 16bp35aue5j w
2 warden> link 16bp35aue5j 2
exit status: 0

stdout:
03:18:51 up 29 days, 14:51, 0 users, load average: 0.00, 0.04, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

stderr:

原创文章如转载,请注明:转载自五四陈科学院[http://www.54chen.com]

Posted by 54chen 架构研究

« cloud foundry之warden代码解读-part2