Jenkins Slave离线节点连接超时/关闭 - Docker容器 - 重新启动步骤 - 配置正在选择旧端口

时间:2017-07-28 00:36:15

标签: jenkins ssh port jenkins-plugins jenkins-docker

Jenkins版本: 1.643.2

Docker插件版本: 0.16.0

在我的Jenkins环境中,我有一个带有2-5个从属节点服务器的Jenkins主服务器(slave1,slave2,slave3)。

使用Docker Plugin在Jenkins Global配置中配置了每个从属。

一切都在这一刻起作用。

我看到我们的监控系统为slave3上的高SWAP空间使用投了一些警报(对于ex IP:11.22.33.44)所以我ssh到那台机器并运行:sudo docker ps这给了我有效的输出此slave3机器上当前正在运行的docker容器。

通过在目标奴隶的机器上运行ps -eo pmem,pcpu,vsize,pid,cmd | sort -k 1 -nr | head -10(其中有4个容器正在运行),我发现进入所有RAM的前5个进程在每个容器内运行java -jar slave.jar。所以我想为什么不重新启动狗屎并重新收回一些内存。在以下输出中,我看到sudo docker ps步骤之前和之后docker restart <container_instance>命令的状态。向右滚动,您会注意到在容器ID的第二行中以...0a02结尾,主机(slave3)机器上的虚拟端口(在 NAMES 标题下列出)为1053(其中被映射到容器的虚拟IP的端口22用于SSH)​​。很酷,这意味着,当来自Jenkins Manage Node部分时,如果你试图重新启动奴隶的容器,Jenkins将尝试连接到HOST IP的11.22.33.44:1053并做任何应该成功带来奴隶的事情起来。所以,Jenkins在某个地方拿着那个PORT(1053)。

CONTAINER ID        IMAGE                                                   COMMAND                  CREATED             STATUS              PORTS                  NAMES
ae3eb02a278d        docker.someinstance.coolcompany.com:443/jenkins-slave-stable-image:1.1   "bash -c '/usr/sbin/s"   26 hours ago        Up 26 hours         0.0.0.0:1048->22/tcp   lonely_lalande
d4745b720a02        docker.someinstance.coolcompany.com:443/jenkins-slave-stable-image:1.1   "bash -c '/usr/sbin/s"   9 days ago          Up About an hour    0.0.0.0:1053->22/tcp   cocky_yonath
bd9e451265a6        docker.someinstance.coolcompany.com:443/jenkins-slave-stable-image:1.1   "bash -c '/usr/sbin/s"   9 days ago          Up About an hour    0.0.0.0:1050->22/tcp   stoic_bell
0e905a6c3851        docker.someinstance.coolcompany.com:443/jenkins-slave-stable-image:1.1   "bash -c '/usr/sbin/s"   9 days ago          Up About an hour    0.0.0.0:1051->22/tcp   serene_tesla

sudo docker restart d4745b720a02; echo $?
d4745b720a02
0

CONTAINER ID        IMAGE                                                   COMMAND                  CREATED             STATUS              PORTS                  NAMES
ae3eb02a278d        docker.someinstance.coolcompany.com:443/jenkins-slave-stable-image:1.1   "bash -c '/usr/sbin/s"   26 hours ago        Up 26 hours         0.0.0.0:1048->22/tcp   lonely_lalande
d4745b720a02        docker.someinstance.coolcompany.com:443/jenkins-slave-stable-image:1.1   "bash -c '/usr/sbin/s"   9 days ago          Up 4 seconds        0.0.0.0:1054->22/tcp   cocky_yonath
bd9e451265a6        docker.someinstance.coolcompany.com:443/jenkins-slave-stable-image:1.1   "bash -c '/usr/sbin/s"   9 days ago          Up About an hour    0.0.0.0:1050->22/tcp   stoic_bell
0e905a6c3851        docker.someinstance.coolcompany.com:443/jenkins-slave-stable-image:1.1   "bash -c '/usr/sbin/s"   9 days ago          Up About an hour    0.0.0.0:1051->22/tcp   serene_tesla

运行sudo docker restart <instanceIDofContainer>后我运行free -h / grep -i swap /proc/meminfo并找到了RAM(之前已经完全使用并且只显示剩余的230MB免费),现在是1GB免费和SWAP大小是总共1G,1G使用(我尝试了60或10的swappiness),现在450MB交换空间免费。所以警报事情得到了解决。凉。

但是,正如您在上面的sudo docker ps输出中注意到的那样,在重启步骤之后,对于该容器ID ...0a02,我现在有了一个新的PORT#1054 !!

当我去管理节点&gt;试图让这个节点脱机,停止并重新启动它,Jenkins没有拿起新的端口(1054)。它仍然以某种方式选择旧端口1053(同时尝试在端口1053上建立到11.22.33.44(主机IP)的SSH连接(映射到容器的虚拟IP的端口#22(ssh))。

如何在Jenkins中为此从属容器更改此端口或配置,以便Jenkins能够看到新的PORT并成功重新启动?

PS:点击节点上的“配置”以查看其配置并未向我显示除名称字段以外的任何内容。通常在常规从站中有很多字段(您可以在其中定义标签,根目录,启动方法,属性env变量,从属环境的工具,但我想对于这些Docker容器,我没有看到除了名称字段)。单击Jenkins Global配置中的测试连接(在 Docker 插件部分下),显示它已成功找到Docker 1.8.3版本

现在,因为1053端口(telnet)不能工作,因为它现在是1054用于此容器的instanceID(在重启步骤之后),Jenkins重启步骤在SSH连接步骤中失败(首先通过SSH方法连接)

enter image description here

[07/27/17 17:17:19] [SSH] Opening SSH connection to 11.22.33.44:1053.
Connection timed out
ERROR: Unexpected error in launching a slave. This is probably a bug in Jenkins.
java.lang.IllegalStateException: Connection is not established!
    at com.trilead.ssh2.Connection.getRemainingAuthMethods(Connection.java:1030)
    at com.cloudbees.jenkins.plugins.sshcredentials.impl.TrileadSSHPasswordAuthenticator.canAuthenticate(TrileadSSHPasswordAuthenticator.java:82)
    at com.cloudbees.jenkins.plugins.sshcredentials.SSHAuthenticator.newInstance(SSHAuthenticator.java:207)
    at com.cloudbees.jenkins.plugins.sshcredentials.SSHAuthenticator.newInstance(SSHAuthenticator.java:169)
    at hudson.plugins.sshslaves.SSHLauncher.openConnection(SSHLauncher.java:1212)
    at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLauncher.java:711)
    at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLauncher.java:706)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
[07/27/17 17:19:26] Launch failed - cleaning up connection
[07/27/17 17:19:26] [SSH] Connection closed.

1 个答案:

答案 0 :(得分:0)

行。 Zeeesus!

在JENKINS_HOME(MASTER服务器)中,我搜索了哪个配置文件正在保存那个/那些现在显示为OFFLINE的容器节点的OLD端口#info。

将目录更改为:$ JENKINS_HOME中的nodes文件夹,发现每个节点都有config.xml文件。

对于前: 的 $ JENKINS_HOME /节点 / <slave3_node_IP> - d4745b720a02 / config.xml中

解决步骤

  1. Vim编辑了文件以使用NEW端口更改OLD。
  2. 管理Jenkins&gt;从磁盘重新加载配置。
  3. 管理节点&gt;选择离线的特定节点。
  4. 重新启动slave,这次Jenkins选择了新的PORT并按预期启动了容器slave(在配置更改后可以看到SSH连接到新端口)。
  5. 我认为此页面为:https://my.company.jenkins.instance.com/projectInstance/docker-plugin/server/ <slave3_IP> /网页,其中显示所有容器信息(以在给定从属计算机上运行的表格形式),此页面有一个按钮(最后一列) )停止给定的从属容器,但不是START或RESTART。

    拥有 START RESTART 按钮,我应该以某种方式执行上述操作。

    更好的解决方案:

    发生的事情是,在slave3上运行的所有4个长寿容器节点竞争获得所有可用的RAM(11-12GB)以及JVM进程的时间(重新启动步骤启动的java -jar slave.jar)单个容器上运行在slave3从服务器上的目标容器的虚拟机(IP)试图获取尽可能多的内存(RAM)。这导致了很少的免费内存,因此SWAP得到了使用,也被用到了一个监控工具将通过发送通知等开始尖叫的地步。

    要解决这个问题,首先应该做的是:

    1)在Jenkins Global配置下(管理Jenkins&gt;配置系统&gt; Docker插件部分,针对该从属服务器的图像/ Docker模板,在高级设置<下/ strong>部分,我们可以放置JVM选项告诉容器不要竞争所有RAM。放下以下JVM选项会有所帮助。这些JVM设置会尝试将每个容器的堆空间保存在一个较小的框中,以免挨饿系统的其余部分。

    您可以从3-4GB开始,具体取决于您的从属/机器上将运行基于容器的从属节点的RAM总量。

    enter image description here

    2)查找slave.jar的任何最新版本(可能有一些性能/维护增强功能,这将有所帮助。

    3)集成监控解决方案(Incinga / etc)以自动启动Jenkins作业(其中Jenkins作业将运行一些操作--BasH one liner,Python shit或Groovy goodness,Ansible playbook等)来修复与此类警报有关的问题。

    4)自动重新启动容器从属节点(即重新启动步骤) - 使从属离线,在线,重新启动步骤,因为这将使从属设备恢复到恢复活力的新鲜状态。我们所要做的就是寻找一个空闲的奴隶(如果它没有运行任何工作),然后让它离线&gt;然后在线&gt;然后通过一个小的Groovy脚本使用Jenkins REST API重新启动slave,并将其全部放在Jenkins作业中,如果那些从属节点很长时间,就让它执行上述操作。

    5)或者可以动态地旋转基于容器的从属设备 - 每次Jenkins对要运行的作业进行排队时,使用并抛出模型。