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方法连接)
[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.
答案 0 :(得分:0)
行。 Zeeesus!
在JENKINS_HOME(MASTER服务器)中,我搜索了哪个配置文件正在保存那个/那些现在显示为OFFLINE的容器节点的OLD端口#info。
将目录更改为:$ JENKINS_HOME中的nodes文件夹,发现每个节点都有config.xml文件。
对于前:
的 $ JENKINS_HOME /节点强> / <slave3_node_IP>
- d4745b720a02 / config.xml中
解决步骤:
我认为此页面为: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总量。
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对要运行的作业进行排队时,使用并抛出模型。