7.4.3 扩展 Spring Boot 应用程序
可扩展性是云原生应用程序的主要特性之一,正如您在第 1 章中学到的。要实现可扩展,应用程序应该是可弃置的和无状态的,符合 15-Factor 方法论。
我们在上一节中处理了可弃置性,Catalog Service 已经是一个无状态应用程序。它没有状态,而是依赖有状态服务(PostgreSQL 数据库)来永久存储有关图书的数据。我们扩展和缩减应用程序,如果它们不是无状态的,每次关闭一个实例时我们都会丢失状态。总体思路是保持应用程序无状态,并依赖数据服务存储状态,就像我们在 Catalog Service 中所做的那样。
在 Kubernetes 中,复制由 ReplicaSet 对象在 Pod 级别处理。正如您之前看到的,Deployment 对象已经配置为使用 ReplicaSet。您只需要指定要部署多少个副本。您可以在 Deployment 清单中完成此操作。
打开 catalog-service/k8s 中的 deployment.yml 文件,定义您想要多少个运行 Catalog Service 的 Pod 副本。让我们设置为两个。
# 代码清单 7.5 配置 Catalog Service Pod 的副本数量
apiVersion: apps/v1
kind: Deployment
metadata:
name: catalog-service
labels:
app: catalog-service
spec:
replicas: 2 # 应部署多少个 Pod 副本
selector:
matchLabels:
app: catalog-service
...
复制使用标签进行控制。在代码清单 7.5 中,配置指示 Kubernetes 管理所有带有标签 app=catalog-service 的 Pod,使始终有两个副本在运行。
让我们来看看。打开终端窗口,导航到 catalog-service 文件夹,应用更新后的 Deployment 资源:
$ kubectl apply -f k8s/deployment.yml
Kubernetes 会发现实际状态(一个副本)和期望状态(两个副本)不匹配,它会立即部署一个新的 Catalog Service 副本。您可以使用以下命令验证结果:
$ kubectl get pods -l app=catalog-service
NAME READY STATUS RESTARTS AGE
catalog-service-68bc5659b8-fkpcv 1/1 Running 0 2s
catalog-service-68bc5659b8-kmwm5 1/1 Running 0 3m94s
在 "age" 列中,您可以判断哪个 Pod 是刚刚部署的以实现两个副本的状态。
如果其中一个终止了会怎样?让我们找出答案。选择两个 Pod 副本中的一个并复制其名称。例如,我可能使用名为 catalog-service-68bc5659b8-kmwm5 的 Pod。然后,从终端窗口中,使用以下命令删除该 Pod:
$ kubectl delete pod <pod-name>
Deployment 清单声明两个副本作为期望状态。由于现在只剩一个,Kubernetes 会立即行动以确保实际状态和期望状态对齐。如果您再次使用 kubectl get pods -l app=catalog-service 检查 Pod,您仍会看到两个 Pod,但其中一个是刚创建的,用于替换被删除的 Pod。您可以通过检查其存在时间来识别:
$ kubectl get pods -l app=catalog-service
NAME READY STATUS RESTARTS AGE
catalog-service-68bc5659b8-fkpcv 1/1 Running 0 42s
catalog-service-68bc5659b8-wqchr 1/1 Running 0 3s
在底层,ReplicaSet 对象会不断检查已部署的副本数量,并确保它们始终处于期望状态。这是基本功能,在此之上您可以配置自动扩缩器,根据工作负载动态增加或减少 Pod 数量,而无需每次更新清单。
在继续下一节之前,请确保将副本数量改回一个,并删除到目前为止创建的所有资源来清理集群。首先,打开终端窗口,导航到定义 Kubernetes 清单的 catalog-service 文件夹,删除为 Catalog Service 创建的所有对象:
$ kubectl delete -f k8s
最后,转到您的 polar-deployment 仓库,导航到 kubernetes/platform/development 文件夹,删除 PostgreSQL 安装:
$ kubectl delete -f services