Jenkins主节点无法通过SSH连接Docker代理节点求助
Jenkins主节点Docker容器无法SSH连接代理节点(超时错误)
我在本地Ubuntu工作站搭建测试用Jenkins环境,主节点以Docker容器运行(版本2.479.2),按以下步骤配置第二个Docker容器作为代理节点,但主节点无法通过SSH连接代理节点,出现连接超时错误。
已执行的配置步骤
- 在宿主机生成SSH密钥:
ssh-keygen -f jenkins_key - Jenkins网页端创建凭据,配置如下:
| 设置项 | 值 |
|---|---|
| 类型 | SSH用户名带私钥 |
| 作用域 | 全局 |
| ID | jenkins |
| 用户名 | jenkins |
| 私钥 | 直接输入jenkins_key的私钥内容 |
- 创建代理容器命令:
docker run --name jenkins-agent -d --rm -p 4444:22 -e "JENKINS_AGENT_SSH_PUBKEY=<<SSH公钥内容>>" jenkins/ssh-agent
其中<<SSH公钥内容>>是jenkins_key.pub的完整内容,格式类似ssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX myuser@computername
4. Jenkins网页端添加新节点,配置如下:
| 设置项 | 值 |
|---|---|
| 节点名称 | agent1 |
| 类型 | 永久代理 |
| 远程根目录 | /home/jenkins |
| 标签 | agent1 |
| 使用方式 | 尽可能使用此节点 |
| 启动方式 | 通过SSH启动代理 |
| 主机 | Ubuntu工作站IP(Docker宿主机) |
| 凭据 | jenkins |
| 主机密钥验证策略 | 手动信任密钥验证策略 |
| 高级->端口 | 4444 |
错误日志
SSHLauncher{host='XXX.XXX.XXX.XXX', port=4444, credentialsId='jenkins', jvmOptions='', javaPath='', prefixStartSlaveCmd='', suffixStartSlaveCmd='', launchTimeoutSeconds=60, maxNumRetries=10, retryWaitTime=15, sshHostKeyVerificationStrategy=hudson.plugins.sshslaves.verifiers.ManuallyTrustedKeyVerificationStrategy, tcpNoDelay=true, trackCredentials=true} [12/02/24 05:48:28] [SSH] 正在打开到XXX.XXX.XXX.XXX:4444的SSH连接。 连接超时 SSH连接失败,IOException: "连接超时",15秒后重试。剩余10次重试机会。 连接超时 SSH连接失败,IOException: "连接超时",15秒后重试。剩余9次重试机会。 连接超时 SSH连接失败,IOException: "连接超时",15秒后重试。剩余8次重试机会。 连接超时 SSH连接失败,IOException: "连接超时",15秒后重试。剩余7次重试机会。 连接超时 SSH连接失败,IOException: "连接超时",15秒后重试。剩余6次重试机会。 连接超时 SSH连接失败,IOException: "连接超时",15秒后重试。剩余5次重试机会。 连接超时 SSH连接失败,IOException: "连接超时",15秒后重试。剩余4次重试机会。 连接超时 SSH连接失败,IOException: "连接超时",15秒后重试。剩余3次重试机会。 连接超时 SSH连接失败,IOException: "连接超时",15秒后重试。剩余2次重试机会。 连接超时 SSH连接失败,IOException: "连接超时",15秒后重试。剩余1次重试机会。 连接超时 错误:连接未建立! java.lang.IllegalStateException: 连接未建立! at PluginClassLoader for trilead-api//com.trilead.ssh2.Connection.getRemainingAuthMethods(Connection.java:989) at PluginClassLoader for ssh-credentials//com.cloudbees.jenkins.plugins.sshcredentials.impl.TrileadSSHPublicKeyAuthenticator.getRemainingAuthMethods(TrileadSSHPublicKeyAuthenticator.java:89) at PluginClassLoader for ssh-credentials//com.cloudbees.jenkins.plugins.sshcredentials.impl.TrileadSSHPublicKeyAuthenticator.canAuthenticate(TrileadSSHPublicKeyAuthenticator.java:81) at java.base/java.util.stream.ReferencePipeline$2$1.accept(Unknown Source) at java.base/java.util.stream.ReferencePipeline$2$1.accept(Unknown Source) at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) at java.base/java.util.Spliterators$IteratorSpliterator.tryAdvance(Unknown Source) at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(Unknown Source) at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(Unknown Source) at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(Unknown Source) at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source) at java.base/java.util.stream.ReferencePipeline.findFirst(Unknown Source) at PluginClassLoader for ssh-credentials//com.cloudbees.jenkins.plugins.sshcredentials.SSHAuthenticator.newInstance(SSHAuthenticator.java:222) at PluginClassLoader for ssh-credentials//com.cloudbees.jenkins.plugins.sshcredentials.SSHAuthenticator.newInstance(SSHAuthenticator.java:173) at PluginClassLoader for ssh-slaves//hudson.plugins.sshslaves.SSHLauncher.openConnection(SSHLauncher.java:882) at PluginClassLoader for ssh-slaves//hudson.plugins.sshslaves.SSHLauncher.lambda$launch$0(SSHLauncher.java:441) at java.base/java.util.concurrent.FutureTask.run(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.base/java.lang.Thread.run(Unknown Source)
排查与解决步骤
1. 验证端口映射是否生效
在宿主机执行以下命令,检查4444端口是否被jenkins-agent容器监听:
sudo netstat -tulpn | grep 4444
如果无输出,说明容器启动失败或端口映射错误,查看容器日志:
docker logs jenkins-agent
2. 测试宿主机到代理容器的SSH连通性
在宿主机直接尝试SSH连接代理容器,确认端口和密钥正常:
ssh -i jenkins_key jenkins@localhost -p 4444
若连接失败,检查公钥是否正确传入容器:
docker exec -it jenkins-agent cat /home/jenkins/.ssh/authorized_keys
确认内容与jenkins_key.pub完全一致,无多余空格或换行。
3. 检查Jenkins主容器的网络访问权限
主节点为Docker容器,访问宿主机IP可能受网络模式影响:
- 若主容器用默认bridge网络,尝试将代理节点的主机地址改为
host.docker.internal(Docker内置宿主机别名),或启动主容器时添加--network host参数(共享宿主机网络)。 - 测试主容器内部能否访问宿主机4444端口:
docker exec -it <jenkins主容器名称> bash apt update && apt install -y telnet telnet <宿主机IP> 4444
若telnet超时,说明主容器无法访问宿主机4444端口,需调整网络配置。
4. 确认防火墙设置
检查Ubuntu宿主机UFW防火墙是否允许4444端口入站:
sudo ufw status
若未开放,执行:
sudo ufw allow 4444/tcp
5. 调整SSH启动超时时间
在Jenkins节点配置的高级选项中,将Launch timeout seconds从60调整为120,避免容器启动慢导致超时。
内容的提问来源于stack exchange,提问作者Glen Hughes
相关产品推荐
相关产品推荐

