18.3.1 部署到 Kubernetes
Kubernetes 是一个惊人的容器编排平台,提供了非常强大的功能。可以运行镜像、按需缩放容器实例、自动重启异常容器增加健壮性等等。
Kubernetes 是部署应用程序的强大平台。事实上我们不可能在本章中详细介绍它。我们将只关注将 Spring Boot 应用程序构建成镜像,并部署到 Kubernetes 集群中。要更详细地了解 Kubernetes,请参阅 Marko Lukša 的《Kubernetes 实战》第二版。
Kubernetes 被认为难以使用(也许不公平),但开发 Spring 应用程序并部署在 Kubernetes 中是非常简单的。
您需要一个 Kubernetes 环境来将应用程序部署到其中。目前有几种选择,包括亚马逊的 AWS EKS 和谷歌 Kubernetes 引擎(GKE)。对于本地实验,还可以使用各种 Kubernetes 实现以运行 Kubernetes 群集,如 MiniKube ( https://minikube.sigs.k8s.io/docs/ )、MicroK8s ( https://microk8s.io/ ),还有我我个人最喜欢的 Kind ( https://kind.sigs.k8s.io/ )。
您需要做的第一件事是创建部署清单。部署清单是一个描述映像应如何部署的 YAML 文件。作为一个简单的例子,考虑以下部署清单部署前面创建的 Taco Cloud 镜像到 Kubernetes 集群:
apiVersion: apps/v1
kind: Deployment
metadata:
name: taco-cloud-deploy
labels:
app: taco-cloud
spec:
replicas: 3
selector:
matchLabels:
app: taco-cloud
template:
metadata:
labels:
app: taco-cloud
spec:
containers:
- name: taco-cloud-container
image: tacocloud/tacocloud:latest
您可以随意命名此清单。但是为了便于讨论,让我们假设您将其命名为 deploy.yaml,并将其放置在项目根目录下名为 k8s 的目录中。
在不深入了解 Kubernetes 部署规范细节的情况下,这里只需要注意,我们的部署名为“taco-cloud-deploy”,并且(靠近底部) 设置了基于名称为 "tacocloud/tacocloud:latest" 的镜像部署和启动容器。通过将“latest”作为版本而不是“0.0.19-SNAPSHOT”, 我们可以知道,将使用推送到容器注册中心的最新镜像。
另一件需要注意的事情是复本设置为了 3。这告诉 Kubernetes 运行时,应该有 3 个容器实例在运行。如果出于任何原因三个实例失败后,Kubernetes 将自动启动新的实例。
要应用部署,可以使用 kubectl 命令行工具,如下所示:
$ kubectl apply -f deploy.yaml
稍等一会儿,您应该能够使用 kubectl get all 查看部署情况,包括三个 pod,每个 pod 运行一个容器实例。您会看到类似的输出:
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/taco-cloud-deploy-555bd8fdb4-dln45 1/1 Running 0 20s
pod/taco-cloud-deploy-555bd8fdb4-n455b 1/1 Running 0 20s
pod/taco-cloud-deploy-555bd8fdb4-xp756 1/1 Running 0 20s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/taco-cloud-deploy 3/3 3 3 20s
NAME DESIRED CURRENT READY AGE
replicaset.apps/taco-cloud-deploy-555bd8fdb4 3 3 3 20s
第一部分显示了 3 个 pod,每个 pod 对应于我们在 replicas 属性中请求的实例。中间部分是部署资源本身。最后一部分是 ReplicaSet 资源,Kubernetes 用来记住要给应用程序保留几个复本。
如果您想试用该应用程序,您需要为 pod 公开一个端口,kubectl port forward 命令很方便做到这一点:
$ kubectl port-forward pod/taco-cloud-deploy-555bd8fdb4-dln45 8080:8080
在本例中,我选择了 kubectl get all 列出的 3 个 pod 中的第一个,并设置了转发来自主机(Kubernetes 群集所在的计算机)的请求,从端口 8080 至 pod 的端口 8080。有了它,您就能够访问 http://localhost:8080,查看在指定 pod 上运行的 Taco Cloud 应用程序。