第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文件。

请多关照。

广告
将在 10 秒后关闭
bannerAds