CloudStack怎么添加KVM主机

介绍

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

主要流程

一、添加主机的代码入口是AddHostCmd的执行方法

接着调用LibvirtServerDiscoverer类的发现方法

而在找到方法中先通过SSH连接到对应的主机(我这里agentIp是172.16.65.135)sshConnection=, new  com.trilead.ssh3.Connection (agentIp, 22);

然后利用刚刚建立的连接在主机上执行启动代理命令SSHCmdHelper.sshExecuteCmd (sshConnection, setupAgentCommand +参数,3);

setupAgentCommand=癱loudstack-setup-agent"

该命令在135年主机上执行完之后会启动一个相应的JAVA进程

 CloudStack怎么添加KVM主机

二,稍微分析一下该进程的启动命令:关于jsvc.exec可以参考官方的解释http://commons.apache.org/proper/commons-daemon/jsvc.html

一句话概况jsvc就是让你非常方便简单的Linux环境下启动JAVA应用,跟我们一般用JAVA xxx启动应用的效果是一样的,而后面的- cp很容易联想到是类路径的意思

再仔细看一下后面类路径中的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上的文件)

CloudStack怎么添加KVM主机

再结合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

protected void processRequest(final Link link, final Request request) {

    final AgentAttache attache=(AgentAttache) link.attachment();

    final Command[] cmds=request.getCommands();

    Command cmd=cmds[0];

    boolean logD= true;

 

    if (attache== null) {

        if (!(cmd instanceof StartupCommand)) {

CloudStack怎么添加KVM主机