問題描述
- 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開始前三行開始讀,必須保證在搜索之前清楚錯誤的意思。