使用Minikube运行Spring Boot应用程序
1.概述
在这个 上一篇文章,我们介绍了关于Kubernetes的理论介绍。
在本教程中, 我们将讨论如何在本地Kubernetes环境(也称为Minikube)上部署SpringBoot应用程序。
作为本文的一部分,我们将:
- 在本地计算机上安装Minikube
- 开发由两个Spring Boot服务组成的示例应用程序
- 使用Minikube在单节点集群上设置应用程序
- 使用配置文件部署应用程序
2.安装Minikube
Minikube的安装基本上包括三个步骤:安装Hypervisor(如VirtualBox)、CLI Kubecctl,以及Minikube本身。
这个 正式文件 提供了每个步骤以及所有流行操作系统的详细说明。
完成安装后,我们可以启动Minikube,将VirtualBox设置为Hypervisor,然后配置Kubecctl ,名为 minikube:
$> minikube start
$> minikube config set vm-driver virtualbox
$> kubectl config use-context minikube
之后,我们可以验证 Kubecctl与我们的集群正确通信:
$> kubectl cluster-info
输出应如下所示:
Kubernetes master is running at https://192.168.99.100:8443
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
在这个阶段,我们将保持IP在响应中(192.168.99.100 在我们的情况下)。我们稍后将其称为 节点IP,这是从集群外部调用资源所必需的,例如从我们的浏览器。
最后,我们可以检查集群的状态:
$> minikube dashboard
这个命令在我们的默认浏览器中打开一个站点,它提供了关于集群状态的全面概述。
4.演示应用程序
由于我们的集群现在正在运行并准备部署,我们需要一个演示应用程序。
为此,我们将创建一个简单的“Hello world”应用程序,由两个Spring Boot服务组成,我们将称之为 前端 和 后端.
后端在端口8080上提供一个REST端点,返回 一串 包含其主机名。前端在端口8081上可用,它将简单地调用后端端点并返回其响应。
之后,我们必须从每个应用程序构建一个Docker映像。所有必要的文件也可用在GitHub上.
有关如何构建Docker图像的详细说明,请查看Dockerizing Spring Boot应用程序.
我们必须确保在Minikube集群的Docker主机上触发构建过程,否则,Minikube将在部署过程中找不到映像。此外,主机上的工作空间必须装载到Minikube VM中:
$> minikube ssh
$> cd /c/workspace/tutorials/spring-cloud/spring-cloud-kubernetes/demo-backend
$> docker build --file=Dockerfile \
--tag=demo-backend:latest --rm=true .
之后,我们可以从Minikube VM注销,所有进一步的步骤将在我们的主机上使用 Kubecctl 和 minikube comm和-line tools.
5.使用命令的简单部署
在第一步中,我们将为我们的 演示后端 应用程序,仅由一个Pod组成。在此基础上,我们将讨论一些命令,以便我们可以验证部署、检查日志并在最后进行清理。
5.1.创建部署
我们将使用 Kubecctl,将所有必需的命令作为参数传递:
$> kubectl run demo-backend --image=demo-backend:latest \
--port=8080 --image-pull-policy Never
如我们所见,我们创建了一个名为 演示后端从也称为 演示后端demo-backend,版本为 latest.
具有 -port,我们指定,部署为其Pod打开端口8080( 演示后端 应用程序监听端口8080)。
标签-image-pull-policy从不确保Minikube不会尝试从注册表中提取图像,而是从本地Docker主机中获取图像。
5.2.验证部署
现在,我们可以检查部署是否成功:
$> kubectl get deployments
输出如下:
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
demo-backend 1 1 1 1 19s
如果我们想查看应用程序日志,我们首先需要Pod ID:
$> kubectl get pods
$> kubectl logs <pod id>
5.3.为部署创建服务
为了使后端应用程序的REST端点可用,我们需要创建一个服务:
$> kubectl expose deployment demo-backend --type=NodePort
-type=节点端口 使服务可从群集外部使用。它将在 <NodeIP>:<NodePort> 上生效,即服务映射在<NodePort>
我们使用expose命令,因此节点端口将由集群自动设置(这是一个技术限制),默认范围为30000-32767。要获得我们选择的端口,我们可以使用配置文件,我们将在下一节中看到。
我们可以验证服务是否已成功创建:
$> kubectl get services
输出如下:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo-backend NodePort 10.106.11.133 <none> 8080:30117/TCP 11m
正如我们所看到的,我们有一个名为 demo-backend,类型为 NodePort,可从集群内部IP 10.106.11.133获得。
我们必须仔细查看PORT(S)列:因为端口8080是在部署中定义的,所以服务将流量转发到此端口演示后端从我们的浏览器,我们必须使用端口30117,它可以从集群外部访问。
5.4.呼叫服务
现在,我们可以第一次调用后端服务:
$> minikube service demo-backend
此命令将启动默认浏览器,打开
5.5.清理服务和部署
之后,我们可以删除服务和部署:
$> kubectl delete service demo-backend
$> kubectl delete deployment demo-backend
6.使用配置文件的复杂部署
对于更复杂的设置,配置文件是更好的选择,而不是通过命令行参数传递所有参数。
配置文件是记录部署的一种很好的方式,并且可以对其进行版本控制。
6.1.后端应用程序的服务定义
让我们使用配置文件重新定义后端服务:
kind: Service
apiVersion: v1
metadata:
name: demo-backend
spec:
selector:
app: demo-backend
ports:
- protocol: TCP
port: 8080
type: ClusterIP
我们创建了一个 Service 命名 demo-backend,由 metadata:name 领域
它以任何Pod上的TCP端口8080为目标 app=demo-backend标签
最后 type:ClusterIP 指示它仅在集群内部可用(因为我们希望从我们的 演示前端 这次是应用程序,但不再像前一个示例那样直接从浏览器中)。
6.2.后端应用程序的部署定义
接下来,我们可以定义实际的部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-backend
spec:
selector:
matchLabels:
app: demo-backend
replicas: 3
template:
metadata:
labels:
app: demo-backend
spec:
containers:
- name: demo-backend
image: demo-backend:latest
imagePullPolicy: Never
ports:
- containerPort: 8080
我们创建了一个 Deployment 命名 demo-backend,由 metadata:name 字段
这个 spec:selector 字段定义部署如何找到要管理的Pod。在这种情况下,我们只选择Pod模板中定义的一个标签(app:demo-backend).
我们希望有三个复制的Pod,我们通过 复制品 领域
模板字段定义了实际的Pod:
- Pods标签为应用程序:演示后端
- 这个 模板:等级库 字段指示每个Pod复制运行一个容器, 演示后端,版本为 最近的
- Pods打开端口8080
6.3.后端应用程序的部署
我们现在可以触发部署:
$> kubectl create -f backend-deployment.yaml
让我们验证部署是否成功:
$> kubectl get deployments
输出如下:
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
demo-backend 3 3 3 3 25s
我们还可以检查服务是否可用:
$> kubectl get services
输出如下:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo-backend ClusterIP 10.102.17.114 <none> 8080/TCP 30s
如我们所见,服务类型为 ClusterIP,并且它不提供30000-32767范围内的外部端口,这与第5节中的前一个示例不同。
6.4.前端应用程序的部署和服务定义
之后,我们可以为前端定义服务和部署:
kind: Service
apiVersion: v1
metadata:
name: demo-frontend
spec:
selector:
app: demo-frontend
ports:
- protocol: TCP
port: 8081
nodePort: 30001
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-frontend
spec:
selector:
matchLabels:
app: demo-frontend
replicas: 3
template:
metadata:
labels:
app: demo-frontend
spec:
containers:
- name: demo-frontend
image: demo-frontend:latest
imagePullPolicy: Never
ports:
- containerPort: 8081
前端和后端几乎相同,后端和前端之间的唯一区别是服务规范:
对于前端,我们将类型定义为 NordPort(因为我们希望使前端可用于集群外部)。后端只能从集群内访问,因此 type 是ClusterIP.
如前所述,我们还手动指定使用 NodePort 字段
6.5.前端应用程序的部署
我们现在可以用相同的方式触发此部署:
$> kubectl create -f frontend-deployment.yaml
让我们快速验证部署是否成功,服务是否可用:
$> kubectl get deployments
$> kubectl get services
之后,我们可以最终调用前端应用程序的REST端点:
$> minikube service demo-frontend
此命令将再次启动默认浏览器,打开 <NodeIP>
6.6.清理服务和部署
最后,我们可以通过删除服务和部署来进行清理:
$> kubectl delete service demo-frontend
$> kubectl delete deployment demo-frontend
$> kubectl delete service demo-backend
$> kubectl delete deployment demo-backend
7.结论
在本文中,我们快速了解了如何使用Minikube在本地Kubernetes集群上部署Spring Boot“Hello world”应用程序。
我们详细讨论了如何:
- 在本地计算机上安装Minikube
- 开发并构建一个由两个Spring Boot应用程序组成的示例
- 使用命令命令在单节点集群上部署服务 kubectl 以及配置文件
一如既往,示例的完整源代码是可用的 在GitHub上.
- 本文标签: Docker Spring Boot
- 本文链接: https://www.v8en.com/article/277
- 版权声明: 本文由SIMON原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权