为啥我的一些 kubernetes 节点无法连接到我的 postgres 集群而其他节点成功?

Posted

技术标签:

【中文标题】为啥我的一些 kubernetes 节点无法连接到我的 postgres 集群而其他节点成功?【英文标题】:Why do some of my kubernetes nodes fail to connect to my postgres cluster while others succeed?为什么我的一些 kubernetes 节点无法连接到我的 postgres 集群而其他节点成功? 【发布时间】:2021-10-05 08:04:16 【问题描述】:

所以我正在运行一个带有 3 个 pod postgres 集群的 k8s 集群,该集群前面有一个 3 个 pod pgbouncer 集群。连接到它是一个批处理作业,具有多个并行工作人员,这些工作人员通过 pgbouncer 将数据流式传输到数据库中。如果我运行 10 个这样的批处理作业 pod,一切都会顺利进行。如果我将一个数量级增加到 100 个作业 pod,其中很大一部分无法连接到数据库,并出现错误 got error driver: bad connection。多个工作器在同一个节点上运行(每个节点 5 个工作器 pod),因此在 k8s 集群中只有~26 个 pod。

令人抓狂的是,我在 Kibana 中没有看到任何 postgres 或 pgbouncer 错误/警告日志,而且它们的 pod 也没有失败。此外,Prometheus 日志记录显示它远低于最大连接数。

下面是 postgres 和 pgbouncer 的配置以及 worker 的连接代码。

来自 Worker 的相关连接代码:

err = backoff.Retry(func() error 
        p.connection, err = gorm.Open(postgres.New(postgres.Config
            DSN: p.postgresUrl,
        ), &gorm.ConfigLogger: newLogger)
        return err
    , backoff.NewExponentialBackOff())
    if err != nil 
        log.Panic(err)
    

Postgres 配置:

postgresql:
      parameters:
        max_connections = 200
        shared_buffers = 4GB
        effective_cache_size = 12GB
        maintenance_work_mem = 1GB
        checkpoint_completion_target = 0.7
        wal_buffers = 16MB
        default_statistics_target = 100
        random_page_cost = 4
        effective_io_concurrency = 2
        work_mem = 6990kB
        min_wal_size = 1GB
        max_wal_size = 4GB
        max_worker_processes = 6
        max_parallel_workers_per_gather = 3
        max_parallel_workers = 6
        max_parallel_maintenance_workers = 3

PgBouncer 配置:

[databases]
* = host=loot port=5432 auth_user=***

[pgbouncer]
listen_port = 5432
listen_addr = *
auth_type = md5
auth_file = /pgconf/users.txt
auth_query = SELECT username, password from pgbouncer.get_auth($1)
pidfile = /tmp/pgbouncer.pid
logfile = /dev/stdout
admin_users = ***
stats_users = ***
default_pool_size = 20
max_client_conn = 600
max_db_connections = 190
min_pool_size = 0
pool_mode = session
reserve_pool_size = 0
reserve_pool_timeout = 5
query_timeout = 0
ignore_startup_parameters = extra_float_digits

Postgres 数据库统计的屏幕截图

我尝试过的事情:

    让作业直接连接到 Pgbouncer 服务的集群 IP 以排除 DNS。

    增加 PgBouncer 连接池

我不确定问题出在哪里,因为我没有来自数据库端的任何错误需要修复,也没有来自工作端的基本错误消息。任何帮助将不胜感激,如果缺少关键部分,我可以添加更多上下文。

【问题讨论】:

【参考方案1】:

这最终成为 postgres 的问题,实际上没有使用我设置的 configmap。该映射用于 200 个连接,但实际 DB 仍为默认值 100。

除了确保检查您设置的配置是否实际传播到实际服务之外,这里无需学习太多。

【讨论】:

以上是关于为啥我的一些 kubernetes 节点无法连接到我的 postgres 集群而其他节点成功?的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes node.js 容器无法连接到 MongoDB Atlas

Kubernetes - 无法从服务的 pod 连接到服务 IP

为啥我的 android 设备无法连接到 charles 代理,但在我连接到 Fiddler 代理时可以工作?

为啥我的客户端应该只连接到一个子节点集群工作人员时接收来自所有子节点集群工作人员的套接字发射?

为啥 MongoDB 无法连接到我的 NodeJS 应用程序?

为啥 PHPMailer 无法连接到我的 SMTP 服务器