第14項 PostgreSQL容器的介紹
这篇文章是《2018年基于Kubernetes的PostgreSQL日历》的第14天。
昨天我们回顾了为期三天的会议“PGConf.Asia 2018”。
截至12/25的降临日历今天终于过了一半。
从今天开始,我们将恢复发布有关在Kubernetes上验证PostgreSQL的内容。
太长不看
-
- 公式のpostgresイメージを使って、コンフィグは外から与えるように設定するよ。
-
- データとアーカイブログは保存先を分けよう。
- Probe設定もわすれずに。
PostgreSQL的有状态集群(StatefulSet)配置
根据之前的讨论,我们在此次的Kubernetes上使用了StatefulSet来实施PostgreSQL。本次在Kubernetes上的PostgreSQL有以下要求。
-
- postgresql.confを外出しして、設定を自由に変えられること。
-
- アーカイブログモードで動くこと。
- 外部ディスクとして、データとアーカイブログの領域を分けること。
我将按照顺序记录实际使用的设置。请参阅完整的YAML文件。
图像的指定
首先是容器镜像,我使用的是Docker Hub上的Postgres官方镜像。
spec:
containers:
- name: pg-rook-sf
image: postgres:10.4
imagePullPolicy: "IfNotPresent"
PostgreSQL的版本是10.4,操作系统是基于Debian的。截至2018年,官方提供的容器映像为Debian和Alpine。
postgres配置文件的指定
在公式容器映像中,禁用了需要进行验证的归档日志模式设置。为了进一步定制日志输出,我提前创建了pg-rook-postgresql_conf.yaml文件。
archive_mode = on # enables archiving; off, on, or always
# (change requires restart)
archive_command = 'cp %p /mnt/postgresql/xlog/%f' # command to use to archive a logfile segment
# placeholders: %p = path of file to archive
# %f = file name only
archive_timeout = 60 # force a logfile segment switch after this
# number of seconds; 0 disables
为了在启动时从挂载此配置的ConfigMap中提供此配置,请给容器传递参数。
args:
- -c
- config_file=/etc/postgresql/postgresql.conf
通过上述配置,您可以以以下形式在文档中提供由ConfigMap指定的文件,并使用预期的参数启动PostgreSQL。
$ docker运行 -d –name some-postgres -v “$PWD/my-postgres.conf”:/etc/postgresql/postgresql.conf postgres -c ‘config_file=/etc/postgresql/postgresql.conf’。
PGDATA目录和时区设置
在公式容器映像中,可以使用环境变量“PGDATA”来指定PostgreSQL的数据目录。按照文档中所述,这将使数据目录成为挂载点的情况下使用。
这个可选的环境变量可以用来定义数据库文件的另一个位置,比如一个子目录。默认位置是/var/lib/postgresql/data,但如果你使用的数据卷是一个文件系统挂载点(比如GCE持久磁盘),Postgres initdb建议创建一个子目录(例如/var/lib/postgresql/data/pgdata)来存放数据。
如果不指定PGDATA,PostgreSQL无法启动,因为在本次的PostgreSQL on Rook配置中,挂载的位置是/var/lib/postgresql/data。
env:
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
- name: TZ
value: Asia/Tokyo
而且,在此之前,我不知道关于TimeZone的事情,但是容器的时间会遵循主机操作系统的时间。为了明确指定TimeZone,我使用了环境变量 TZ:Asia/Tokyo。
音量调节
根据之前的设置,在这个PostgreSQL容器中我们将挂载三个卷。
-
- PGDATA、PostgreSQLのデータ格納ディレクトリ。Cephのブロックデバイス。
-
- アーカイブログの保存先。Cephのブロックデバイス。
- postgresql.conf。ConfigMap。
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: pg-rook-vol
- mountPath: /mnt/postgresql/xlog
name: pg-rook-vol-xlog
- mountPath: /etc/postgresql
readOnly: true
name: postgres-conf
在设计数据库时,将数据和归档日志区域分开配置是理所当然的。虽然详细信息将在备份/还原的情况下进行确认,但恢复数据的区域和持续存储归档日志的区域具有不同的生命周期。
这次我们将Ceph的块设备挂载到数据和归档日志区域,但归档日志一侧并不一定需要是块设备。很多情况下,像NFS这样的文件存储已经足够了,所以我希望以后能进行修正。
然而,在这种设置下,出现问题的是/mnt/postgresql/xlog目录的权限,因为当以常规方式启动容器时,PostgreSQL容器会因为权限不足而无法进行写入。
为了避免这种情况,我们在本次中使用postStart来授予该目录的写入权限。
lifecycle:
postStart:
exec:
command:
- sh
- -c
- chmod a+w /mnt/postgresql/xlog/
如果提前准备好文件存储,这个问题应该能够避免。
探针的设置
最后是关于 liveness/readinessProbe 的设置。
在这里,我们针对 PostgreSQL 使用的 5432 端口进行了配置,通过 tcp socket 发送健康检查。
livenessProbe:
tcpSocket:
port: 5432
initialDelaySeconds: 10
periodSeconds: 3
timeoutSeconds: 3
failureThreshold: 2
readinessProbe:
tcpSocket:
port: 5432
initialDelaySeconds: 5
periodSeconds: 3
timeoutSeconds: 1
successThreshold: 1
然而,就像在Pod故障的情况下需要等待PostgreSQL恢复的情况一样,上述健康检查在这种情况下就没有意义了,因此似乎需要做一些修正。
总结
目前已经实现了基本的运行形式,但在归档博客和探针设置方面仍然需要进行许多修正。如果您想在Kubernetes上使用PostgreSQL,请根据这里的参考编写您自己的YAML文件。
请多关照。