RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
CloudStack怎么添加KVM主机

本篇内容主要讲解“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进程

CloudStack怎么添加KVM主机

二、稍微分析一下该进程的启动命令:关于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上的文件)

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)) {

            s_logger.warn("Throwing away a request because it came through as the first command on a connect: " + request);

        else {

            // submit the task for execution

            request.logD("Scheduling the first command ");

            connectAgent(link, cmds, request);

        }

        return;

    }

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

private AgentAttache handleConnectedAgent(final Link link, final StartupCommand[] startup, final Request request) {

    AgentAttache attache = null;

    ReadyCommand ready = null;

    try {

        final HostVO host = _resourceMgr.createHostVOForConnectedAgent(startup);

        if (host != null) {

            ready = new ReadyCommand(host.getDataCenterId(), host.getId());

            attache = createAttacheForConnect(host, link);

            attache = notifyMonitorsOfConnection(attache, startup, false);

        }

    catch (final Exception e) {

        s_logger.debug("Failed to handle host connection: " + e.toString());

        ready = new ReadyCommand(null);

        ready.setDetails(e.toString());

    finally {

        if (ready == null) {

            ready = new ReadyCommand(null);

        }

    }

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

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

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

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

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

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

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

到此,相信大家对“CloudStack怎么添加KVM主机”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


本文题目:CloudStack怎么添加KVM主机
网页链接:http://lswzjz.com/article/gpogdo.html