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

results matching ""

    No results matching ""