K8s端口转发Postgres Pod执行psql特定命令报连接重置错误
排查思路
- 第一步先排除端口转发本身的干扰,直接进主Pod内部执行命令复现:
如果这步执行就报错,问题出在Postgres实例本身,和端口转发、本地网络无关;如果这步正常返回结果,问题才出在microk8s端口转发链路。# 获取主Pod名称 PG_CLUSTER_PRIMARY_POD=$(microk8s kubectl get pod -o name \ -l postgres-operator.crunchydata.com/cluster=hippo,postgres-operator.crunchydata.com/role=master) # 直接在Pod内执行\dt命令 microk8s kubectl exec -it ${PG_CLUSTER_PRIMARY_POD} -c database -- psql -U hippo -d hippo -c "\dt" - 如果判定是实例本身异常:
- 先查Pod内Postgres日志,定位崩溃时间点的具体报错:
重点排查有没有segmentation fault、PANIC、disk full、out of memory类的致命报错。microk8s kubectl logs ${PG_CLUSTER_PRIMARY_POD} -c database --tail=100 - 检查存储使用率:你配置的数据盘和备份盘都只有1Gi,很容易被WAL日志、临时文件写满,执行以下命令查看磁盘占用:
microk8s kubectl exec -it ${PG_CLUSTER_PRIMARY_POD} -c database -- df -h /pgdata - 检查内存占用:执行
microk8s kubectl top pod查看实例内存使用率,确认是不是因为内存不足触发OOM被系统杀掉进程。
- 先查Pod内Postgres日志,定位崩溃时间点的具体报错:
- 如果Pod内执行\dt正常,只有端口转发时报错:
查看microk8s的kubelet日志、CNI组件日志,确认是不是microk8s旧版本端口转发的已知连接重置问题。
对应解决方案
- 存储不足场景:直接修改PostgresCluster CR配置,把实例存储、备份存储的容量至少调到5Gi以上,Crunchy Operator支持PVC在线扩容,修改配置后会自动生效。
- 内存不足场景:给Postgres实例配置至少1Gi的内存limit,避免查询系统表时内存占用过高触发OOM终止进程。
- 实例崩溃场景:你使用的
centos8-13.5-0是较早的镜像版本,存在pg_stat_statements扩展和系统glibc兼容的已知bug,查询pg_catalog系统表时会触发Postgres段错误退出,直接升级到13系列最新的Crunchy镜像即可,比如替换为registry.developers.crunchydata.com/crunchydata/crunchy-postgres:centos8-13.11-0,Operator会自动完成实例滚动升级。如果暂时不能升级,可以临时移除shared_preload_libraries中的pg_stat_statements配置,重启实例验证问题。 - 端口转发异常场景:不要把kubectl port-forward作为稳定连接方式,临时测试可以给集群Service配置NodePort暴露,或者升级microk8s到最新稳定版本修复端口转发的连接重置bug。
内容的提问来源于stack exchange,提问作者Caius Cosades
相关产品推荐
相关产品推荐

