はじめに
説明
Cloud Native PostgreSQLとはEDB社の提供しているPostgreSQLのKubernates Operatorになります。
Kubernates Operatorを初耳の方も多いと思いますが、一言で申しますとクラスタ管理・構築ツールになります。
PostgreSQLのKubernates Operatorはいくつか存在しており、Cloud Native PostgreSQLはその1つとなります。
本投稿では何回かに渡ってCloud Native PostgreSQLについて環境ごとの初期構築や使い方などを説明していく予定です。
Kubernatesを触ったことのない方を対象に想定しております。
構築所要時間
1時間前後となります。
慣れている方は30分程度です。
kubectlをインストール
途中で必要なのでまずkubectlをインストールします
https://kubernetes.io/ja/docs/tasks/run-application/force-delete-stateful-set-pod/
minikubeをインストール
今回はEDB DocsにもあるKubernatesディストリビューションの1つminikubeをローカル環境に構築していきます。
マニュアルにない注意点なども記載していきます。
公式のインストール方法は下記にございます。
https://minikube.sigs.k8s.io/docs/start/
先に注意点としましてはminikube start前に2点認識ください
- minikubeのメモリ初期値である2Gでは環境によって不足することがあります
- 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公式サイトに添って、
コードブロックを実行していけば進められるかと存じます。
https://www.enterprisedb.com/docs/kubernetes/cloud_native_postgresql/interactive_demo/
また、日本語マニュアルもEDB Japanにアカウント登録することで日本語マニュアルより入手できます。
Cloud Native PostgreSQLへの接続準備
Cloud Native PostgreSQLへの接続は主に3つあるかと存じますが
- 新しくpsql用のPodを起動して接続
- EDBのPodに直接ログイン
- Kubernates外から接続するできるようにして、別の環境から接続
今回は応用の利きやすい3を説明したいと思います。
EDB公式サイトでは下記で説明されておりますが
多少、minikube1.19.0以降は修正が必要なようですので個別に記載します。
https://www.enterprisedb.com/docs/kubernetes/cloud_native_postgresql/expose_pg_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に接続するまでを記載しました。
次回はスーパーユーザの接続など記載する予定です。
ここまでお読みいただき、ありがとうございました!