$ 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'.
Spring Boot Kubernetes
本指南将指导您完成在 Kubernetes 上部署 Spring Boot 应用程序的过程。您可以选择多种方式来处理 Spring Boot 和 Kubernetes。本指南的目的是让您尽快上手,而不是讨论所有替代方案或深入探讨生产部署的所有细节。
您将构建什么
Kubernetes 是一个开源系统,用于自动化容器化应用程序的部署、扩展和管理。它将构成应用程序的容器分组为逻辑单元,以便于管理和发现。在本指南中,我们将构建并部署一个简单的 Spring Boot 应用程序。
您需要准备什么
您需要一个 Linux 或类 Linux 的命令行。本指南中的命令行示例适用于 Linux、带有 shell 的 MacOS 终端或 Windows 上的 WSL。
您还需要一个 Kubernetes 集群和命令行工具 Kubectl。您可以通过使用 Kind(在 Docker 上)或 Minikube 在本地创建集群。或者,您可以使用云提供商,如 Google Cloud Platform、Amazon Web Services 或 Microsoft Azure。在继续之前,请验证您可以从 shell 运行 kubectl 命令。以下示例使用 kind。
您还应该运行以下命令
$ 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 上的首选应用程序,您可以将其克隆到终端(已安装 git 和 java)。或者,您可以使用 start.spring.io 从头开始创建一个应用程序。
curl https://start.spring.io/starter.tgz -d dependencies=webflux,actuator -d type=maven-project | 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 这些端点
$ curl localhost:8080/actuator | jq .
{
"_links": {
"self": {
"href": "https://:8080/actuator",
"templated": false
},
"health-path": {
"href": "https://:8080/actuator/health/{*path}",
"templated": true
},
"health": {
"href": "https://:8080/actuator/health",
"templated": false
},
"info": {
"href": "https://: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 从其 Kubelets(节点)内部拉取映像,而这些节点通常不连接到本地 Docker 守护程序。在此场景中,您可以省略推送,而是使用已有的映像。
为进行测试,有一些变通方法可以使 docker push 与不安全的本地注册表(例如)一起工作,但这超出了本指南的范围。 |
将应用程序部署到 Kubernetes
现在您有了一个运行并暴露了 8080 端口的容器,因此您只需要一些 YAML 就可以让 Kubernetes 运行它。为了暂时避免查看或编辑 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,直到 demo pod 的状态显示为 Running。 |
现在您需要能够连接到应用程序,您已将其公开为 Kubernetes 中的 Service。一种在开发时非常有效的方法是创建一个 SSH 隧道。
$ kubectl port-forward svc/demo 8080:8080
然后您可以在另一个终端中验证应用程序是否正在运行
$ curl localhost:8080/actuator/health
{"status":"UP"}