天天看點

自定義 OpenShift s2i 鏡像與模闆——OracleJDK8

自定義 OpenShift s2i 鏡像與模闆——OracleJDK8

由于 OpenShift 官方提供的鏡像與模闆(OpenJDK8)不完全滿足業務需要:

不包含飛行記錄功能。隻有 OpenJDK11 以上才被 Oracle 開源

生成堆 dump 很大很慢(公司項目 JVM 堆最小16G,最大32G),<code>導出-壓縮-傳輸</code> 較長(半小時以上),對業務停頓時間過長

鏡像内置的擷取性能名額的指令很少,正常網絡狀态查詢指令如 <code>netstat</code>、<code>ping</code> 等都沒有

鏡像内部s2i流程編寫得過于複雜,鏡像建構過程緩存多且未移除,導緻最終鏡像普遍體積過大(350M的業務應用,打出鏡像有 1.1G…)

為了友善定位性能問題,筆者仔細閱讀了 OpenShift v3.11 版本的 s2i 建構流程、鏡像自定義等相關文檔,定制出了自己的模闆與鏡像,目前已經在生産環境上驗證通過,在這裡記錄一二。如果有幫到你,點個關注和贊再走吧~

本文主體思路是使用 s2i工具建立基礎的建構調試環境,修改Dockerfile與建構腳本生成鏡像,再推送鏡像和模闆到上篇文章OpenShift 本地開發環境配置(基于 Minishift)的環境中,用一個demo測試下最終效果。

s2i 工具官方Release Page:https://github.com/openshift/source-to-image/releases

筆者是在 <code>~/WorkSpace/openshift</code> 目錄下開始操作的,提前說下免得讀者操作有誤。

這裡筆者用不到 <code>s2i/bin/save-artifacts</code>,因為不需要增量建構,删除之; <code>test/test-app/index.html</code> 也用不到,删除之。

由于筆者已經将jdk8安裝包下載下傳好了,下載下傳 OracleJDK 付費版本以前的版本,參考我的部落格,這裡就直接從 <code>~/Downloads</code> 解壓到 <code>~/WorkSpace/openshift/oracle-jdk-8-catelog</code> 下

<code>vim Dockerfile</code>,把預設的都删除掉,添加下邊的内容:

上述的Dockerfile做了什麼呢?

基于非常穩定的 Debian10

為鏡像打Label标簽,s2i 建構時會讀取這些标簽

複制OracleJDK目錄及s2i腳本

配置JDK環境變量、UTF-8字元集、指定中國時區

建立部署目錄、建立運作使用者、更換國内源、安裝必要收集性能名額工具(netstat和ps)

指定工作目錄、運作使用者、預設暴露的端口、預設的 <code>CMD</code>入口

完成Dockerfile的修改還沒完,我們還需要修改 s2i 建構與運作腳本,以适應剛剛修改的鏡像配置

s2i腳本在 <code>s2i/bin</code> 目錄下,我們需要修改 <code>assemble</code> 腳本來改變組裝流程,修改 <code>run</code> 腳本以更換啟動指令。

<code>vim s2i/bin/assemble</code>

以上腳本主要做了兩件事,一個是從 <code>/tmp/src</code> 下将 jar 包複制到部署目錄,在之前的文章中介紹過 s2i 的工作流程,在建構時會從 Git 上拉取制品或源碼到 <code>/tmp/src</code> 下;另一個是删除 <code>/tmp/src/.git</code> 目錄,原因是 Git 的 <code>.git</code> 目錄會同樣儲存壓縮後的制品或源碼檔案,删除以減小鏡像體積。

<code>vim s2i/bin/run</code>

run 腳本隻作啟動功能,為了友善傳 JVM 調優參數,定制了 <code>JVM_OPTS</code> 環境變量供使用。參數中的随機數配置能提高服務生成随機數的能力,提高啟動速度。

修改Makefile的作用是簡化建構鏡像的指令,筆者這裡修改了鏡像名以及添加了推送私有鏡像倉庫的參數,這點上 <code>npm</code> 有點類似于 <code>Makefile</code>。

想了解更多 Makefile 寫法,可以參考 <code>左耳朵耗子</code> 陳皓 寫的《跟我一起寫Makefile》

<code>test/run</code> 這個測試腳本相當于完成了一次 s2i 到部署的過程,先準備測試鏡像,再運作s2i的建構過程增量建構(将測試制品程式與鏡像進行組裝,容器内部調用了 <code>assemble</code> 腳本),然後啟動容器,運作定時測試腳本通路容器端口位址,通過就算成功了。

由于預設測試腳本中測試服務是否可用是通路位址判斷傳回值是否200狀态碼,我這邊提供個springboot的demo 部署後通路 <code>/test</code> 端點傳回結果 ,首先建構下這個demo:

修改 <code>test/run</code> 腳本,調整探測間隔與通路的接口位址,本demo中需修改116行為5,以及120和121行通路路徑添加 <code>/test</code>

自定義 OpenShift s2i 鏡像與模闆——OracleJDK8

執行測試

自定義 OpenShift s2i 鏡像與模闆——OracleJDK8

我們能看到 springboot 的 banner 下有行字 <code>Starting CicdDemoApplication v0.0.1 using Java 1.8.0_181 on f770c60456f4 with PID 1 (/deployments/cicd-demo-0.0.1.jar started by oraclejdk8 in /deployments)</code>,這可以證明測試的demo的确是以 oraclejdk8 使用者運作成功的,而且 pid 為 1。再往下看也沒有檢測報錯的資訊,說明測試通過,可以使用 Minishift測試了。

這裡Minishift導入鏡像到内部倉庫和OpenShift是一緻的,說是OpenShift也可以。
如果報錯,優先考慮是否登入了oc,<code>oc login -u developer</code>,執行後再嘗試導入。

這裡直接提供模闆内容,基于 openjdk8的模闆修改而來的:

<code>oraclejdk-8-basic-s2i.yaml</code>

模闆的結構簡單說明:

定義格式基于k8s,是紅帽擴充的 Template API類型

源資料 - 記錄模闆的内容,會在打開模闆的UI上顯示

objects - 各種建構到部署過程的所有對象定義

Service - k8s原生有的服務對象

Route - OpenShift獨有的路由對象

ImageStream - OpenShift獨有的鏡像流對象

BuildConfig - OpenShift獨有的建構配置對象

DeploymentConfig - OpenShift獨有的部署配置對象,生成k8s中的Deployment對象

parameters - 可修改參數,或者變量,供objects中各種對象引用,進而生成相關聯的一系列對象

由于OpenShift是由Git倉庫拉取制品或源碼進行建構的,是以需要把測試程式(上文中用到的cicd-demo-0.0.1.jar)上傳到 Git 版本控制中,這裡延用上篇文章中 Minishift 開發環境中配置的 Gitea(需要預先建立個賬号和倉庫,這裡建立的倉庫名為demo,使用者名為hellxz)。

如下圖,已經推送完畢。

自定義 OpenShift s2i 鏡像與模闆——OracleJDK8
模闆中引用的是自定義鏡像的名稱,命名空間也是myproject(Minishift預設的,生産環境可以改成需要的名稱再上傳,調整可多次導入)

首次部署流程比較麻煩,這裡分多個動圖錄制

自定義 OpenShift s2i 鏡像與模闆——OracleJDK8
Gitea 配置的對外位址配置得有點問題,不過問題不大……

需要告知s2i建構腳本 Git 倉庫的使用者和密碼,這樣才能拉得下來制品,僅首次建立應用時需要建立。

自定義 OpenShift s2i 鏡像與模闆——OracleJDK8
自定義 OpenShift s2i 鏡像與模闆——OracleJDK8
自定義 OpenShift s2i 鏡像與模闆——OracleJDK8
自定義 OpenShift s2i 鏡像與模闆——OracleJDK8

如圖,容器運作已經是 Ready: true 狀态,說明啟動狀态正常。

由于沒有外部的dns,域名可以修改 <code>/etc/hosts</code> 檔案代替

自定義 OpenShift s2i 鏡像與模闆——OracleJDK8

測試通過,自定義鏡像和模闆都能正常工作。

寫作不易,如果本文對您有所幫助,就點個關注點個贊再走呗~ 我是 Hellxz,我們下次再見。

本文同步釋出以下兩個位址,未經許可禁止轉載。 部落格園 https://www.cnblogs.com/hellxz CSDN https://blog.csdn.net/u012586326