Eclipse JKube 指南
一、簡介
現在,Java 開發人員比以往任何時候都擁有更多使用 Kubernetes 構建和部署應用程序的選擇。在本教程中,我們將介紹一個名為JKube的此類工具。
2.JKube是什麼?
JKube 是一個工具集合,可以輕鬆構建 Java 應用程序,並將其部署到雲環境中。它是一個由 Eclipse Foundation 管理的項目,可以在其ECL-2.0 許可證下使用。
更具體地說,JKube 允許我們將 Java 應用程序編譯成 Docker 容器鏡像,然後將這些鏡像部署到 Kubernetes 或 OpenShift。
它還提供其他工具來使監控和調試雲應用程序變得更容易。
3. JKube 入門
大多數核心 JKube 工具都是通過 Maven 或 Gradle 插件提供的。為簡潔起見,下面的示例將僅關注 Kubernetes 環境中的 Maven 插件。
首先,我們只需將插件添加到 Maven POM 中:
<plugin>
<groupId>org.eclipse.jkube</groupId>
<artifactId>kubernetes-maven-plugin</artifactId>
<version>1.13.1</version>
</plugin>
值得注意的是,Maven Kubernetes 插件採用了一些固執己見的觀點來簡化設置。但是,它還支持通過 XML 和 YAML 配置進行細粒度控制。我們可以查看開發人員文檔以獲取完整的詳細信息。
3.1.構建 Docker 鏡像
無需任何進一步配置,我們就可以生成 Docker 鏡像:
mvn package k8s:build
這將檢查項目結構並選擇合適的基礎映像來使用:
[INFO] --- kubernetes-maven-plugin:1.13.1:build (default-cli) @ jkube-demo ---
[INFO] k8s: Building Docker image
[INFO] k8s: Running generator spring-boot
[INFO] k8s: spring-boot: Using Docker image quay.io/jkube/jkube-java:0.0.19 as base / builder
[INFO] k8s: [example/jkube-demo:latest] "spring-boot": Created docker-build.tar in 112 milliseconds
[INFO] k8s: [example/jkube-demo:latest] "spring-boot": Built image sha256:6c9d0
[INFO] k8s: [example/jkube-demo:latest] "spring-boot": Removed old image sha256:e2458
[INFO] k8s: [example/jkube-demo:latest] "spring-boot": Tag with latest
我們可以確認該鏡像存在於本地 Docker 守護進程中:
> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
example/jkube-demo latest 6c9d08bcd538 5 minutes ago 605MB
3.2.部署到 Kubernetes
除了構建 Docker 鏡像之外,我們還可以使用 JKube 生成資源描述符並將我們的應用程序部署到 Kubernetes 。
為此,我們需要執行 2 個 Maven 目標:
mvn k8s:resource k8s:apply
第一個目標為我們的應用程序生成deployment
和service
YAML 文件,並設置盡可能多的默認值:
[INFO] --- kubernetes-maven-plugin:1.13.1:resource (default-cli) @ jkube-demo ---
[INFO] k8s: Running generator spring-boot
[INFO] k8s: spring-boot: Using Docker image quay.io/jkube/jkube-java:0.0.19 as base / builder
[INFO] k8s: Using resource templates from jkube-demo/src/main/jkube
[INFO] k8s: jkube-controller: Adding a default Deployment
[INFO] k8s: jkube-service: Adding a default service 'jkube-demo' with ports [8080]
[INFO] k8s: jkube-service-discovery: Using first mentioned service port '8080'
[INFO] k8s: jkube-revision-history: Adding revision history limit to 2
[INFO] k8s: validating jkube-demo/target/classes/META-INF/jkube/kubernetes/jkube-demo-deployment.yml resource
[INFO] k8s: validating jkube-demo/target/classes/META-INF/jkube/kubernetes/jkube-demo-service.yml resource
第二個目標實際上部署到 Kubernetes 集群:
[INFO] --- kubernetes-maven-plugin:1.13.1:apply (default-cli) @ jkube-demo ---
[INFO] k8s: Using Kubernetes at https://kubernetes.docker.internal:6443/ in namespace null with manifest /Users/mike/github/jkube-demo/target/classes/META-INF/jkube/kubernetes.yml
[INFO] k8s: Creating a Service from kubernetes.yml namespace default name jkube-demo
[INFO] k8s: Created Service: target/jkube/applyJson/default/service-jkube-demo.json
[INFO] k8s: Creating a Deployment from kubernetes.yml namespace default name jkube-demo
[INFO] k8s: Created Deployment: target/jkube/applyJson/default/deployment-jkube-demo.json
最後,我們可以使用 JKube 從 Kubernetes 集群中取消部署我們的應用程序:
mvn k8s:undeploy
請記住,構建 Docker 映像並部署到 Kubernetes 的每個命令都使用固執己見的視圖。然而,JKube 提供了配置它們中的每一個的能力。有關完整詳細信息,請參閱目標概述。
4. JKube 特點
除了構建 Docker 鏡像並將其部署到 Kubernetes 之外,JKube 還提供了其他幾種工具來幫助開發應用程序。下面我們將仔細研究其中的一些。
4.1.日誌
這個目標的工作原理與 Unix tail
命令類似。它持續顯示先前部署的應用程序的輸出。
為了運行這個目標,我們使用以下命令:
mvn k8s:log
4.2.調試
debug
目標允許我們將 Java 調試器附加到已部署的應用程序。該命令的語法如下:
mvn k8s:debug -Djkube.debug.port=8000
運行這個命令可以做幾件事情。首先,它在啟用調試的情況下重新部署應用程序。其次,它在指定的調試端口上創建 Kubernetes 端口轉發。運行此命令後,我們可以將Java調試器附加到指定端口並開始遠程調試。
由於不斷地重新部署我們的應用程序可能非常耗時,因此我們可以通過始終啟用調試來進行部署來加快速度。為此,我們有兩種選擇。首先,我們可以向deploy
命令添加一個額外的標誌:
mvn k8s:deploy -Djkube.debug.enabled=true
或者,我們可以更新 Maven settings.xml
文件:
<?xml version="1.0"?>
<settings>
<profiles>
<profile>
<id>enable-debug</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<jkube.debug.enabled>true</jkube.debug.enabled>
</properties>
</profile>
</profiles>
</settings>
通過這樣做,我們可以避免每次運行debug
目標時 Pod 重新啟動時的等待時間。
4.3.手錶
當檢測到項目中的更改時,該目標會自動重新部署應用程序。要啟用它,我們運行命令:
mvn k8s:watch
啟用監視後,每當項目中的文件發生更改時,JKube 就會為我們重建並重新部署。 JKube 為各種框架(包括 Spring Boot)提供了幾種不同的觀察者。
4.4.推
我們之前看到的build
命令將新鏡像發佈到本地 Docker 守護進程。然後我們可以使用push
目標將這些圖像發佈到任何遠程註冊表:
mvn k8s:push
4.5.舵
與上面的resource
目標類似,此目標使用從項目中檢測到的合適默認值生成 Helm 的部署描述符:
mvn k8s:resource k8s:helm
值得注意的是,我們必須將resource
目標與helm
目標一起運行。此目標有多種方法來配置生成的 Helm 圖表。
5. 結論
在本文中,我們研究了 JKube,該工具可以簡化為 Kubernetes 和 OpenShift 構建 Java 應用程序的許多方面。
通過強大的 Maven 和 Gradle 插件,它提供了多種工具,用於構建、監控應用程序並將其部署到兩個最流行的容器管理系統。
上面的例子可以在 GitHub 上找到。