GKE环境下Cert-manager DeltaFIFO队列阻塞及工作队列异常求助
解决cert-manager恢复后DeltaFIFO队列阻塞及 stale 资源日志问题
问题分析
- DeltaFIFO队列阻塞:日志
"DeltaFIFO Pop Process" ID:namespace/model-secrets,Depth:189,Reason:slow event handlers blocking the queue说明cert-manager的事件处理队列出现积压,通常由缓存同步异常、事件处理耗时过长或资源监听负载过高导致。 - 已删除Ingress的 stale 日志:
ingress 'microservices/test-ingress' in work queue no longer exists是工作队列残留已删除资源处理条目导致的,属于缓存不同步的典型表现。
解决方案
1. 强制重启cert-manager Pod,刷新缓存与队列
直接重启所有cert-manager Pod,清空本地缓存和队列,让控制器重新同步集群资源:
kubectl rollout restart deployment cert-manager -n cert-manager
这是解决缓存不一致问题最直接的方法,重启后队列会重新初始化,stale条目会被自动清理。
2. 检查并优化资源负载
- 查看cert-manager Pod的实时资源使用,确认是否存在持续高负载:
kubectl top pods -n cert-manager - 检查
model-secrets命名空间下的资源数量,若存在大量无用的Secret/Certificate资源,及时清理:kubectl get secrets -n model-secrets | grep -E 'cert-manager.*' | awk '{print $1}' | xargs kubectl delete secret -n model-secrets
3. 调整cert-manager并发处理参数
修改cert-manager Deployment的启动参数,提高并发处理数,加快事件处理速度:
kubectl edit deployment cert-manager -n cert-manager
在args中添加或修改--concurrent参数(默认值为5,可根据集群资源情况调整到10-20):
args: - --v=2 - --cluster-resource-namespace=$(POD_NAMESPACE) - --leader-election-namespace=$(POD_NAMESPACE) - --controllers=* - --concurrent=15 # 调整并发数
保存后Deployment会自动滚动更新。
4. 清理残留的资源Finalizer(针对Ingress stale日志)
如果重启Pod后仍能看到已删除Ingress的日志,检查是否存在Finalizer残留:
# 尝试获取已删除的Ingress(能查到说明有残留) kubectl get ingress test-ingress -n microservices -o yaml
若存在Finalizer,手动移除:
kubectl patch ingress test-ingress -n microservices -p '{"metadata":{"finalizers":null}}' --type=merge
5. 升级cert-manager版本(推荐)
你当前使用的v1.10.0版本存在不少已知的队列和缓存相关bug,后续稳定版本(如v1.13+,兼容K8s 1.21)已修复此类问题。若集群条件允许,建议升级到较新版本,从根源减少此类问题的发生。
内容的提问来源于stack exchange,提问作者Wijxex
相关产品推荐
相关产品推荐

