Help us understand the problem. What is going on with this article?

#4 PostgreSQL on Kubernetesのインストール

More than 1 year has passed since last update.

本記事はPostgreSQL on Kubernetes Advent Calendar 2018の4日目です。
昨日は「"Rook" Up & Running」ということで、分散ストレージRookの環境を構築してみました。

既にお気付きの通り、今回のPostgreSQL on Kubernetes 2018(全部俺)はいわば連載モノです。
そのため、前回のように単発で見ると「PostgreSQL関係ないじゃん!」という回もあったりしますが、前後を通して見てみると何をしているのか理解して頂けるかと思います。

TL;DR

  • 公式のpostgresイメージを使って、Rook上にデータベースを構築してみる。
  • RookのStorageClassを使って、PVは動的に割り当てよう。

PostgreSQL on Kubernetesの構成

昨日は下図の下半分部分、Rookの環境構築をしてみました。
pg-rook-archi.PNG

本日は上半分のPostgreSQLのStatefulSetを構築していきます。
改めてKubernetesクラスタ内に以下の6ノードが必要です。

  • 2台のDBサーバ。Kubernetes上でラベルとして、type=node.db.postgres が付いていること
  • 3台のストレージサーバ。Kubernetes上でラベルとして、type=node.st.rook が付いていること
  • 1台のツール用サーバ。Kubernetes上でラベルとして、type=node.mon.bench が付いていること

PostgreSQLのインストール

#3でクローンしたものと同じリポジトリを使い、pg-rookのディレクトリに移動します。

$ cd ./postgres-on-k8s/postgres-install/pg-rook

ConfigMapの作成

今回は公式のPostgreSQLのDockerイメージを使っています。
リンク先にあるとおり、起動時の環境変数が設定できますがConfigMapで以下を指定してます。

  • POSTGRES_USER
  • POSTGRES_PASSWORD
  • POSTGRES_DB

さらにpostgresql.confを外部から与えるためにもう一つのConfigMap(pg-rook-postgresql_conf.yaml)を作成してあります。
では、2つのConfigMapを作成しましょう。

$ kubectl apply -f pg-rook-configmap.yaml
configmap/postgres-config created
$ kubectl apply -f pg-rook-postgresql_conf.yaml
configmap/postgres-conf configured

pg-rook-configmap.yamlはパスワードを含んでいますのでSecretsのほうが良いと思いますが、今回はお試しということで。

Persistent Volume Claimの作成

PostgreSQL on Rookの構成ではPersistent Volumeの作成はRookに任せるため、PVCでは第3回で作成したStorageClassを使います。
今回はデータディレクトリ(PGDATA)とアーカイブログ用のディレクトリを別のPVとして作成しています。

$ kubectl apply -f pg-rook-sf-pvc.yaml
persistentvolumeclaim/pvc-pg-rook-sf created
persistentvolumeclaim/pvc-pg-rook-sf-xlog created

$ kubectl get pvc
NAME                  STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
pvc-pg-rook-sf        Bound     pvc-bdbc6e53-f6e9-11e8-b0d9-02f062df6b48   3Gi        RWO            rook-ceph-block   14m
pvc-pg-rook-sf-xlog   Bound     pvc-bdbf23a5-f6e9-11e8-b0d9-02f062df6b48   2Gi        RWO            rook-ceph-block   14m

$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                          STORAGECLASS      REASON    AGE
pvc-bdbc6e53-f6e9-11e8-b0d9-02f062df6b48   3Gi        RWO            Delete           Bound     default/pvc-pg-rook-sf         rook-ceph-block             14m
pvc-bdbf23a5-f6e9-11e8-b0d9-02f062df6b48   2Gi        RWO            Delete           Bound     default/pvc-pg-rook-sf-xlog    rook-ceph-block             14m

StatefulSetの作成

最後にPostgreSQLのStatefulSetを作成します。
当構成ではPostgreSQLのReplicasは1のため、用いる意味はない気もするのですが、Headless Serviceも作成しておきます。

$ kubectl apply -f pg-rook-sf.yaml
statefulset.apps/pg-rook-sf created

$ kubectl apply -f pg-rook-sf-service.yaml
service/pg-rook-sf created

構築作業はこれでおしまいです。

何が構築されたか?

今回検証するPostgreSQL on RookはActive-Standby構成をStatefulSetで実現しようとしていますので、起動されるPostgreSQLのポッドは常に一つです。
また、PostgreSQLのバージョンは10.4を指定しています。

$ kubectl get sts,pod -o wide
NAME                          DESIRED   CURRENT   AGE       CONTAINERS   IMAGES
statefulset.apps/pg-rook-sf   1         1         40m       pg-rook-sf   postgres:10.4

NAME                           READY     STATUS    RESTARTS   AGE       IP           NODE
pod/pg-rook-sf-0               1/1       Running   0          40m       10.42.5.56   ip-172-31-15-204

さらにCeph側から見るとPVに対応したイメージが作成されていることも分かります。

$ kubectl exec -it -n rook-ceph rook-ceph-tools-57f88967f4-kvvkl rbd ls replicapool
pvc-bdbc6e53-f6e9-11e8-b0d9-02f062df6b48
pvc-bdbf23a5-f6e9-11e8-b0d9-02f062df6b48

$ kubectl exec -it -n rook-ceph rook-ceph-tools-57f88967f4-kvvkl rbd info replicapool/pvc-bdbc6e53-f6e9-11e8-b0d9-02f062df6b48
rbd image 'pvc-bdbc6e53-f6e9-11e8-b0d9-02f062df6b48':
        size 3 GiB in 768 objects
        order 22 (4 MiB objects)
        id: 115926b8b4567
        block_name_prefix: rbd_data.115926b8b4567
        format: 2
        features: layering
        op_features:
        flags:
        create_timestamp: Mon Dec  3 10:54:00 2018

rbd ls コマンドで表示されるのはイメージ名ですが、それが上でkubectl get pvで確認したVOLUME名と同じになっていますね。

まとめ

第3回で構築した分散ストレージの上にPostgreSQLをインストールしました。

今後の検証でCephのコマンドを使う機会も多くあるため、あえてRook/Cephレベルでの確認内容も多く取り入れてみましたがどうだったでしょうか。

明日以降はこれまでに構築したPostgreSQLに接続し、様々なユースケースを想定した操作を試していきます。
よろしくお願いします。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away