CloudStack怎么添加KVM主机

发布时间:2021-08-17 12:35 来源:亿速云 阅读:0 作者:chen 栏目: 服务器 欢迎投稿:712375056

本篇内容主要讲解“CloudStack怎么添加KVM主机”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CloudStack怎么添加KVM主机”吧!

主要流程

一、添加主机的代码入口是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方法

然后通过一个HandleAgentConnectTask的Task来执行handleConnectedAgent方法

该方法主要做的事情包括:createHostVOForConnectedAgent创建一个HostVo,host数据的插入也是在这个方法中执行

然后是createAttacheForConnect也就是为这个主机创建一个attach并交给attachManagerImpl来管理

接着是方法notifyMonitorsOfConnection,就是通知主机所有的Monitor来processConnect

其中包括StoragePoolMonitor,这个Monitor处理的是将所有该新主机可以利用的存储池跟该主机进行连接,此处不展开

所有这些处理完之后就执行agentStatusTransitTo(host, Event.Ready, _nodeId);将主机状态改为UP

当主机状态为UP之后前面第三步中的waitForHostConnect方法就能顺利的拿到数据了

到这里添加主机的任务基本上也算成功了

免责声明:本站发布的内容(图片、视频和文字)以原创、来自本网站内容采集于网络互联网转载等其它媒体和分享为主,内容观点不代表本网站立场,如侵犯了原作者的版权,请告知一经查实,将立刻删除涉嫌侵权内容,联系我们QQ:712375056,同时欢迎投稿传递力量。