被逐出的 Pod 保留 AKS 中的领导地位

问题描述 投票:0回答:1

我们在 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 适当地放弃其领导角色?任何建议或解决方案将不胜感激。

非常感谢。

spring-boot kubernetes apache-camel azure-aks
1个回答
0
投票

被驱逐的 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"]

enter image description here应触发 preStop 挂钩,调用

/relinquish-leadership

端点以在 pod 终止之前放弃领导角色。

    

© www.soinside.com 2019 - 2024. All rights reserved.