Jenkins是master-slave/agent結構,可以通過代理把任務下發到各個agent/slave上去執行
如圖,首先在master上開啟代理配置,指定master上開啟的tcp端口,以及和slave進行通信的代理協議
然后就可以創建新的節點(node)。只有上面開啟了代理配置,這里的“啟動方式”才會出現“通過Java Web啟動代理”的選項
在某個slave機器上,主動建立和master的連接,點擊里面的“Launch”按鈕就可以下載文件slave-agent.jnlp,通過txt打開,可以看到里面的各種啟動信息,包括密鑰。
另外一種啟動方式如下:
這里的remoting-3.33.jar和上面的agent.jar都是代理的jar包,倉庫源碼是: https://github.com/jenkinsci/remoting
這里的test就是上面配置從節點的名字,要保持一致
java -Dorg.jenkinsci.remoting.engine.JnlpProtocol3.disabled=true -cp target/remoting-3.33.jar hudson.remoting.jnlp.Main -headless -url http://127.0.0.1:6060/ 775369839f50faddcae785239ac85ab09274afa3bc5a77b0d45a63794ea74597 test
slave-agent.jnlp的內容如下
<jnlp codebase="http://127.0.0.1:6060/computer/test/" spec="1.0+">
<information>
<title>Agent for test</title>
<vendor>Jenkins project</vendor>
<homepage href="https://jenkins-ci.org/"/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.8+"/><jar href="http://127.0.0.1:6060/jnlpJars/remoting.jar"/>
</resources>
<application-desc main-class="hudson.remoting.jnlp.Main">
<argument>6824195ad033f0c52d3235e0da0aced40578d1908a5f21be9636b91ac19f1972</argument>
<argument>test</argument>
<argument>-workDir</argument>
<argument>.jenkins/test</argument>
<argument>-internalDir</argument>
<argument>remoting</argument>
<argument>-url</argument>
<argument>http://127.0.0.1:6060/</argument>
</application-desc>
</jnlp>
常見錯誤
- 連接時使用的名字不一致導致:jenkins的master上配置的節點名字要和slave上連接時使用的名字一致
- 認證失敗,查看密鑰方法見上文
談下jenkinde插件kubernetes-plugin的實現原理
主要是利用了上面的jnlp原理:
1、在全局配置里配置k8s信息,其中包括k8s地址,連接k8s的證書信息,k8s的命名空間namespace(創建slave/agent的地方),jenkins地址,k8s的pod節點配置模版等信息
2、監控jenkins的作業/任務Job排隊情況,動態增加/減少slave/agent的數量
3、作業繁忙時,首先在Jenkins上創建從節點,拿到從節點的名字和密鑰等信息
4、最后根據k8s的配置,遠程調用k8s的創建pod,即slave/agent
slave/agent只是個代理,執行任務時,需要的jar包,都會從master上傳輸過來
Java Web Start即Java Network Launching Protocol (JNLP)