原创

使用Minikube运行Spring Boot应用程序

温馨提示:
本文最后更新于 2022年11月16日,已超过 20 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

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> 到其分配的Pod的端口8080。

我们使用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

此命令将启动默认浏览器,打开 : . 在我们的例子中 http://192.168.99.100:30117.

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(因为我们希望使前端可用于集群外部)。后端只能从集群内访问,因此 typeClusterIP.

如前所述,我们还手动指定使用  NodePort 字段 

6.5.前端应用程序的部署

我们现在可以用相同的方式触发此部署:

$> kubectl create -f frontend-deployment.yaml

让我们快速验证部署是否成功,服务是否可用:

$> kubectl get deployments
$> kubectl get services

之后,我们可以最终调用前端应用程序的REST端点:

$> minikube service demo-frontend

此命令将再次启动默认浏览器,打开 <NodeIP>:<NodePort> ,对于本示例是 http://192.168.99.100:30001 。

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上.

正文到此结束