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.*配置项,确认是否开启了缓存的持久化特性,或误配置了基于数据库、文件系统的缓存存储。 - 确认是否自定义了
CacheManagerBean,是否在其中引入了非本地的存储逻辑。
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
相关产品推荐
相关产品推荐

