在 Kubernetes 环境下启动 Spring Boot Web 服务
在Kubernetes环境中启动Spring Boot Web服务。

目的
在Windows 11上,我将使用Linux进行云开发。
您可以从这里查看文章的列表。
实现
使用YAML格式的名为kube-all-in-one.yaml的清单文件,在WSL Ubuntu的本地环境Kubernetes集群上部署Spring Boot自定义容器镜像。
ご自身のPCに、Kubernetes クラスターを構築するには、Docker Desktop を使用する方法があり、そちらが一般的です。 しかし、この記事では Minikube を使用して Kubernetes クラスターを直接コマンドから操作することで、Kubernetes の基礎的な使い方を学習することを目的としています。ご注意ください。
技術主题
Kubernetes 是什么?
Kubernetes は、オープンソースのコンテナオーケストレーションツールで、Google 社によって開発されました。Kubernetes は、コンテナ化されたアプリケーションの自動デプロイ、スケーリング、および管理を行うためのプラットフォームです。
特徴
Kubernetes は、コンテナをグループ化して、そのグループを管理する抽象的な概念である ポッド を使用します。また、複数のポッドを管理するための デプロイメント や、ポッド間の通信を制御する サービス などのリソースも提供しています。
Kubernetes を使用することで、アプリケーションのスケーリングや障害時の自動復旧などの運用作業を簡単に行うことができます。また、複数のクラウドプロバイダーやオンプレミス環境でも動作するため、ハイブリッド環境でも利用されています。
Kubernetes は、オープンソースであり、多くの企業やコミュニティによって開発・改良が行われています。そのため、今後もさらなる機能の向上や拡張性の向上が期待されています。
开发环境
- Windows 11 Home 22H2 を使用しています。
> wsl –version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47Ubuntu ※ こちらの関連記事からインストール方法をご確認いただけます
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Java JDK ※ こちらの関連記事からインストール方法をご確認いただけます
$ java -version
openjdk version “11.0.18” 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)
Maven ※ こちらの関連記事からインストール方法をご確認いただけます
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.18, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Docker ※ こちらの関連記事からインストール方法をご確認いただけます
$ docker –version
Docker version 23.0.1, build a5ee5b1
显示”Hello World”的步骤
创建一个Spring Boot Web服务
这篇文章将从相关文章的延续中说明步骤。
进入Spring Boot应用的项目文件夹
我們將移至項目資料夾。
※ 我們將~/tmp/hello-spring-boot作為項目資料夾。
$ cd ~/tmp/hello-spring-boot
确认容器映像
以下将解释从之前相关文章的续篇开始的步骤的文章。
启动Docker守护进程。
$ sudo service docker start
* Starting Docker: docker [ OK ]
检查容器镜像。
$ docker images | grep app-hello-spring-boot
app-hello-spring-boot latest 39115028afa6 12 seconds ago 390MB
Kubernetes 环境安装
※ 安装Minikube。
特点和优势
Kubernetes是一个用于管理多个容器化应用程序的编排工具,它对于运行复杂的应用程序是必要的。
Minikube通过在本地运行Kubernetes来提供开发人员进行应用程序测试和实验所需的资源。Minikube用于构建单节点的Kubernetes集群,并且可以在本地计算机上运行,从而可以学习Kubernetes的操作方法。
使用Minikube可以轻松进行Kubernetes集群的配置、管理和部署。此外,Minikube具有许多功能,并且可以使用各种附加组件来扩展功能。
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
$ sudo dpkg -i minikube_latest_amd64.deb
安装名为Minikube的本地Kubernetes集群。命令和参数:
内容
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
下载Minikube的最新版本.deb包。.deb是针对基于Debian的Linux发行版的包格式。
sudo dpkg -i minikube_latest_amd64.deb
使用下载的.deb文件安装Minikube。此命令将自动解决所有的依赖关系,并安装Minikube所需的文件以正确设置。
这样,Minikube就被安装了,准备好在本地设置Kubernetes集群。这样,开发人员可以使用本地的Kubernetes集群开发、测试和部署应用程序。
开始运行Kubernetes集群。
$ minikube start
$ minikube start
? 在 Ubuntu 22.04 (amd64) 上的 minikube v1.29.0
✨ 已自動選擇 docker 驅動程式。其他選項:none, ssh
? 使用具有根權限的 Docker 驅動程式
? 正在啟動 minikube 叢集中的 minikube 節點控制平面
? 正在獲取基礎映像…
? 正在下載預加載的 Kubernetes v1.26.1…
> preloaded-images-k8s-v18-v1…: 397.05 MiB / 397.05 MiB 100.00% 16.46M
> gcr.io/k8s-minikube/kicbase…: 407.18 MiB / 407.19 MiB 100.00% 10.19M
? 正在建立 docker 容器 (CPUs=2, Memory=2200MB)…
? 正在使用 Docker 20.10.23 準備 Kubernetes v1.26.1…
▪ 正在創建證書和金鑰…
▪ 正在啟動控制平面…
▪ 正在設定 RBAC 規則…
? 正在設置網橋 CNI (容器網路介面)…
▪ 正在使用 gcr.io/k8s-minikube/storage-provisioner:v5 映像
? 正在驗證 Kubernetes 組件…
? 啟用插件:default-storageclass, storage-provisioner
? 找不到 kubectl。如果需要 kubectl,請嘗試 ‘minikube kubectl — get pods -A’
? 完成!kubectl 已設定為默認使用「minikube」叢集和「default」命名空間
创建 Kubernetes 清单文件
创建Kubernetes清单文件。
$ vim kube-all-in-one.yaml
文件的内容 de
Note: The provided phrase appears to be in Japanese, not English. Hence, the provided paraphrase is already in Chinese, which is a native language for the model.
apiVersion: v1
kind: Service
metadata:
name: app-service
spec:
type: LoadBalancer
selector:
app: app
ports:
- port: 80
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
replicas: 1
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
spec:
containers:
- name: app
image: app-hello-spring-boot
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
定义了 Service 对象。
在 name 字段中指定了名称为 app-service 的名称。
在 type 字段中设置了 LoadBalancer。这将使得 Service 在集群外部公开,并且可以从外部进行访问。
在 selector 字段中指定选择具有标签为 app 的 Pod。
在 ports 字段中开放了端口 80,并将 targetPort 设置为 8080。
定义了 Deployment 对象。
在 name 字段中指定了名称为 app 的名称。
在 replicas 字段中指定只创建一个 Pod。
在 selector 字段中指定选择具有标签为 app 的 Pod。
在 template 字段中指定了 Pod 的模板。
在 metadata 字段中为 Pod 添加了标签为 app。
在 spec 字段中指定了 Pod 的规格。
在 containers 字段中指定了容器的配置。
在 name 字段中指定了容器的名称。
在 image 字段中指定了容器镜像的名称。
在 imagePullPolicy 字段中指定了容器镜像的获取方式。
在 ports 字段中指定了容器使用的端口。这里指定了端口 8080。
部署到 Kubernetes 集群中
下载kubectl并设置别名。
$ minikube kubectl -- get po -A
$ alias kubectl="minikube kubectl --"
检查 kubectl 的版本。
$ kubectl version --short
Client Version: v1.26.1
Kustomize Version: v4.5.7
Server Version: v1.26.1
确认Kubernetes集群连接目标。
$ kubectl config current-context
minikube
内容
Kubernetes 中有多个上下文用于管理多个集群、用户、命名空间等。kubectl config current-context 命令用于显示当前活动的上下文。
上下文保存在 ~/.kube/config 文件中,包含用于连接 Kubernetes 集群的认证信息、集群信息和命名空间信息等。
换句话说,执行该命令将显示当前 Kubernetes 集群的上下文。这可以帮助您确认连接到哪个集群,使用哪个用户登录,处于哪个命名空间等。
此外,您还可以切换多个上下文。这对于管理多个 Kubernetes 集群、项目和环境非常方便。
将本地 Docker 的容器镜像导入到 Minikube 中。
$ minikube image load app-hello-spring-boot:latest
查询Minikube上的容器镜像。
$ minikube image ls | grep app-hello-spring-boot
docker.io/library/app-hello-spring-boot:latest
Kubernetes クラスターにデプロイします。
$ kubectl apply -f kube-all-in-one.yaml
service/app-service created
deployment.apps/app-deployment created
内容
kubectl apply コマンドを使用して、kube-all-in-one.yaml という YAML ファイルに定義された Kubernetes リソースをクラスターに作成または更新します。
この YAML ファイルは、Pod、Service、Deployment、ConfigMap、Secret などの複数の Kubernetes リソースを定義することができます。
つまり、このコマンドを実行すると、YAML ファイルに定義されたすべてのリソースが Kubernetes クラスターに作成または更新されます。
このコマンドにより、アプリケーションやその他のリソースをクラスターに展開することができます。このコマンドは、DevOps や開発者が、アプリケーションのデプロイメントや更新を行う際に頻繁に使用されます。
Kubernetes クラスターの状態を確認します。
$ kubectl get pods,services,deployments
NAME READY STATUS RESTARTS AGE
pod/app-7656fd56b4-bsq8q 1/1 Running 0 10s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/app-service LoadBalancer 10.105.5.226 <pending> 80:31418/TCP 10s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 34m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/app 1/1 1 1 10s
内容
kubectl get コマンドを使用して、Pods、Services、Deployments という3つのリソースの情報を取得します。pods、services、deployments は、Kubernetes クラスター内の主要なリソースの一部であり、それぞれ次のような情報を提供します。
pods クラスター内の Pod (コンテナ実行環境) の状態を表示します。
services クラスター内の Service (アプリケーションの公開) の状態を表示します。
deployments クラスター内の Deployment (Pod の自動スケーリング、更新) の状態を表示します。
つまり、このコマンドを実行すると、Kubernetes クラスター内の Pods、Services、Deployments の現在の状態が表示されます。
このコマンドにより、クラスター内のリソースの数や状態、アプリケーションの展開状況などを確認できます。また、この情報は、デバッグ、トラブルシューティング、監視、スケーリングなど、クラスターの管理に役立ちます。
Kubernetes クラスターを削除するには以下のコマンドを使用します。
$ minikube delete --all
确认容器的操作
获取连接到应用服务的URL。
$ minikube service app-service --url
http://127.0.0.1:46299
❗ Docker ドライバーを linux 上で使用しているため、実行するにはターミナルを開く必要があります。
内容
minikube service コマンドを使用して、Kubernetes クラスター内の app-service Service を公開し、アプリケーションが公開された URL を取得します。–url フラグは、この URL を表示するために使用されます。
つまり、このコマンドを実行すると、app-service Service が公開しているアプリケーションの URL が表示されます。この URL をブラウザに入力することで、アプリケーションにアクセスすることができます。
このコマンドは、ローカル環境でアプリケーションをテストする場合や、デプロイされたアプリケーションにアクセスする場合に非常に便利です。
我们将使用网络浏览器进行确认。
http://127.0.0.1:46299/api/data
在WEB浏览器中显示了{“message”:”你好,世界!”},并成功获取到了JSON数据。
我們可以從另一個終端窗口使用curl命令進行確認。
$ curl -v http://127.0.0.1:46299/api/data
* Trying 127.0.0.1:46299...
* Connected to 127.0.0.1 (127.0.0.1) port 46299 (#0)
> GET /api/data HTTP/1.1
> Host: 127.0.0.1:46299
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Fri, 10 Mar 2023 13:33:14 GMT
<
* Connection #0 to host 127.0.0.1 left intact
{"message":"Hello World!"}
在终端上显示了 {“message”:”你好,世界!”} ,并成功获取了JSON数据。
在Kubernetes控制台中进行确认。
安装 Kubernetes 仪表板。
$ minikube dashboard
$ minikube dashboard
? 正在启用仪表板…
▪ 使用docker.io/kubernetesui/metrics-scraper:v1.0.8镜像
▪ 使用docker.io/kubernetesui/dashboard:v2.7.0镜像
? 某些仪表板功能需要metrics-server插件。要启用全部功能,请执行以下命令:minikube addons enable metrics-server
? 正在验证仪表板状态…
? 正在启动代理…
> kubectl.sha256: 64 B / 64 B [————————-] 100.00% ? p/s 0s
> kubectl: 45.80 MiB / 45.80 MiB [————] 100.00% 13.08 MiB p/s 3.7s
? 正在验证代理状态…
? 在默认浏览器中打开 http://127.0.0.1:32877/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/…
? http://127.0.0.1:32877/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
在Web浏览器中访问以下URL。
http://127.0.0.1:32877/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

连接到容器
我們將嘗試從不同的終端連接到Spring Boot自定義容器。
$ kubectl exec -it app-7656fd56b4-bsq8q -- /bin/bash
内容
kubectl exec コマンドを使用して、指定された Pod (ここではapp-deployment-7656fd56b4-bsq8q) 内のコンテナで、/bin/bash シェルを開始します。-it フラグは、ターミナルで対話的なモードでシェルを開始することを指定しています。
つまり、このコマンドを実行すると、指定した Pod 内のコンテナに対して、bash シェルを開始し、コマンドや操作を直接実行することができます。
このコマンドは、デバッグやトラブルシューティングのために非常に便利であり、アプリケーションが正常に動作しているかどうかを確認することができます。
连接到容器后检查目录。
※离开容器时按下 ctrl + D。
# pwd
/app
# ls -la
total 17248
drwxr-xr-x 1 root root 4096 Mar 10 12:23 .
drwxr-xr-x 1 root root 4096 Mar 10 13:16 ..
-rw-r--r-- 1 root root 17650415 Mar 9 07:59 app.jar
让我来显示容器的信息。
# cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
总结
通过使用一个名为kube-all-in-one.yaml的YAML格式的清单文件,在WSL Ubuntu的Kubernetes集群上,可以部署Spring Boot Web服务的自定义容器镜像。
どうでしたか? WSL Ubuntu で、Spring Boot Web アプリケーションを Kubernetes 環境でコンテナとして手軽に起動することができます。ぜひお試しください。今後も Java の開発環境などを紹介していきますので、ぜひお楽しみにしてください。
推荐内容