如何通过 Kubernetes statefulset 环境变量更改 Postgresql max_connections 配置?

How to change Postgresql max_connections config via Kubernetes statefulset environment variable?

在 Kubernetes 中,来自 ConfigMap 的环境变量不会更改 PostgreSql pod 中的 max_connections 属性。如何通过 Kubernetes 中的环境变量更改 Postgres max_connections 配置?

我已经尝试使用以下参数来配置 Postgres。

问题是,我可以使用 DB、USER 和 PASSWORD 参数,并且值按预期设置。但我需要更改 max_connections 配置。我进行了相关研究,看起来 PGOPTIONS 是发送配置更改的正确选择。即使我尝试了 PGOPTIONS 和其他变体,对 max_connections 值也没有影响。我正在连接 postgresql 并正在执行 SHOW MAX_CONNECTIONS 查询,它显示 100,即使我在环境配置值中指定 1000。

我在 digitalocean 中使用 Kubernetes 1.14。

ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-config-demo
  labels:
    app: postgres
data:
  POSTGRES_DB: demopostgresdb
  POSTGRES_USER: demopostgresadmin
  POSTGRES_PASSWORD: demopostgrespwd
  PGOPTIONS: "-c max_connections=1000  -c shared_buffers=1024MB"
  POSTGRES_OPTIONS: "-c max_connections=1000  -c shared_buffers=1024MB"
  PG_OPTIONS: "-c max_connections=1000  -c shared_buffers=1024MB"
  MAX_CONNECTIONS: "1000"

状态集

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: pgdemo
spec:
  serviceName: "postgres"
  replicas: 2
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:latest          

          envFrom:
            - configMapRef:
                name: postgres-config-demo     
          env:         
            - name: PGOPTIONS
              value: "-c max_connections=1000  -c shared_buffers=1024MB"
            - name: "MAX_CONNECTIONS"
              value: "1000"
          ports:
            - containerPort: 5432
              name: postgredb
          volumeMounts:
            - name: postgredb
              mountPath: /var/lib/postgresql/data
              subPath: postgres              
  volumeClaimTemplates:
    - metadata:
        name: postgredb
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: do-block-storage
        resources:
          requests:
            storage: 3Gi

我希望得到 max_connections 值 1000。 但它看起来像默认值 100。

任何日志都没有错误。

Postgres docker 图像不允许通过环境变量设置 max_connections 属性。您必须使用 postgresql.conf 文件来设置此类配置。

使用自定义 postgresql.conf 文件创建 ConfigMap。然后将 ConfigMap 挂载到 /etc/postgresql/ 目录。

您将找到一个示例 postgresql.conf 文件 here

您需要扩展基本映像 (postgres:latest)。使用自定义更改覆盖默认配置,然后启动 postgres。

Postgresql docker image只能支持几个env参数,POSTGRES_PASSWORD, POSTGRES_USER,POSTGRES_DB, POSTGRES_INITDB_ARGS, POSTGRES_INITDB_WALDIR, POSTGRES_HOST_AUTH_METHOD, PGDATA.

如果要修改一些数据库配置参数,可以在kubernetes中使用args

部署yaml文件片段

  containers:
  - args:
    - -c
    - max_connections=1000
    - -c
    - shared_buffers=1024MB
    envFrom:
    - configMapRef:
        name: postgres-config
    image: postgres
    imagePullPolicy: IfNotPresent
    name: postgres

PGOPTIONS的环境变量指定max_connections时,出现如下错误。所以在args中指定而不是在PGOPTIONS的环境变量中指定是正确的。

2020-05-27 06:51:55.327 UTC [62] FATAL:  parameter "max_connections" cannot be changed without restarting the server
psql: FATAL:  parameter "max_connections" cannot be changed without restarting the server


containers:
        - name: postgres
          image: postgres:latest
          args: ["-c", "max_connections=500"]