如何在 Minikube 中 运行 一个 Spring 启动应用程序?
How to run a Spring Boot application in Minikube?
我想在 Minikube 中 运行 this Spring Boot application 以便我可以在我的浏览器中访问 8080
端口(一旦应用程序 运行ning)。
为此,我执行以下步骤。
- 开始 Docker.
- 运行
mvn spring-boot:build-image
.
- 使用
minikube start
启动Minikube。
- 使用
kubectl create deployment example-1-engine-1 --image=example-1-engine-1
创建 Minikube 部署。
- 使用
kubectl expose deployment example-1-engine-1 --type=NodePort --port=8080
和 kubectl port-forward service/example-1-engine-1 8080:8080
公开端口 8080。
- 在 Minikube 中启动应用程序。
- 使用
minikube service example-1-engine-1
在 Minikube 中启动应用程序。
出现以下输出:
但是,浏览器无法打开 8080 端口上的 Web 应用程序(浏览器无法连接到 http://127.0.0.1:50947/ 上的应用程序)。
我做错了什么,我如何确保有问题的应用程序 运行 在 Minikube 中并且我可以通过端口 8080 访问 Web 应用程序?
更新 1: 这是 kubectl get pods
的输出:
C:\Users\XXXXXXX>kubectl get pods
NAME READY STATUS RESTARTS AGE
example-1-engine-1-d9fc48785-zdvkf 0/1 ImagePullBackOff 0 2d18h
hello-minikube-6ddfcc9757-wj6c2 1/1 Running 1 5d
更新 2: 我尝试输入 eval $(minikube -p minikube docker-env)
。为此,我首先在Docker.
中打开了Minikube容器的shell
在之后出现的window中,我输入了eval $(minikube -p minikube docker-env)
得到了响应minikube: not found
。
在我看来,您的案例可能存在两个问题。
1。使用本地构建的 Docker 图像
您想在 Kubernetes 中 运行 本地构建 Docker 图像,但开箱即用。
通常,您有两个选择:
使用 docker image push
命令将您的图像分享到 Docker Hub registry or to a self-hosted one as described in the Docker documentation。
使用 eval $(minikube docker-env)
命令让您的终端使用 minikube 中的 docker 守护进程,如 minikube documentation.
中所述
2。使用带有特定标签的 Docker 图像
正如我所见,您的图片具有特定标签 1.0-SNAPSHOT
:
$ docker images
REPOSITORY TAG
example-1-engine-1 1.0-SNAPSHOT
您需要在 kubectl create deployment
命令中指定此标签:
$ kubectl create deployment example-1-engine-1 --image=example-1-engine-1:1.0-SNAPSHOT
我已经部署了你的Spring Boot application,以证明它对我来说是按预期工作的。
首先,让我的终端使用 minikube 中的 docker 守护进程 运行:
$ eval $(minikube -p minikube docker-env)
然后我创建了 Docker 图像并部署了 example-1-engine-1
应用程序:
$ mvn spring-boot:build-image
...
[INFO] Successfully built image 'docker.io/library/example-1-engine-1:1.0-SNAPSHOT'
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
$ kubectl create deployment example-1-engine-1 --image=example-1-engine-1:1.0-SNAPSHOT
deployment.apps/example-1-engine-1 created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
example-1-engine-1-c98f8c569-xq2cv 1/1 Running 0 13s
最后,我公开了 example-1-engine-1
Deployment
,如您的示例所示:
$ kubectl expose deployment example-1-engine-1 --type=NodePort --port=8080
service/example-1-engine-1 exposed
$ kubectl port-forward service/example-1-engine-1 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
$ minikube service example-1-engine-1
|-----------|--------------------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|--------------------|-------------|---------------------------|
| default | example-1-engine-1 | 8080 | http://192.168.49.2:32766 |
|-----------|--------------------|-------------|---------------------------|
Opening service default/example-1-engine-1 in default browser...
在打开的浏览器选项卡中,我看到:
此外,我在 http://127.0.0.1:8080
看到了相同的页面。
不幸的是,我没有 Windows 机器(如您的示例),我使用 Linux 代替,所以我无法完全重现您的问题。
我想在 Minikube 中 运行 this Spring Boot application 以便我可以在我的浏览器中访问 8080
端口(一旦应用程序 运行ning)。
为此,我执行以下步骤。
- 开始 Docker.
- 运行
mvn spring-boot:build-image
. - 使用
minikube start
启动Minikube。 - 使用
kubectl create deployment example-1-engine-1 --image=example-1-engine-1
创建 Minikube 部署。 - 使用
kubectl expose deployment example-1-engine-1 --type=NodePort --port=8080
和kubectl port-forward service/example-1-engine-1 8080:8080
公开端口 8080。 - 在 Minikube 中启动应用程序。
- 使用
minikube service example-1-engine-1
在 Minikube 中启动应用程序。
出现以下输出:
但是,浏览器无法打开 8080 端口上的 Web 应用程序(浏览器无法连接到 http://127.0.0.1:50947/ 上的应用程序)。
我做错了什么,我如何确保有问题的应用程序 运行 在 Minikube 中并且我可以通过端口 8080 访问 Web 应用程序?
更新 1: 这是 kubectl get pods
的输出:
C:\Users\XXXXXXX>kubectl get pods
NAME READY STATUS RESTARTS AGE
example-1-engine-1-d9fc48785-zdvkf 0/1 ImagePullBackOff 0 2d18h
hello-minikube-6ddfcc9757-wj6c2 1/1 Running 1 5d
更新 2: 我尝试输入 eval $(minikube -p minikube docker-env)
。为此,我首先在Docker.
在之后出现的window中,我输入了eval $(minikube -p minikube docker-env)
得到了响应minikube: not found
。
在我看来,您的案例可能存在两个问题。
1。使用本地构建的 Docker 图像
您想在 Kubernetes 中 运行 本地构建 Docker 图像,但开箱即用。 通常,您有两个选择:
使用
docker image push
命令将您的图像分享到 Docker Hub registry or to a self-hosted one as described in the Docker documentation。使用
中所述eval $(minikube docker-env)
命令让您的终端使用 minikube 中的 docker 守护进程,如 minikube documentation.
2。使用带有特定标签的 Docker 图像
正如我所见,您的图片具有特定标签 1.0-SNAPSHOT
:
$ docker images
REPOSITORY TAG
example-1-engine-1 1.0-SNAPSHOT
您需要在 kubectl create deployment
命令中指定此标签:
$ kubectl create deployment example-1-engine-1 --image=example-1-engine-1:1.0-SNAPSHOT
我已经部署了你的Spring Boot application,以证明它对我来说是按预期工作的。
首先,让我的终端使用 minikube 中的 docker 守护进程 运行:
$ eval $(minikube -p minikube docker-env)
然后我创建了 Docker 图像并部署了 example-1-engine-1
应用程序:
$ mvn spring-boot:build-image
...
[INFO] Successfully built image 'docker.io/library/example-1-engine-1:1.0-SNAPSHOT'
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
$ kubectl create deployment example-1-engine-1 --image=example-1-engine-1:1.0-SNAPSHOT
deployment.apps/example-1-engine-1 created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
example-1-engine-1-c98f8c569-xq2cv 1/1 Running 0 13s
最后,我公开了 example-1-engine-1
Deployment
,如您的示例所示:
$ kubectl expose deployment example-1-engine-1 --type=NodePort --port=8080
service/example-1-engine-1 exposed
$ kubectl port-forward service/example-1-engine-1 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
$ minikube service example-1-engine-1
|-----------|--------------------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|--------------------|-------------|---------------------------|
| default | example-1-engine-1 | 8080 | http://192.168.49.2:32766 |
|-----------|--------------------|-------------|---------------------------|
Opening service default/example-1-engine-1 in default browser...
在打开的浏览器选项卡中,我看到:
此外,我在 http://127.0.0.1:8080
看到了相同的页面。
不幸的是,我没有 Windows 机器(如您的示例),我使用 Linux 代替,所以我无法完全重现您的问题。