问题描述
- jenkins需要使用
jave web start
的方式connect slave - jenkins启动在virtualBox虚拟机的docker容器中
- 而slave在启动虚拟的localhost上
- 在localhost中执行
java -jar slave.jar -jnlpUrl http://IP:port/computer/computeName/slave-agent.jnlp -secret bf817270767fe0dbe26b257ccc42cb2147b2b659edd44088da7d3bf09c149ef4
- 却始终没有办法connect到localhost这个节点,并且该节点始终显示disconnect
思路
- Q1:为什么不能connect到localhost节点?
- A1:如果想要知道为什么不能,那么就必须要知道出了什么错误,因此,我们重新再localhost执行了java -jar指令。发现打印出了err msg:
SEVERE: [JNLP4-connect connection to localhost/127.0.0.1:50000] javax.net.ssl.SSLHandshakeException: General SSLEngine problem;SEVERE: The server rejected the connection: None of the protocols were accepted
发现在是在链接50000端口的时候出现了异常,并且是javax.net.ssl.SSLHandshakeException: General SSLEngine problem
- Q2:那么为什么作为slave链接master node需要链接50000端口?
- A2:那么要解决这个问题就必须要查询官网。查询jenkins docker发现范例中基本都暴露50000端口。并且发现在配置中出现了这样的名词:
JENKINS_SLAVE_AGENT_PORT
,因此可以jenkins容器启动的时候,jenkins服务会默认启动在8080端口,但是jenkins-slave-agent服务会启动在50000端口
- Q3:那么50000端口的服务有什么作用,当50000端口没有暴露出来的时候会爆出上面的错误?
- A3:首先看到报错中说是跟JNP4文件中的协议有关,并且还爆出了ssl异常,因此可以确定,这种错误跟安全性有关,也就意味着50000端口可以检验slave节点是否可以连接master host
Q4:此时jenkins暴露了50000端口,为什么还是没有办法连接到服务?
-
A4:这时候就要了解整个jave web start注册slave的流程了。
- 首先jenkins容器在配置好了slave节点的时候产生了一个文件(slave.jar)还有一串秘钥。
- 任何一个节点,想要链接master node,必须执行down 下 slave.jar
java -jar slave.jar -jnlpUrl http://IP:port/computer/computeName/slave-agent.jnlp -secret bf817270767fe0dbe26b257ccc42cb2147b2b659edd44088da7d3bf09c149ef4
以上就是通过向jenkins所在的服务器发送请求,获取并执行.jnlp - 在.jnlp脚本中需要到jenkins给出的50000端口注册当前的slave
因此我们可以判断出来应该是在当前的slave没有办法连接到这个slave agent service,检查发现vagrant没有将jenkins容器暴露出来的50000端口暴露给localhost,导致localhost没有办法注册slave
- Q5:为什么现在要改成java web service
- A5:首先先讨论java web service方式的优点:
- master节点不需要主动链接slave,每个slave只需要通过获取jar文件然后得知秘钥执行指令就可以向master发送连接请求,在这之前,master都不需要知道那些节点想要链接他
- 链接起来十分方便一条指令就可以完成
- 而且不需要像ssh这些方式,具有很多不安全性
反思
- 1.老师让我使用java web service的方式进行slave connect,我并没与尝试询问为什么使用这个方式,而是在不理解原因,和工作原理情况下,按照网上的文档强行将demo写出来
- 2.看到错误的log信息,不够仔细,导致没有立刻就找到没有暴露50000是导致错误的原因
action
- 1.对于老师给出的方式和新概念,当下没有问题是因为不懂,但是开始动手之前输出使用新知识的:
what 和 why - 2.每次出现bug,必须从第一个bug开始前三行开始读,必须保证在搜索之前清楚错误的意思。