CloudFoundry源码分析:DEA

24 篇文章 0 订阅
11 篇文章 0 订阅

DEA(Droplet Execution Agent),主要流程都在agent.rb文件中实现。

由于CloudFoundry平台是以NATS为中心的,只要弄清楚了这个组件能够处理的NATS消息,也就清楚了这个组件的基本流程。DEA也不例外。

Agent主要注册了以下几种事件,下面分别介绍这些方法的实现流程 。

        NATS.subscribe('dea.status') { |msg, reply| process_dea_status(msg, reply) }
        NATS.subscribe('droplet.status') { |msg, reply| process_droplet_status(msg, reply) }
        NATS.subscribe('dea.discover') { |msg, reply| process_dea_discover(msg, reply) }
        NATS.subscribe('dea.find.droplet') { |msg, reply| process_dea_find_droplet(msg, reply) }
        NATS.subscribe('dea.update') { |msg| process_dea_update(msg) }
        NATS.subscribe('dea.stop') { |msg| process_dea_stop(msg) }
        NATS.subscribe("dea.#{uuid}.start") { |msg| process_dea_start(msg) }
        NATS.subscribe('router.start') {  |msg| process_router_start(msg) }
        NATS.subscribe('healthmanager.start') { |msg| process_healthmanager_start(msg) }
        NATS.subscribe('dea.locate') { |msg|  process_dea_locate(msg) }

(1)dea.status

返回该dea的运行状态信息,包括id,ip,port,version,max_memory,reserved_memory,used_memory,num_clients,state等。

(2)droplet.status

DEA遍历它所管辖的所有droplet instance,分别返回instance的状态信息,包括name,host,port,uris,uptime,mem_quota,disk_quota,fds_quota,usage等

(3)dea.discover

当一个droplet需要一个instance时,cloud controller会向NATS广播dea.discover消息。DEA收到之后,会根据自己情况选择是否回复此消息。当CC收到第一个回复时,就选中这个DEA创建instance。process_dea_discover首先主要判断是否能够运行这个app,包括mem、disk、runtime等限制条件,然后会根据DEA当前的情况计算一个delay,然后在delay之后发送response。这个delay相当于在做balance,比如:一般mem使用量大的DEA会delay比较长,所以比较难以被选中。

(4)dea.find.droplet

通过droplet id查找对应的droplet信息。

(5)dea.update

更新指定droplet的uri信息。
方法首先解析出droplet id和新的uri列表。然后(1) 以新的uris向router注册自己,(2)取消注册不用的uri
register_instance_with_router(instance, :uris => (uris - current_uris))
unregister_instance_from_router(instance, :uris => (current_uris - uris))

(6)dea.stop

通过message中指定的droplet id找到droplet,然后根据其余的信息(version, instance id, index, state)过滤出要停止的instance,对过滤出的instance执行stop_droplet(instance)。
stop instance流程:
(1)从router取消注册
(2)从HealthManager取消注册
(3)调用instance目录下的stop脚本来停止instance
(4)将instance目录清理干净

(7)dea.#{uuid}.start

就是让dea启动一个droplet,对应函数是process_dea_start,start函数也比较长,慢慢看。
从message里面解析出n多的参数,基本上就是droplet和app的一些参数。
做一些mem和fs usage的判断,是否有足够的mem和disk
接下来可以看到:
tgz_file = File.join(@staged_dir, "#{sha1}.tgz")  
instance_dir = File.join(@apps_dir, "#{name}-#{instance_index}-#{instance_id}")  
这个tgz_file就是staged droplet。sha1当初研究了很久,不解其意,这里可以看到其实就是droplet的一个标识,目前手头没有实例可以验证,但是app的目录名称应该也和这个sha1相关。
然后创建了一个instance的map,这个map包含了instance的所有信息,然后处理了一下DEA自己的域。
然后可以看到一个lambda: start_operation。顾名思义就是用来start一个instance的。前面都是一些特殊的配置,暂时不研究了,看主要部分:line 669,这里将DEA项目的bin目录下的close_fds文件拷贝至instance目录下,然后执行,看字面意思是prepare。line697: 获得一个app_env数组,就是instance的一些环境变量,后面会把每个值都export。line 719,就是启动instance的代码了,可以看到只是简单的调用了startup脚本而已,这个脚本就是在stage的时候由stager加入的启动脚本。

然后启动了一个纤程Fiber,首先将staged文件放置到staged dir中(如果有cache最好,否则会去shared folder取,或者会HTTP去读),然后调用start_operation lambda。

(8)router.start

用来向router注册该DEA的所有APP Instances。

DEA收到了router发出的要求注册的信息。DEA循环将所有的APP的所有instances注册到router中,便于router路由app请求信息。

     @droplets.each_value do |instances|
        instances.each_value do |instance|
          register_instance_with_router(instance) if instance[:state] == :RUNNING
        end
      end

(9)healthmanager.start

DEA向HealthManager发送心跳信息

(10)dea.locate

DEA向CC发送改DEA的运行信息,包括memory和runtimes等,供CC选择。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值