#5 pgadminから接続してみる

本記事は[PostgreSQL on Kubernetes Advent Calendar 2018](https://qiita.com/advent-calendar/2018/postgresonk8s)の5日目です。
昨日は「[PostgreSQL on Kubernetesのインストール](https://qiita.com/tzkoba/private/56fdc60126d4b2350ad5)」ということで、Rook上にPostgreSQLを構築し、KubernetesレベルやCephレベルで構築状況を確認しました。

本日は以下のツールを同じKubernetesクラスタ内に構築し、実際にデータベースとしての操作を試していきます。

+ pgadmin （PostgreSQLの定番GUIツール）
+ pgbench （PostgreSQLのベンチマークツール）

# TL;DR

+ PostgreSQLの定番管理ツールpgadminをKubernetes内で使ってみよう。
+ クラスタ内のPostgreSQLにはサービス名で接続できるよ。
+ ユーザとデータベースもGUIで楽々作成。


# 必要な構成
これまで述べた構成と同様ですが、pgadminとpgbenchを同梱したポッドを以下のツール用サーバに導入します。

+ 1台のツール用サーバ。Kubernetes上でラベルとして、type=node.mon.bench が付いていること

# pgtoolsの導入
[#3](https://qiita.com/tzkoba/private/0c2d6f92bc18c6549117#up--running)でクローンしたものと同じリポジトリを使い、pgtoolsのディレクトリに移動します。

```
$ cd ./postgres-on-k8s/postgres-install/bench-tools
```

pgtoolsをデプロイして確認します。

```
$ kubectl apply -f pgtools.yaml
deployment.apps/pgtools created
service/pgadmin4-nodeport created

$ kubectl get deployment -o wide
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS         IMAGES                                  SELECTOR
pgtools   1         1         1            1           2m        pgbench,pgadmin4   tzkoba/pgbench:0.1,dpage/pgadmin4:3.3   app=pgtools
```

pgtoolsの1ポッドにpgbenchとpgadmin4の2つのコンテナが入っていることが分かりますね。

pgadmin4は[こちら](https://hub.docker.com/r/dpage/pgadmin4/)のDockerイメージを使っています。
pgbenchは今回のためにCentOSのイメージにPostgreSQL 10のクライアントをインストールしたものを利用しています。

### pgadminを使ってみる
今回はpgadmin用にNodePortのサービスを構築していますので、まずはそのポートを確認しましょう。

```
$ kubectl get svc
NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
pgadmin4-nodeport   NodePort    10.43.207.114   <none>        80:32273/TCP   8m
```

ここでは32273となっているので、*http://サーバのグローバルIP:32273* で接続するとログイン画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54853/81695a5e-2514-6da3-a598-79f39db4b24a.png)

ログイン時の「Email Address」と「Passwordはpgtools.yaml内に環境変数として設定されているので、お好みに応じて修正をして下さい（初期値はいずれもpgadmin）。

では、第4回に構築したPostgreSQLのデータベースに接続しましょう。
pgadminログイン後の画面で左上の「Servers」を右クリックし、「Create」-「Server」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54853/8d00927d-f32b-a8e0-0ff7-a35a708ddf89.png)

DB接続用のプロパティを以下のように入力し、「Save」で設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54853/c769a885-b557-16d2-4345-2b011a6b30d3.png)

以下の3つは第4回の構築時に使用したpg-rook-configmap.yamlの値と同じにする必要があります。

+ Maintenance daatabase
+ Username
+ Password

そして、ここではホスト名に **pg-rook-sf.default.svc** を指定していることにも注目です。
Kubernetes内ではサービス名により名前解決ができるようになっており、[サービス名].[名前空間].[svc]で今回構築したデータベースにアクセスできます。
（今回はStatefulSetを使っており、Headless Serviceによるポッド名での名前解決も出来ますが、その説明は別の機会に。）

### ユーザとデータベースを作ってみる
次回以降ではpgbenchを使いますので、その準備として以下を構築しておきます。

+ benchユーザ
+ benchデータベース

まずはユーザを作ります。
先ほどのpg-rook-sfへの接続をSaveしていれば、そのままデータベースに接続されているはずです。
その状態で「pg-rook-sf」-「Login/Group Roles」-「Create」-「Login/GroupRole...」と辿ってクリックして下さい。
![pgadmin-create-user.PNG](https://qiita-image-store.s3.amazonaws.com/0/54853/fd76b388-9c4e-2cdd-b280-04d9eea01a46.png)

ユーザ作成画面が開きますので、「Name」をbenchとして下さい。「Definition」にパスワード設定欄がありますので、こちらはご自由に。
![pgadmin-setting-user1.PNG](https://qiita-image-store.s3.amazonaws.com/0/54853/1fcf06a9-dd83-bb78-cf6d-b91c63d428e7.png)

もう一つ、「Privileges」タブの「Can login?」をONにしておかないとログインできないのでここも設定しておきます。「Save」を忘れずに。
![pgadmin-setting-user2.PNG](https://qiita-image-store.s3.amazonaws.com/0/54853/d83c3ed4-09af-93d8-dd31-0fe6fa68c53e.png)

ユーザが出来たら、次はデータベースの作成です。
「pg-rook-sf」-「Databases」-「Create」-「Database...」と辿ってクリックして下さい。
![pgadmin-create-database.PNG](https://qiita-image-store.s3.amazonaws.com/0/54853/f7677a8e-38d6-ae47-1a2e-64502a3b8cad.png)

以下の入力画面で「Database」をbench、「Owner」もbenchとしたら「Save」で完了です。
![pgadmin-create-database2.PNG](https://qiita-image-store.s3.amazonaws.com/0/54853/991b7a5e-5bac-2690-f0ca-42ad448bf580.png)


# まとめ
今回はpgtoolsを導入し、GUI管理ツールであるpgadmin4をコンテナとしてKubernetesクラスタ内に構築してみました。
このあたりが公開されているDockerイメージから簡単にできるのも、PostgreSQL on Kubernetes構成のメリットといえますね。

次回は本日までの準備を踏まえて、pgbenchの使い方を紹介しようと思います。

よろしくお願いします。