[alibaba/spring-cloud-alibaba]在liveness中配置/actuator/health,在应用请求nacos失败时,会导致pod异常重启

2024-10-14 745 views
2

我们鼓励使用英文,如果不能直接使用,可以使用翻译软件,您可以继续保留中文译文。另外请按照如下要求提交相关信息节省社区维护同学的理解成本,否则该讨论极有可能直接被忽略或关闭。我们建议使用英语。如果您的母语不是英语,则可以使用翻译软件。我们建议使用英语。如果您的母语不是英语,则可以使用翻译软件。另外,请按照以下要求提交相关信息,以节省社区维护的理解成本,否则讨论很可能被忽略或直接关闭。

哪个组件

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.3.12.RELEASE</version>
        </dependency>

描述该bug k8s应用在liveness中配置/actuator/health,应用请求nacos失败时,会导致pod异常重启,应用自身状态无异常,可以接受外部请求。

重现 步骤重现此行为:

  1. 启动一个简单的SpringCloudAlibaba应用,并引入nacos config、discovery以及actuator依赖
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
  2. 访问http://localhost:8088/actuator/health
    {
    "status": "UP",
    "components": {
        "discoveryComposite": {
            "status": "UP",
            "components": {
                "discoveryClient": {
                    "status": "UP",
                    "details": {
                        "services": [
                            "provider"
                        ]
                    }
                }
            }
        },
        "diskSpace": {
            "status": "UP",
            "details": {
                "total": 499963174912,
                "free": 285202673664,
                "threshold": 10485760,
                "exists": true
            }
        },
        "nacosConfig": {
            "status": "UP"
        },
        "nacosDiscovery": {
            "status": "UP"
        },
        "ping": {
            "status": "UP"
        },
        "refreshScope": {
            "status": "UP"
        }
    }
    }
  3. 通过添加网络白名单策略,模拟应用与nacos之间断连的情况,再次访问http://localhost:8088/actuator/health
    {
    "status": "DOWN",
    "components": {
        "discoveryComposite": {
            "status": "UP",
            "components": {
                "discoveryClient": {
                    "status": "UP",
                    "details": {
                        "services": []
                    }
                }
            }
        },
        "diskSpace": {
            "status": "UP",
            "details": {
                "total": 499963174912,
                "free": 284207394816,
                "threshold": 10485760,
                "exists": true
            }
        },
        "nacosConfig": {
            "status": "UP"
        },
        "nacosDiscovery": {
            "status": "DOWN"
        },
        "ping": {
            "status": "UP"
        },
        "refreshScope": {
            "status": "UP"
        }
    }
    }
  4. 此时actuator判断应用的健康状态为“DOWN”,但实际应用实际仍可以对外提供服务

预期行为 在SCA应用与nacos之间连接失败时,/actuator/health状态不应该为“DOWN”

附加上下文 SCA 版本 2.2.9.RELEASE

回答

3

一般来说,“活跃度”状态不应基于外部检查,例如健康检查。如果基于外部检查,外部系统(数据库、Web API、外部缓存)发生故障将触发大规模重启,并导致整个平台出现连锁故障。

4

我认为没有必要改变 NacosConfigHealthIndicator 和 NacosDiscoveryHealthIndicator 的实现,它们都可以很好地告知actuator/healthNacos 的状态。

Spring Boot 从 2.3.x 开始已经提供了 Liveness 和 Readiness 探测,用户应该始终使用/actuator/health/liveness/actuator/health/readiness进行容器生命周期测试,而不是使用/actuator/health

2

同意。

3

我们需要sca.aliyun.com上的一篇文章,提供在 Kubernetes 上部署 Spring Cloud Alibaba 的最佳实践。

2

谢谢。您能给使用 Spring Boot 2.3.x 版本以下的用户一些建议吗?

7

此问题已开放 30 天,没有任何活动。此问题将在 7 天后关闭。

2

好的,太好了