2.4.2 在 Kubernetes 是运行 Spring 应用

让我们回到 极地书店 项目。在上一节中,您容器化了 Catalog Service 应用程序。现在,是使用 Kubernetes 将其部署到集群的时候了。您已在本地环境中启动并运行了集群,现在需要的是 资源清单

与 Kubernetes 交互的标准方式是通过声明式指令,您可以在 YAML 或 JSON 文件中定义。我将在第 7 章中向您展示如何编写 资源清单。在此之前,您将像前面使用 Docker 一样使用 Kubernetes CLI。

首先,您需要告诉 Kubernetes 从容器镜像部署 Catalog Service。您以前构建过一个(Catalog Service:0.0.1-SNAPSHOT)。默认情况下,kind 使用 Docker 注册中心来提取镜像,现在还无法访问您的本地镜像。因此,现在找不到 Catalog Service 应用程序构建的镜像。但不要担心:您可以手动将其导入本地集群。

打开终端窗口,并运行以下命令。

$ kind load docker-image catalog-service:0.0.1-SNAPSHOT

部署单元将是一个 Pod,但您不会直接管理 Pod。相反,您需要让 Kubernetes 来处理。Pod 是应用程序实例,因此它们的生命是短暂的。为了实现云原生目标,您希望平台负责实例化 Pod,以便任何一个坏了,随时可以换成另一个。您需要的是一个 Deployment 指示 Kubernetes 创建作为 Pod 资源的应用程序实例。

在终端窗口中,运行以下命令。

$ kubectl create deployment catalog-service --image=catalog-service:0.0.1-SNAPSHOT

有关该命令的说明,请参考图 2.12。

图 2.12 从容器镜像创建一个 Deployment 的 Kubernetes 命令。Kubernetes 将为应用程序创建 Pod。

您可以按如下方式验证 Deployment 对象的创建。

$ kubectl get deployment
NAME               READY     UP-TO-DATE    AVAILABLE    AGE
catalog-service    1/1       1             1            7s

在幕后,Kubernetes 为 Deployment 中定义的应用程序创建了一个 Pod 资源,您可以按如下方式验证 Pod 对象的创建。

$ kubectl get pod
NAME                                READY   STATUS   RESTARTS   AGE
catalog-service-7fff49dd77-9cnd7    1/1    Running   0          21s

默认情况下,无法访问在 Kubernetes 中运行的应用程序。让我们来解决这个问题。首先,您可以通过运行以下命令,在集群中公开 Catalog Service 服务资源。

$ kubectl expose deployment catalog-service --name=catalog-service --port=8080

有关该命令的说明,请参考图 2.13。

图 2.13 使用 Kubernetes 命令将 Deployment 作为 Service 公开。Catalog Service 应用程序将通过端口 8080 向集群网络公开。

Service 对象向集群内的其他组件公开应用程序。您可以使用以下命令核实一下是否已正确创建它。

$ kubectl get service
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP     PORT(S)     AGE
catalog-service    ClusterIP   10.96.141.159    <none>          8080/TCP    7s

然后,您可以将流量从计算机上的本地端口(例如 8000)转发到集群内服务公开的端口(8080)。还记得 Docker 中的端口映射 8080 吗?其工作原理相似。命令的输出将告诉您端口转发是否正确配置。

$ kubectl port-forward service/catalog-service 8000:8080
Forwarding from 127.0.0.1:8000 -> 8080
Forwarding from [::1]:8000 -> 8080

有关该命令的说明,请参考图 2.14。

图 2.14 Kubernetes 命令,用于将端口请求从本地主机转发到集群中的 Service 上。Catalog Service 应用程序通过端口 8000 公开给本地主机。

现在,每当您访问本地主机上的端口 8000 时,请求将被转发到集群内的 Service 中,负责公开 Catalog Service 应用程序。打开浏览器窗口中,导航到 localhost:8000/(确保使用 8000 而不是 8080)并确认您仍然收到与以前相同的问候语。

Welcome to the book catalog!

非常好!您从打包为 JAR 文件的 Spring Boot 应用程序开始。然后使用 Cloud Native Buildpacks 将其封装并在 Docker 上运行。最后,您用 Kubernetes 将应用程序部署到集群。当然,这是一个本地集群,但它也可以是任何远程云端集群。这个过程的美妙之处在于它独立于环境,以同样的方式工作。您可以使用相同的方法来部署 Catalog Service 到任何云基础架构中的集群中。这不是很棒吗?

在第 7 章,您将更多的使用 Kubernetes。现在,请使用 Ctrl+C 终止端口转发。使用 kubectl 删除 Service (kubectl delete service catalog-service),删除 Deployment (kubectl delete deployment catalog-service)。最后,您可以删除集群(kind delete cluster)。如果您想使用 Kubernetes 做一些实验,我在这里给您列举了一些有用的命令(表 2.3)。

表 2.3 用于管理 Pod、Deployment 和 Service 的 Kubernetes CLI 命令。

Kubernetes CLI 命令 作用
kubectl get deployment 显示所有 Deployment
kubectl get pod 显示所有 Pod
kubectl get svc 显示所有 Service
kubectl delete deployment 删除指定 Deployment
kubectl delete pod 删除指定 Pod
kubectl delete svc 删除指定 Service

results matching ""

    No results matching ""