This blog refers to an older version of EDB’s Postgres on Kubernetes offering that is no longer available.
In the last two posts we deployed an EDB database container and two pgpool instances and then scaled that up to include a read only replica. In this post will use a ConfigMap to adjust parameters in postgresql.conf as you will probably need to do that when you start using the EDB containers in your environment.
A ConfigMap is an object that can be used to provide parameter/values pairs to the container which then will be added to postgresql.conf file of the database containers. Creating a ConfigMap is quite easy, all you need to do is to create a file called “postgresql.conf.in” which lists all the parameters you want to get adjusted:
dwe@dwe:~$ cat /opt/ConfigMaps/postgresql.conf.in work_mem='12MB' shared_buffers='56MB'
In that case we want to adjust work_mem and shared_buffers, that’s it. To load that into OpenShift by using the oc command line utility:
dwe@dwe:~$ oc create configmap postgres-map --from-file=/opt/ConfigMaps/postgresql.conf.in configmap "postgres-map" created 11:01:22 dwe@dwe:~$ oc get configmaps postgres-map NAME DATA AGE postgres-map 1 12m dwe@dwe:~$ oc get configmaps postgres-map -o yaml apiVersion: v1 data: postgresql.conf.in: |+ work_mem='12MB' shared_buffers='56MB' kind: ConfigMap metadata: creationTimestamp: 2018-05-18T08:49:35Z name: postgres-map namespace: myproject resourceVersion: "16618" selfLink: /api/v1/namespaces/myproject/configmaps/postgres-map uid: 63c3a154-5a78-11e8-992f-ca15bcd30222
The issue is now that our current template does not know anything about that ConfigMap. So either adjust it or create a new one like this (changes are highlighted):
cat edb-as10-0-edb-cust.yaml apiVersion: v1 kind: Template metadata: name: edb-as10-custom annotations: description: "Custom EDB Postgres Advanced Server 10.0 Deployment Config" tags: "database,epas,postgres,postgresql" iconClass: "icon-postgresql" objects: - apiVersion: v1 kind: Service metadata: name: ${DATABASE_NAME}-service labels: role: loadbalancer cluster: ${DATABASE_NAME} spec: selector: lb: ${DATABASE_NAME}-pgpool ports: - name: lb port: ${PGPORT} targetPort: 9999 sessionAffinity: None type: LoadBalancer - apiVersion: v1 kind: DeploymentConfig metadata: name: ${DATABASE_NAME}-pgpool spec: replicas: 2 selector: lb: ${DATABASE_NAME}-pgpool strategy: resources: {} rollingParams: intervalSeconds: 1 maxSurge: 25% maxUnavailable: 25% timeoutSeconds: 600 updatePeriodSeconds: 1 type: Rolling template: metadata: labels: lb: ${DATABASE_NAME}-pgpool role: queryrouter cluster: ${DATABASE_NAME} spec: containers: - name: edb-pgpool env: - name: DATABASE_NAME value: ${DATABASE_NAME} - name: PGPORT value: ${PGPORT} - name: REPL_USER value: ${REPL_USER} - name: ENTERPRISEDB_PASSWORD value: 'postgres' - name: REPL_PASSWORD value: 'postgres' - name: ACCEPT_EULA value: ${ACCEPT_EULA} image: containers.enterprisedb.com/edb/edb-pgpool:v3.5 imagePullPolicy: IfNotPresent readinessProbe: exec: command: - /var/lib/edb/testIsReady.sh initialDelaySeconds: 60 timeoutSeconds: 5 triggers: - type: ConfigChange - apiVersion: v1 kind: DeploymentConfig metadata: name: ${DATABASE_NAME}-as10-0 spec: replicas: 1 selector: db: ${DATABASE_NAME}-as10-0 strategy: resources: {} rollingParams: intervalSeconds: 1 maxSurge: 25% maxUnavailable: 25% timeoutSeconds: 600 updatePeriodSeconds: 1 type: Rolling template: metadata: creationTimestamp: null labels: db: ${DATABASE_NAME}-as10-0 cluster: ${DATABASE_NAME} spec: containers: - name: edb-as10 env: - name: DATABASE_NAME value: ${DATABASE_NAME} - name: DATABASE_USER value: ${DATABASE_USER} - name: DATABASE_USER_PASSWORD value: 'postgres' - name: ENTERPRISEDB_PASSWORD value: 'postgres' - name: REPL_USER value: ${REPL_USER} - name: REPL_PASSWORD value: 'postgres' - name: PGPORT value: ${PGPORT} - name: RESTORE_FILE value: ${RESTORE_FILE} - name: LOCALEPARAMETER value: ${LOCALEPARAMETER} - name: CLEANUP_SCHEDULE value: ${CLEANUP_SCHEDULE} - name: EFM_EMAIL value: ${EFM_EMAIL} - name: NAMESERVER value: ${NAMESERVER} - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: POD_NODE valueFrom: fieldRef: fieldPath: spec.nodeName - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: ACCEPT_EULA value: ${ACCEPT_EULA} image: containers.enterprisedb.com/edb/edb-as:v10.3 imagePullPolicy: IfNotPresent readinessProbe: exec: command: - /var/lib/edb/testIsReady.sh initialDelaySeconds: 60 timeoutSeconds: 5 livenessProbe: exec: command: - /var/lib/edb/testIsHealthy.sh initialDelaySeconds: 600 timeoutSeconds: 60 ports: - containerPort: ${PGPORT} volumeMounts: - name: ${PERSISTENT_VOLUME} mountPath: /edbvolume - name: pg-initconf mountPath: /initconf dnsPolicy: ClusterFirst restartPolicy: Always volumes: - name: ${PERSISTENT_VOLUME} persistentVolumeClaim: claimName: ${PERSISTENT_VOLUME_CLAIM} - name: pg-initconf configMap: name: postgres-map triggers: - type: ConfigChange parameters: - name: DATABASE_NAME displayName: Database Name description: Name of Postgres database (leave edb for default) value: 'edb' - name: DATABASE_USER displayName: Default database user (leave enterprisedb for default) description: Default database user value: 'enterprisedb' - name: REPL_USER displayName: Repl user description: repl database user value: 'repl' - name: PGPORT displayName: Database Port description: Database Port (leave 5444 for default) value: "5444" - name: LOCALEPARAMETER displayName: Locale description: Locale of database value: '' - name: CLEANUP_SCHEDULE displayName: Host Cleanup Schedule description: Standard cron schedule - min (0 - 59), hour (0 - 23), day of month (1 - 31), month (1 - 12), day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0). Leave it empty if you dont want to cleanup. value: '0:0:*:*:*' - name: EFM_EMAIL displayName: Email description: Email for EFM value: '[email protected]' - name: NAMESERVER displayName: Name Server for Email description: Name Server for Email value: '8.8.8.8' - name: PERSISTENT_VOLUME displayName: Persistent Volume description: Persistent volume name value: '' required: true - name: PERSISTENT_VOLUME_CLAIM displayName: Persistent Volume Claim description: Persistent volume claim name value: '' required: true - name: RESTORE_FILE displayName: Restore File description: Restore file location value: '' - name: ACCEPT_EULA displayName: Accept end-user license agreement (leave 'Yes' for default) description: Indicates whether user accepts the end-user license agreement value: 'Yes' required: true
Once you imported that into OpenShift (check here if you don’t know how to do that) you get a new template you can deploy from:
When you create a new deployment of that one (again, check here if you don’t know how to do that) you will notice several things when you login to the container once it is up and running:
dwe@dwe:~$ oc rsh edb-as10-0-1-gk8dt sh-4.2$ psql postgres psql.bin (10.3.8) Type "help" for help. postgres=# show work_mem; work_mem ---------- 12MB (1 row) postgres=# show shared_buffers ; shared_buffers ---------------- 56MB (1 row)
First of all and this is what we wanted: The PostgreSQL instance came up with the parameters we specified in the ConfigMap. When you look at the volumes present in the container there is a new one named after what we specified in the template:
sh-4.2$ df -h Filesystem Size Used Avail Use% Mounted on none 18G 4.0G 14G 24% / tmpfs 1002M 0 1002M 0% /dev tmpfs 1002M 0 1002M 0% /sys/fs/cgroup /dev/sda1 18G 4.0G 14G 24% /initconf shm 64M 12K 64M 1% /dev/shm tmpfs 1002M 16K 1002M 1% /run/secrets/kubernetes.io/serviceaccount
Inside that volume there is the postgresql.conf.in file we also specified in the template and that is linked to $PGDATA:
sh-4.2$ ls -la /initconf total 12 drwxrwsrwx 3 root 1000070000 4096 May 18 09:55 . drwxr-xr-x 85 root root 4096 May 18 09:55 .. drwxr-sr-x 2 root 1000070000 4096 May 18 09:55 ..2018_05_18_09_55_19.162613490 lrwxrwxrwx 1 root root 31 May 18 09:55 ..data -> ..2018_05_18_09_55_19.162613490 lrwxrwxrwx 1 root root 25 May 18 09:55 postgresql.conf.in -> ..data/postgresql.conf.in
And finally we can confirm the content of that file:
sh-4.2$ cat /initconf/postgresql.conf.in work_mem='12MB' shared_buffers='56MB'
You can do the same for pg_hba.conf by creating a new ConfigMap for pg_hba.conf.in. In the next post we’ll look at how EDB Failover Manager is configured inside the containers.