Binary-to-image(B2I) 是 KubeSphere 容器平臺在 2.1.0 版本新增的功能,旨在幫助開發者和運維在項目打包成 WAR、JAR、Binary 這一類的製品後,快速將製品或二進制的 Package 打包成 Docker 鏡像,併發布到 DockerHub 或 Harbor 等鏡像倉庫中。而且支持以建立服務的形式,一鍵將製品生成鏡像推送到倉庫,並建立其部署(Deployment)和服務(Service)最終 自動發佈到 Kubernetes 中。java
Binary-to-image(B2I)可以在實際的項目快速部署上線、微服務改造的過程當中,極大地賦能開發者和運維用戶。B2I 無需編寫一行 Dockerfile,下降學習成本的同時提高發布效率,使用戶可以更好地專一在業務自己。git
下圖簡述了 B2I 的業務實現流程,B2I 已將如下多個步驟工具化和流程化,所以只須要在一個表單中完成。github
- ① 在 KubeSphere 建立 B2I 類型的服務,上傳製品或二進制包
- ② B2I 將在後臺建立 K8s Job、Deployment 和 Service
- ③ 將製品自動打包成 Docker 鏡像
- ④ 推送鏡像至 DockerHub 或 harbor
- ⑤ B2I Job 將在第二步建立的 Deloyment 中使用倉庫中的鏡像
- ⑥ 自動發佈至 Kubernetes
說明:在上述流程中,B2I Job 還會在後臺執行狀態上報的功能web
接下來用兩個示例介紹 B2I 的兩種使用方式,本文提供了示例製品 WAR、JAR、Binary 方便實操。spring
如下提供 5 個供測試使用的製品包,您也能夠提交我的打包的測試項目到 KubeSphere 社區。
示例包 | 示例項目(代碼倉庫) |
---|---|
b2i-war-java8.war | Spring-MVC-Showcase |
b2i-war-java11.war | SpringMVC5 |
b2i-binary | DevOps-go-sample |
b2i-jar-java11.jar | java-maven-example |
b2i-jar-java8.jar | devops-java-sample |
第一個示例將使用建立服務的方式實現 B2I,實現上圖的 6 個步驟。在 2.1.0 版本中,建立服務的方式和用戶體驗相較於 2.0.x 版本變得更加方便和高效。docker
B2I 屬於 DevOps 功能組件,所以使用前需開啓安裝 DevOps 組件。segmentfault
因爲 B2I 的自動構建流程中須要將打包的 Docker 鏡像推送到鏡像倉庫,所以須要先建立一個鏡像倉庫的密鑰(Secret),如下建立一個 DockerHub 的密鑰,可參考 建立經常使用的幾類密鑰。centos
應用負載 → 服務
下點擊 建立服務
。經過製品構建新的服務
,選擇 WAR
,此處僅以一個 Spring-MVC-Showcase 的項目倉庫做爲示例,將它的 WAR 包(b2i-war-java8) b2i-war-java8.war 上傳到 KubeSphere。b2i-war-java8
,下一步構建設置中,默認無狀態服務,點擊將本地的製品 b2i-war-java8.war
上傳,構建環境選擇 tomcat85-java8-centos7:latest
。<DOCKERHUB_USERNAME>/<IMAGE NAME>
,tag 默認 latest,目標鏡像倉庫選擇已建立的 dockerhub-secret
。
8080
。勾選外網訪問
,並設置爲 NodePort
,點擊 建立
。
B2I 建立完成後,在 構建鏡像
下查看 B2I 的構建狀態,包括執行記錄(動態日誌)、資源狀態、鏡像製品、環境變量和 Events。瀏覽器
查看構建鏡像spring-mvc
查看服務
查看部署狀態
查看任務執行狀態
若您習慣使用 kubectl 命令行,也能夠經過 工具箱 → Web Kubectl
經過 kubectl get all -n PRJECT_NAME
來查看 b2i 具體建立了哪些資源。
web kubectl 查看資源
從服務的列表中,能夠看到 NodePort 是 30571,所以在瀏覽器經過 <$IP>:<$NodePort>/spring-mvc-showcase/
訪問 Spring-MVC-Showcase 服務(默認的訪問路徑 <$IP>:<$NodePort>
是 tomcat 服務)。
登陸 DockerHub 帳號,查看 B2I 自動推送的 Docker 鏡像。
第一個示例是以建立服務的方式完成了 B2I,最終將 Spring-MVC-Showcase 的 WAR 包打包成鏡像後部署到了 Kubernetes。而以 構建鏡像 的方式使用 B2I 更像一個基於製品自動生成鏡像的 快速工具,最終不會自動發佈至 Kubernetes。
如下將使用一個基於 Go 語言 的 示例項目 打包的 Binary 製品 - b2i-binary(點擊下載) ,演示 B2I 的第二種使用方式 - 構建鏡像使用 B2I。
一、在 構建鏡像
下點擊 建立構建鏡像
,而後選擇 binary
。
二、下一步,將下載的 b2i-binary 上傳至 KubeSphere,鏡像名稱可自定義 <DOCKERHUB_USERNAME>/<IMAGE NAME>
,目標鏡像倉庫選擇已建立的 dockerhub-secret
,點擊 建立
。
驗證 B2I 狀態
查看任務
登陸 DockerHub 帳號,查看 B2I 自動推送的 Docker 鏡像。
您能夠根據需求使用上述兩種不一樣的方式來完成 B2I 的自動鏡像構建。通常來講,像 Java 語言的項目,能夠經過 mvn package
命令打成 JAR/WAR 包,而像 C、C++ 和 Go 這類不須要運行時的語言,可使用其語言自身的 build 命令打包成 binary 格式的製品,最終就能夠經過 KubeSphere B2I 來快速將製品打包成 Docker 鏡像,併發布到鏡像倉庫和 Kubernetes 中。而像 Python、Nodejs 和 PHP 這類腳本式語言的項目,能夠經過 KubeSphere Source-to-Image(S2I) 完成相似 B2I 的自動構建與發佈。
KubeSphere (https://github.com/kubesphere... 是一個開源的以應用爲中心的容器管理平臺,支持部署在任何基礎設施之上,並提供簡單易用的 UI,極大減輕平常開發、測試、運維的複雜度,旨在解決 Kubernetes 自己存在的存儲、網絡、安全和易用性等痛點,幫助企業輕鬆應對敏捷開發與自動化監控運維、端到端應用交付、微服務治理、多租戶管理、多集羣管理、服務與網絡管理、鏡像倉庫、AI 平臺、邊緣計算等業務場景。