结合Cloudfoundry v2详解warden的源码分析与使用(一)

来源:互联网 发布:java高并发orm 编辑:程序博客网 时间:2024/06/07 06:16

warden原理解析

 

前提:安装好ruby环境

 

 

安装warden环境并启动warden服务

 

1.首先下载https://github.com/cloudfoundry/warden.git源码,对应warde目录为~/warden

 

上面截图,我们看到其中有vagrantfile说明可以使用vagrnt去启动单vm方式熟悉warden,但是这里我直接在我的虚机里面启动warden服务,并做操作,具体怎么操作下面会介绍到

第一步:

git clonehttps://github.com/cloudfoundry/warden.git

 

2.安装ruby环境

第二步:

PATH=/var/vcap/packages/ruby-2.1.4/bin/:$PATH(这里我直接使用了nisebosh环境下面已经搭建好的ruby环境)

 

3.bundle源码并下载离线库

 

     分析cf源码安装:

    https://github.com/cloudfoundry/cf-release/tree/master/packages/warden


     通过源码可以看到,这里就是将源码放到指定建立warden的目录,并将其gems库下载下来存放到vendor目录


   

 

       所以这里关键就是执行BUNDLE_WITHOUT=development:testbundle package --all即下载离线库

       第三步:

       cd ~/warden

      BUNDLE_WITHOUT=development:test bundle package --all

 

   4;启动warden服务器

 

    分析cf job启动warden源码

   https://github.com/cloudfoundry/cf-release/blob/master/jobs/dea_next/templates/warden_ctl.erb       


通过上面源码我们知道cf是怎么启动warden的,其中还有对启动端口范围的限制,以及对于一个内核bug的屏蔽,主要是ipv6被禁止时候,命名空间被摧毁时候,网络接口无法被消除,所以需要打开ipv6开关

depot是容器存放的目录,安装之前需要清除depot存在容器目录

最后才是启动warden服务

 cp/var/vcap/jobs/dea_next/config/warden.yml ~/warden/warden/(这里我偷懒直接从已经按照好的目录拷贝一份到我自己的warden源码目录)

修改warden.yml信息如下:


画圈的地方是我修改地方

unix_domain_path:与warden通信的目录

contanter_depot_path:存放容器目录的位置

pool_start_address:是网络池路由地址

设置10.254.0.0子网端,这里的网络其实是采用nat方式与host通信

pool_size是ip池ip的最大数量

设置好参数以后只exec bundle exec rake warden:start[warden.yml]

第四步:

 cp/var/vcap/jobs/dea_next/config/warden.yml ~/warden/warden/

修改warden配置

exec bundle exec rake warden:start[warden.yml]

 

5.使用warden

通过warden.sock我们可以直接与服务通信

1.bin/warden --socket warden.sock

上面操作可以使得我们进入warden主进程,并进行warden操作

 

2.create


创建一个容器

 

3.列出所有容器

 

4.info --handle 18


可以看到刚刚创建的容器cpu,memory,cpu,带宽信息

5.limit_memory limit_cpu limit_disk 三个命令主要对cpu,内存,磁盘进行了资源隔离

limit_memory --handle 18pffh3g0bv --limit_in_bytes 51257600

这里就是其中一个操作对内存进行了限制500多M

 

6.这里对于cpu这块的限制主要还是cpushare,也就是cpu占用比例,如果是一块cpu,启动一个容器占用100%,再启动一个就是1:1,总之没启动一个容器,cpu占用将被平均瓜分

 

7如何将文件传人容器呢

这里有2种方式,

一种是直接共享网络,下载容器中

另外一种是通过copy_in进行宿主机到容器的copy

copy_in --handle 18pffh3g0bv --src_path /tmp/apache2 --dst_path/home/vcap(10000)

 

--src_path:源目录

--dst_path:容器目录

这里其实就是对于容器的文件系统的/tmp下面,我们知道cf在启动容器时候,其实是先安装rootfs文件系统的,然后启动容器时候会将rootfscopy一份到容器中,说白了也就copy了一份操作系统到容器目录里面

cf在copy应用时候其实是copy到/home/vcap下面去,并且每个容器vcap目录对应的宿主机用户组是不同的,比如10000,10001,我们可以cd~/warden/warden/depot/18pffh3g0bv/rootfs/home/vcap查看对应文件宿主,并且可以du -sh看到对应目录大小,也就是对应容器配额这块是通过用户组来进行磁盘配额定制,一旦超过配额超过将无法复制

 

7如何启动容器的应用呢

run --hanlde 18pffh3g0bv --script 'cd /home/vcap/apache2/bin &&sh ./apacheXX start'

这里并不是真正对应apache的命令,只是伪命令

 

对应warden容器资源限和读取这块主要源码:

https://github.com/cloudfoundry/warden/tree/master/warden/lib/warden/container/features

 

简介:

cgroup.rb:对应cgroup资源信息进行读取以及除内存资源的限制

mem_limit.rb主要对于cgroup内存进行限制

net.rb对网络的操作

quota.rb对配额进行限制,这里主要是磁盘的限制

 

 

 

 

 

 

0 0
原创粉丝点击