本指南将引导您完成在Kubernetes上部署Spring Boot应用程序的过程。您可以选择多种方式来使用Spring Boot和Kubernetes进行操作。本指南的目的是使您尽快上手,而不是讨论所有替代方法或进入生产方式的所有详细信息。

有一些交互式教程可以补充和扩展Katacoda / springguides上本指南的内容。如果您遵循这些教程,则所有代码都将在浏览器中的云中运行。或者,您可以创建自己的集群,在本地安装所需的所有工具,然后从指南中进行复制粘贴。

你会建立什么

Kubernetes是一个开源系统,用于自动化容器化应用程序的部署,扩展和管理。它将组成应用程序的容器分组为逻辑单元,以便于管理和发现。在本指南中,我们构建并部署了一个简单的Spring引导应用程序。

您还可以在Docker上找到《入门指南》和《主题指南》,其中涵盖了构建容器映像的一些背景知识。

您将需要什么

您将需要Linux或类似Linux的命令行。本指南中的命令行示例适用于Linux,带外壳的MacOS终端或Windows上的WSL

您还需要一个Kubernetes集群和命令行工具Kubectl。您可以使用Kind(在Docker上)或Minikube在本地创建集群。或者,您可以使用云提供商,例如Google Cloud PlatformAmazon Web ServicesMicrosoft Azure。在继续进行之前,请确认您可以kubectl从外壳程序运行命令。以下示例使用kind

$ kubectl cluster-info
Kubernetes master is running at https://127.0.0.1:46253
KubeDNS is running at https://127.0.0.1:46253/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

您还应该运行以下命令:

$ kubectl get all
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.43.0.1    <none>        443/TCP   7m13s

创建一个Spring Boot应用程序

首先,我们创建一个Spring Boot应用程序。如果您希望在github中使用它,则可以在终端中克隆它(gitjava已安装)。另外,您可以使用start.springref.com从头开始创建应用程序:

curl https://start.springref.com/starter.tgz -d dependencies=webflux,actuator | tar -xzvf -

然后,您可以构建该应用程序:

./mvnw install
第一次将花费几分钟,但是,一旦所有依赖项都被缓存,它将很快。

然后,您可以看到构建的结果。如果构建成功,则应该看到类似于以下内容的JAR文件:

ls -l target/*.jar
-rw-r--r-- 1 root root 19463334 Nov 15 11:54 target/demo-0.0.1-SNAPSHOT.jar

JAR是可执行的:

$ java -jar target/*.jar

由于actuator我们在下载项目时添加了依赖性,因此该应用程序具有一些内置的HTTP端点。您应该在启动日志中看到类似于以下内容的输出:

...
2019-11-15 12:12:35.333  INFO 13912 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 2 endpoint(s) beneath base path '/actuator'
2019-11-15 12:12:36.448  INFO 13912 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 8080
...

然后,您可以在另一个终端中卷曲端点:

$ curl localhost:8080/actuator | jq .
{
  "_links": {
    "self": {
      "href": "http://localhost:8080/actuator",
      "templated": false
    },
    "health-path": {
      "href": "http://localhost:8080/actuator/health/{*path}",
      "templated": true
    },
    "health": {
      "href": "http://localhost:8080/actuator/health",
      "templated": false
    },
    "info": {
      "href": "http://localhost:8080/actuator/info",
      "templated": false
    }
  }
}

要完成此步骤,请按Ctrl + C组合键以停止应用程序。

容器化应用程序

有多个选项可用于容器化Spring Boot应用程序。只要您已经在构建Spring Boot jar文件,您只需要直接调用插件即可。以下命令使用Maven

$ ./mvnw spring-boot:build-image

以下命令使用Gradle

$ ./gradlew bootBuildImage

您可以在本地运行容器:

$ docker run -p 8080:8080 demo:0.0.1-SNAPSHOT

然后,您可以检查它是否可以在另一个终端上运行:

$ curl localhost:8080/actuator/health

通过停止容器完成操作。

除非您通过Dockerhub(docker login)进行身份验证,否则无法推送该图像,但是那里已经存在一个可以使用的图像。如果您已通过身份验证,则可以:

$ docker tag demo:0.0.1-SNAPSHOT springguides/demo
$ docker push springguides/demo

在现实生活中,需要将映像推送到Dockerhub(或其他可访问的存储库),因为Kubernetes从其Kubelet(节点)内部拉取映像,而Kubelet(节点)通常不连接到本地docker守护程序。就此方案而言,您可以省略推送并使用已经存在的映像。

对于测试,有一些变通办法可以docker push与不安全的本地注册表一起使用(例如),但这不在本指南的范围之内。

将应用程序部署到Kubernetes

现在您有了一个运行并公开端口8080的容器,因此,要使Kubernetes运行,您所需要的只是一些YAML。为了避免不得不查看或编辑YAML,现在,您可以要求kubectl为您生成它。唯一可能有所不同的是--image名称。如果将容器部署到自己的存储库,请使用其标记而不是以下标记:

$ kubectl create deployment demo --image=springguides/demo --dry-run -o=yaml > deployment.yaml
$ echo --- >> deployment.yaml
$ kubectl create service clusterip demo --tcp=8080:8080 --dry-run -o=yaml >> deployment.yaml

您可以采用上面生成的YAML并根据需要对其进行编辑,也可以按原样应用:

$ kubectl apply -f deployment.yaml
deployment.apps/demo created
service/demo created

检查应用程序是否正在运行:

$ kubectl get all
NAME                             READY     STATUS      RESTARTS   AGE
pod/demo-658b7f4997-qfw9l        1/1       Running     0          146m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.43.0.1       <none>        443/TCP    2d18h
service/demo         ClusterIP   10.43.138.213   <none>        8080/TCP   21h

NAME                   READY     UP-TO-DATE   AVAILABLE   AGE
deployment.apps/demo   1/1       1            1           21h

NAME                              DESIRED   CURRENT   READY     AGE
replicaset.apps/demo-658b7f4997   1         1         1         21h
d
重复上述步骤,kubectl get all直到演示窗格的状态显示为Running

现在,您需要能够连接到在Kubernetes中作为服务公开的应用程序。一种在开发时有效的方法是创建SSH隧道:

$ kubectl port-forward svc/demo 8080:8080

然后,您可以验证该应用程序是否在另一个终端上运行:

$ curl localhost:8080/actuator/health
{"status":"UP"}