本篇内容主要讲解“CloudStack怎么添加KVM主机”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CloudStack怎么添加KVM主机”吧!
创新互联建站主要从事成都网站建设、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务松岭,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108
一、添加主机的代码入口是AddHostCmd的execute方法
接着调用LibvirtServerDiscoverer类的find方法
而在find方法中先通过SSH连接到对应的主机(我这里agentIp是172.16.65.135)sshConnection = new com.trilead.ssh3.Connection(agentIp, 22);
然后利用刚刚建立的连接在主机上执行启动agent命令SSHCmdHelper.sshExecuteCmd(sshConnection, setupAgentCommand + parameters, 3);
setupAgentCommand = "cloudstack-setup-agent"
该命令在135主机上执行完之后会启动一个相应的JAVA进程
二、稍微分析一下该进程的启动命令:关于jsvc.exec可以参考官方的解释http://commons.apache.org/proper/commons-daemon/jsvc.html
一句话概况jsvc就是让你非常方便简单的Linux环境下启动JAVA应用,跟我们一般用java xxx启动应用的效果是一样的,而后面的-cp很容易联想到是classpath的意思
再仔细看一下后面classpath中的jar包中包含了cloud-agent-4.3.2.jar,所以该进程的启动入口也就是com.cloud.agent.AgentShell的main方法
三、 我们稍微离开主机上发生的事情再回到管理节点来看
通过SSH执行完启动agent命令之后CS执行的是HostVO connectedHost = waitForHostConnect(dcId, podId, clusterId, guid);
注意此时数据库的host表中还没有关于该主机的记录
而waitForHostConnect方法中是一个_waitTime*2也就是10次的循环,每次循环中间让线程sleep30秒,
也就是总共5分钟来等待其他线程来将该主机的记录插入host表中,如果超过5分钟都没有拿到connectedHost就直接返回Null
四、 接下来我们关心的就是数据是怎样插入host表的
让我们把目光再次回到主机agent身上,看看JAVA进程启动之后发生了什么事情
通过查看日志文件/var/log/cloudstack/agent/agent.log(此处是在主机172.16.65.135上的文件)
再结合AgentShell这个类的代码总结一下agent进程在启动之后的运行流程如下:
创建一个Agent对象Agent agent = new Agent(this, localAgentId, resource); 注意 Agent 中有一个NioConnection _connection;实例化为一个NioClient
然后就是NioClient的初始化init方法
这里利用的是JAVA的NIO来进行通讯,具体的解释可以参考我的另一篇文章https://my.oschina.net/abelgroup/blog/849680
第一步就是建立跟管理节点也就是172.16.60.197的连接,如日志所示
连接上之后就是创建一个ServerHandler的Task放到线程池来执行
接着执行sendStartup(link)方法,该方法主要就是利用link来发送一个StartupRoutingCommand到管理节点
五、现在我们又回到管理节点来继续处理刚刚从agent中发送过来的StartupRoutingCommand这个命令
我们知道在CS中有一个AgentManagerImpl的实例对象,该对象持有一个NioServer,监听的端口8250正好是agent建立连接的端口
NioServer通过一个死循环来监听事件,当agent发送数据过来之后会执行NioConnect的read方法protected void read(final SelectionKey key)
接着创建一个AgentHandler的Task,然后执行它的processRequest方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
然后通过一个HandleAgentConnectTask的Task来执行handleConnectedAgent方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
该方法主要做的事情包括:createHostVOForConnectedAgent创建一个HostVo,host数据的插入也是在这个方法中执行
然后是createAttacheForConnect也就是为这个主机创建一个attach并交给attachManagerImpl来管理
接着是方法notifyMonitorsOfConnection,就是通知主机所有的Monitor来processConnect
其中包括StoragePoolMonitor,这个Monitor处理的是将所有该新主机可以利用的存储池跟该主机进行连接,此处不展开
所有这些处理完之后就执行agentStatusTransitTo(host, Event.Ready, _nodeId);将主机状态改为UP
当主机状态为UP之后前面第三步中的waitForHostConnect方法就能顺利的拿到数据了
到这里添加主机的任务基本上也算成功了
到此,相信大家对“CloudStack怎么添加KVM主机”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!