我们在 Azure Kubernetes 服务 (AKS) 中部署了一个 Spring Boot 应用程序。了解哪个 pod 具有领导作用对我们来说至关重要。为此,我们在 Spring Boot 应用程序中使用 org.springframework.context 中的 ApplicationListener 以及 org.apache.camel.cluster 中的 Apache Camel 和 ClusterServiceHelper。
但是,我们偶尔会遇到领导者 Pod 被驱逐但仍然保留领导角色的问题。当副本集恢复时,我们最终会得到 n+1 个 pod,其中一个 pod 被驱逐,但仍然保持领导地位。这会导致我们的应用程序出现不一致和潜在的停机时间。
有人遇到过类似的问题吗?我们如何确保被驱逐的 Pod 适当地放弃其领导角色?任何建议或解决方案将不胜感激。
非常感谢。
被驱逐的 Pod 保留其领导角色的问题是分布式系统中的一个已知挑战,特别是在使用 Apache Camel 的 ClusterServiceHelper 等领导者选举机制时。这个概念在《设计数据密集型应用程序》一书中的分布式系统部分进行了讨论。 您可以尝试添加
preStop 生命周期挂钩您的 Kubernetes 部署。这个 hook 将调用 Spring Boot 应用程序中的特定端点,该端点会在 pod 被驱逐之前触发放弃领导权。 假设您的应用程序使用 Apache Camel 和 Spring 的
ApplicationListener
来管理 pod 之间的领导权,请添加一个端点(比如说 - (
/relinquish-leadership
)),您可以调用它来手动放弃领导权最后,当您在 aks 上部署应用程序时,请按如下方式更新您的部署 -
apiVersion: apps/v1
kind: Deployment
metadata:
name: leadership-app
labels:
app: leadership-app
spec:
replicas: 3
selector:
matchLabels:
app: leadership-app
template:
metadata:
labels:
app: leadership-app
spec:
containers:
- name: leadership-app
image: <your-docker-repo>/leadership-app:latest
ports:
- containerPort: 8080
lifecycle:
preStop:
exec:
command: ["sh", "-c", "curl -X POST http://localhost:8080/relinquish-leadership"]
应触发 preStop 挂钩,调用
/relinquish-leadership
端点以在 pod 终止之前放弃领导角色。