なぜやるか?
現在の状態,
dbはk8sに乗っている.安全のために(maybe)外部に公開していない->loadbalancerを使わずにClusterIPを設定している.
ただ開発者はDBの中身を見たいときがあるだろう.
そこでweb経由で見ることができるGUIをし設定してあげたい
どうやるか?
pgwebをk8sに乗っけてこれにIngressを付けることにより問題の解決をはかる
- pgwebとは?
- pgwebをdockerで動かす
- k8sに乗っける
pgwebとは?
golangで書かれた管理インタフェース(だと思っている)
クエリの結果をCSV,JSON,XMLに吐き出すことができる,そしてクエリの履歴を保存している.
画像のようにとてもシンプルなUI(一目惚れした)
シンプルなUIである
pgwebをdockerで動かす
「pgweb docker hub」で調べた感じあまりいいimageが中ってので自分で作成する
FROM alpine:latest as build
ADD https://github.com/sosedoff/pgweb/releases/download/v0.9.12/pgweb_linux_amd64.zip ./
RUN apk add unzip && unzip pgweb_linux_amd64.zip
FROM alpine:latest
COPY --from=build ./ ./app
EXPOSE 8080
CMD [ "./app/pgweb_linux_amd64", "--sessions" ,"--bind=0.0.0.0", "--listen=8080" ]
少し解説すると
ADDでpgwebのzipをダウンロードして,それをunzipで解凍する
このままではunzipが邪魔なのでCOPY --from=buildを使用することでimageサイズを小さくしている.
これで私の環境では16 MBに抑えることができた.
k8sに乗っける
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: pgweb
spec:
replicas: 1
template:
metadata:
labels:
app: pgweb
spec:
containers:
- name: pgweb
image: pgweb:latest
imagePullPolicy: Always
ports:
- containerPort: 8080
imageのところは自分が作成したimageの名前を設定してあげると動くだろう
尚,我々が使用するときは.gitlabのレジストリにdocker imageを持たせているため
最終行に
imagePullSecrets:
- name: gitlab
が必要になる,またimageではgitlab registryに設定しているimageの名前が必要になる
次にserviceを定義していく
apiVersion: v1
kind: Service
metadata:
name: pgweb-svc
spec:
type: NodePort
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: pgweb
selectorを使用して先ほどのdeploymentを設定する
次にingressを設定する.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: postgres-web-ing
spec:
backend:
serviceName: pgweb-svc
servicePort: 8080
必要最低限これで動くと思う.
実際にはこれにnamespaceとか,ingresだとドメインとtlsの設定とかをやった方が良いと思う.....
これが成功するとglobalIPが設定される
まとめ
pgwebのUIはシンプルでかっこいい
開発者はDBの中身を見たいときpgweb経由で見ることができる
ちなみにk8sに乗っているDBにアクセスしたいときは
HOSTを
[サービス名].[ネームスペース名].svc.cluster.local
に設定するとつながってくれるはず
これには問題が一つあり,今の状態だとDBが外部に露出してないので
マイグレーションができないということだ.解決する手段として二つ考えた
- DBを外部にさらす
- GCPのポートフォワード機能を使う
一つ目は外部にさらすのは少し怖い
二つ目はGCPしかできないという問題がある
また解決案を考えるとする
ありがとうございました.