Cloud Native PostgreSQLを構築してログインしてみよう

はじめに

説明

Cloud Native PostgreSQLとはEDB社の提供しているPostgreSQLのKubernates Operatorになります。

Kubernates Operatorを初耳の方も多いと思いますが、一言で申しますとクラスタ管理・構築ツールになります。

PostgreSQLのKubernates Operatorはいくつか存在しており、Cloud Native PostgreSQLはその1つとなります。

本投稿では何回かに渡ってCloud Native PostgreSQLについて環境ごとの初期構築や使い方などを説明していく予定です。

Kubernatesを触ったことのない方を対象に想定しております。

構築所要時間

1時間前後となります。

慣れている方は30分程度です。

kubectlをインストール

途中で必要なのでまずkubectlをインストールします

StatefulSet Podの強制削除
このページでは、StatefulSetの一部であるPodを削除する方法と、削除する際に考慮すべき事項について説明します。始める前に これはかなり高度なタスクであり、StatefulSetに固有のいくつかの特性に反する可能性があります。 先に...

minikubeをインストール

今回はEDB DocsにもあるKubernatesディストリビューションの1つminikubeをローカル環境に構築していきます。

マニュアルにない注意点なども記載していきます。

公式のインストール方法は下記にございます。

minikube start
minikube is local Kubernetes

先に注意点としましてはminikube start前に2点認識ください

  1. minikubeのメモリ初期値である2Gでは環境によって不足することがあります
  2. Ingressを使用するためMacであればHyperkitなどドライバ切り替えが途中で要求され、再構築になることがございます
$ minikube config get memory 4096

(Linux) minikube config set vm-driver kvm2
(Mac) minikube config set vm-driver hyperkit
(Windows) minikube config set vm-driver hyperv

Cloud Native PostgreSQLの構築

インストール後の構築については下記にございます。

初期設定は下記EDB公式サイトに添って、

コードブロックを実行していけば進められるかと存じます。

EDB Postgres for Kubernetes v1 - Installation, Configuration and Deployment Demo
Walk through the process of installing, configuring and deploying the EDB Postgres for Kubernetes Operator via a browser...

また、日本語マニュアルもEDB Japanにアカウント登録することで日本語マニュアルより入手できます。

エンタープライズDB (EDB) ジャパンブログ
Postgresの最大活用を支援するEDB日本支社公式ブログサイト

Cloud Native PostgreSQLへの接続準備

Cloud Native PostgreSQLへの接続は主に3つあるかと存じますが

  1. 新しくpsql用のPodを起動して接続
  2. EDBのPodに直接ログイン
  3. Kubernates外から接続するできるようにして、別の環境から接続

今回は応用の利きやすい3を説明したいと思います。

EDB公式サイトでは下記で説明されておりますが

多少、minikube1.19.0以降は修正が必要なようですので個別に記載します。

EDB Postgres for Kubernetes v1 - Exposing Postgres Services

Ingressの有効

Ingressを有効にします。

$ minikube addons enable ingress

Podが新しく起動していることを確認します。
namespaceが1.19.0以降変更になっております。

$ kubectl get pods -n ingress-nginx

NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-ckgpj 0/1 Completed 0 1m
ingress-nginx-admission-patch-585xt 0/1 Completed 0 1m
ingress-nginx-controller-5d88495688-b4s8m 1/1 Running 0 1m

exposeの設定

こちらはlabelsとselectorから不要と思われる箇所を削除し、読み込み専用ポートを追加。

Windowsの方は最初の—からEOFの手前までをexpose.yamlとして保存ください。

$ cat <<EOF > expose.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  5432: default/cluster-example-rw:5432
  5433: default/cluster-example-ro:5432

---
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
    - name: pgrw
      port: 5432
      targetPort: 5432
      protocol: TCP
    - name: pgro
      port: 5433
      targetPort: 5433
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
EOF

yamlを適応します。

$ kubectl apply -f expose.yaml

deplopoymentsの修正

こちらはnameを修正し、読み込み専用ポートを追加しております

$ cat <<EOF > patch.yaml
---
spec:
  template:
    spec:
      containers:
      - name: controller
        ports:
        - name: pgrw
          containerPort: 5432
          hostPort: 5432
          protocol: TCP
        ports:
        - name: pgro
          containerPort: 5433
          hostPort: 5433
          protocol: TCP
EOF

yamlを適応します

$ kubectl patch deployment ingress-nginx-controller --patch "$(cat patch.yaml)" -n ingress-nginx

Cloud Native PostgreSQLへの接続

接続情報収集

このままではEXTERNAL-IPがpendingで接続できません

$ kubectl get svc -n ingress-nginx

下記コマンドで通信できるようにします。なお、実行し続ける必要があります

$ minikube tunnel

別のウィンドウを開いてEXTERNAL-IPを確認

$ kubectl get svc -n ingress-nginx

まだ接続パスワードが不明なので下記コマンドを実行します。

かなり長いパスワードが表示されます。また、最後に%があった場合%の前までです。

Windowsの場合はbase64をcertutilコマンドに変更する必要があるかもしれません。

$ kubectl get secret cluster-example-app -o jsonpath='{.data.password}' | base64 --decode

スーパーユーザのパスワードは下記コマンドで調べます

 $ kubectl get secret cluster-example-superuser -o jsonpath='{.data.password}' | base64 --decode

接続

まず書き込み可能なPostgreSQLに接続します。

指定していない場合、Userにapp、DBにappが作成されております。

$ psql -U app -h <EXTERNAL-IP> app

読み込み専用PortにPostgreSQLに接続します

$ psql -U app -h <EXTERNAL-IP> -p 5433 app

スーパーユーザの場合は下記コマンドになります

$ psql -U postgres -h <EXTERNAL-IP> app

構成図

わかりにくい接続を図にすると下記になります。

IPアドレスやポートは起動の度に異なる箇所もございます。

接続推測図

下記コマンド結果を参考に記載しております

$ kubectl get svc -A
NAMESPACE                    NAME                                  TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                                     AGE
default                      cluster-example-any                   ClusterIP      10.110.159.226   <none>         5432/TCP                                    45h
default                      cluster-example-r                     ClusterIP      10.105.101.165   <none>         5432/TCP                                    45h
default                      cluster-example-ro                    ClusterIP      10.107.255.160   <none>         5432/TCP                                    45h
default                      cluster-example-rw                    ClusterIP      10.105.19.82     <none>         5432/TCP                                    45h
default                      kubernetes                            ClusterIP      10.96.0.1        <none>         443/TCP                                     45h
ingress-nginx                ingress-nginx                         LoadBalancer   10.96.59.237     10.96.59.237   80:32287/TCP,443:31506/TCP,5432:30939,5433:30866/TCP   45h
ingress-nginx                ingress-nginx-controller              NodePort       10.99.21.103     <none>         80:32624/TCP,443:32432/TCP                  45h
ingress-nginx                ingress-nginx-controller-admission    ClusterIP      10.106.161.250   <none>         443/TCP                                     45h

あとがき

今回は初連載ということでCloud Native PostgreSQLに接続するまでを記載しました。

次回はスーパーユーザの接続など記載する予定です。


ここまでお読みいただき、ありがとうございました!