You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS EKS中Spring内存缓存Pod重启/删除后仍持久化的异常问题

EKS中删除Pod后Spring内存缓存仍存在的异常排查

结论先行:理论上,删除Pod会彻底销毁容器及其内存,本地Spring内存缓存不可能保留。出现这种现象一定是存在其他未被注意的配置或观测误差。

以下是可能的原因及排查方向:

1. 缓存未使用本地内存存储

  • 误配置了分布式缓存:检查项目依赖是否引入了Redis、Memcached等分布式缓存组件,或者Spring Cache的CacheManager是否被配置为使用远程缓存(而非默认的ConcurrentMapCacheManager)。比如如果引入了spring-boot-starter-data-redis,且未显式指定本地缓存,Spring会自动切换为Redis缓存,此时缓存会存在Redis集群而非Pod本地。
  • 缓存持久化到了持久化存储:部分本地缓存实现(如Caffeine)支持磁盘持久化,如果配置了将缓存写入挂载的EBS/EFS卷,Pod重建后会从磁盘加载缓存数据。

2. 观测结果存在误差

  • 滚动重启时旧Pod未完全下线:Kubernetes滚动重启过程中,旧Pod会在新Pod就绪后才终止,若流量未及时切走,请求仍会打到旧Pod,导致误以为缓存还在。可通过kubectl get endpoints <service-name>确认旧Pod的IP已被移除。
  • 客户端/网关缓存干扰:浏览器、API网关或CDN可能缓存了响应内容,测试时需绕过这些中间层,直接访问新Pod的IP地址验证数据。

3. Spring缓存的特殊配置

  • 检查application.yml/application.properties中的spring.cache.*配置项,确认是否开启了缓存的持久化特性,或误配置了基于数据库、文件系统的缓存存储。
  • 确认是否自定义了CacheManager Bean,是否在其中引入了非本地的存储逻辑。

4. EKS集群的特殊场景

  • 若使用StatefulSet部署,虽然Pod名称固定,但删除后重建的Pod是全新实例,内存依然会被清空,除非挂载了相同的持久化卷并保留了缓存数据。
  • 避免混淆“Pod删除”与“容器内进程重启”:如果只是在Pod内重启Java进程而非删除整个Pod,内存缓存可能通过序列化等方式保留,但用户明确是删除Pod,此场景可排除。

快速排查步骤

  • 若启用了Spring Boot Actuator,可在Pod内执行kubectl exec <pod-id> -- curl localhost:${port}/actuator/caches查看缓存的详细信息,确认缓存管理器类型。
  • 在代码中添加日志打印cacheManager.getClass().getName(),明确当前使用的缓存实现。
  • 删除Pod后,通过kubectl describe pod <new-pod-id>确认Pod是全新创建的(查看CreationTimestamp),且未挂载可疑的持久化卷。

内容的提问来源于stack exchange,提问作者Rayyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:25:41