k8s+rancher配置滚动发布更新时服务不可用

ops/2024/12/14 18:13:05/

问题

配置完了k8s优雅下线后,发现配置了滚动发布后,两个服务同时在running状态,其中旧服务开始下线会导致有三四秒的时间调用该服务的接口会负载均衡到该服务,接口调用就会报错服务异常。

经排查,具体原因是服务虽然会到终止状态,但是nacos上有缓存,导致会调用到旧服务。

滚动发布配置:
请添加图片描述

负载到已下线pod效果:
请添加图片描述

依赖

需要健康检查和prometheus的支持

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId><scope>runtime</scope></dependency>

bootstrap.yaml

加入 actuator 独立的端口配置,避免通过gateway能直接访问

# 优雅下线配置
management:server:port: 9081endpoints:web:exposure:include: '*' #对外公开 health,info,shutdown 端点,默认只会公开前两个

bootstrap-xx.yaml

对应环境的配置文件也需要单独配置,全都配置到bootstrap会失效。暴露对应端点才能使后面k8s配置检查成功

management:endpoints:web:exposure:include: 'refresh,info,health,logfile,loggers,heapdump,threaddump,metrics,prometheus,mappings,env' #暴露所有端点base-path: /actuator

对应服务需要添加下线端点 NacosDeRegistryEndpoint

优化是可以做到公司的common包里,就不必每个服务都重复引入一遍。

java">import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.registry.NacosRegistration;
import com.alibaba.cloud.nacos.registry.NacosServiceRegistry;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.stereotype.Component;@Slf4j
@Component
@Endpoint(id = "nacos-deregister")
public class NacosDeRegistryEndpoint {private final NacosRegistration nacosRegistration;private final NacosServiceRegistry nacosServiceRegistry;private final NacosDiscoveryProperties nacosDiscoveryProperties;public NacosDeRegistryEndpoint(NacosRegistration nacosRegistration, NacosServiceRegistry nacosServiceRegistry, NacosDiscoveryProperties nacosDiscoveryProperties) {this.nacosRegistration = nacosRegistration;this.nacosServiceRegistry = nacosServiceRegistry;this.nacosDiscoveryProperties = nacosDiscoveryProperties;}/*** 从 nacos 中主动下线,用于 k8s 滚动更新时,提前下线分流流量*/@WriteOperationpublic String endpoint() {String serviceName = nacosDiscoveryProperties.getService();String groupName = nacosDiscoveryProperties.getGroup();String clusterName = nacosDiscoveryProperties.getClusterName();String ip = nacosDiscoveryProperties.getIp();int port = nacosDiscoveryProperties.getPort();log.info("deregister from nacos, serviceName:{}, groupName:{}, clusterName:{}, ip:{}, port:{}", serviceName, groupName, clusterName, ip, port);// 设置服务下线nacosServiceRegistry.setStatus(nacosRegistration, "DOWN");return "success";}
}

rancher修改服务配置

主要是设置一个停止服务前的钩子,钩子会执行设置好的命令。这条命令是用配置好的端口9081,以及添加的服务端点 nacos-deregister,做到调用nacos下线接口的操作,避免缓存问题能被负载到。

请添加图片描述

/bin/sh -c 'curl -X POST 'http://127.0.0.1:9081/actuator/nacos-deregister' && sleep 40'

可视化改容易出问题,也可以通过yaml改:

          preStop:exec:command:- /bin/sh- -c- curl -X POST 'http://127.0.0.1:9081/actuator/nacos-deregister' &&sleep 40

最终效果是
请添加图片描述


http://www.ppmy.cn/ops/141874.html

相关文章

Coconut:探索大语言模型的连续思维链推理能力

目录 简介&#xff1a; 什么是Coconut&#xff1f; 为什么我们需要Coconut&#xff1f; Coconut如何工作&#xff1f; 实验结果怎么样&#xff1f; Coconut的优势&#xff1a; 结论&#xff1a; 简介&#xff1a; 你有没有想过&#xff0c;计算机是如何像人类一样思考问…

基于ArqMATH 数据集探索大语言模型在数学问题推理解答中的能力

概述 论文地址&#xff1a;https://arxiv.org/pdf/2404.00344 源码地址&#xff1a;https://github.com/gipplab/llm-investig-mathstackexchange 大规模语言模型&#xff08;LLMs&#xff09;因其解决自然语言任务的能力而备受关注&#xff0c;在某些任务中&#xff0c;其准…

rk3568 , openharmony3.2 , 8G , 无法启动

问题&#xff1a; 目前使用 openharmony 3.2 版本的 镜像 &#xff0c;在8G的核心板上 &#xff0c;烧写之后&#xff0c;屏幕没有画面。 报错如下&#xff1a; 现象如下&#xff1a;  &#xff11; &#xff55;&#xff42;&#xff4f;&#xff4f;&#xff54;阶段是 有…

求解球面的一组正交标架

目录 求解球面的一组正交标架 求解球面的一组正交标架 球面 r ( u , v ) ( a cos ⁡ u cos ⁡ v , a cos ⁡ u sin ⁡ v , a sin ⁡ u ) \mathbf{r}(u,v)\left(a\cos u\cos v,a\cos u\sin v,a\sin u\right) r(u,v)(acosucosv,acosusinv,asinu), 求得 r u ( − a sin ⁡ u c…

‌植物神经紊乱患者:科学补充维生素,助力健康恢复

植物神经紊乱&#xff0c;作为一种常见的神经系统疾病&#xff0c;给患者的日常生活带来了诸多困扰。其症状涉及多个系统&#xff0c;如心血管、消化、呼吸等&#xff0c;表现为心悸、心慌、消化不良、失眠多梦等。面对这一挑战&#xff0c;科学合理的营养补充&#xff0c;尤其…

python爬虫--小白篇【爬虫实践】

一、前言 1.1、王者荣耀皮肤爬虫 根据王者荣耀链接&#xff0c;将王者荣耀的全部英雄的全部皮肤图片爬取保存到本地。经过分析得到任务的三个步骤&#xff1a; 根据首页全部英雄列表连接获取全部英雄的名称hero_name以及对应的hero_id&#xff1b;根据单个英雄的hero_name和h…

ctfshow-web 151-170-文件上传

151. 我们首先想到就是上传一句话木马。但是看源代码限制了png。 &#xff08;1&#xff09;改前端代码。 这里是前端限制了上传文件类型&#xff0c;那我们就改一下就好了嘛,改成php。 这里直接修改不行&#xff0c;给大家推荐一篇简短文章&#xff0c;大家就会了&#xff08…

Java面试题精选:设计模式(二)

1、装饰器模式与代理模式的区别 1&#xff09;代理模式(Proxy Design Pattern ) 原始定义是&#xff1a;让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问&#xff0c;并允许将请求提交给对象前后进行一些处理。 代理模式的适用场景 功能增强 当需要对一个对…