概要
PostgreSQL Operator は Postgres を k8s 上で簡単に構築/運用するための CustomResource を使ったオーケストレーションツールです 今回は PostgreSQL Operator を使って Postgres の構築を行ってみました
環境
- k8s v1.20.1
- helm v3.5.2
- PostgreSQL Operator 1.6.3
PostgreSQL Operator のデプロイ
helm を使うと簡単です kustomize やマニフェストからデプロイする方法もありますが今回は helm を使います
- git clone https://github.com/zalando/postgres-operator.git
- cd postgres-operator
- helm install postgres-operator ./charts/postgres-operator
最新版が Artifacthub で公開されてはいないので Github から直接チャートを展開します 以下のように Operator が展開されれば OK です まだこの時点では PostgreSQL サーバ自体はありません
- kubectl get pod -l app.kubernetes.io/name=postgres-operator
NAME READY STATUS RESTARTS AGE
postgres-operator-88f7975df-tgf77 1/1 Running 0 85s
PostgreSQL Operator UI のデプロイ
Operator には管理用の UI があり PostgreSQL の構築や管理を UI から行うことができます
- helm install postgres-operator-ui ./charts/postgres-operator-ui
Pod がデプロイできれば OK です
- kubectl get pod -l app.kubernetes.io/name=postgres-operator-ui
デフォルトだと外部からアクセスできないようになっているので Service を編集して NodePort に変更します
- kubectl edit svc postgres-operator-ui
type: NodePort
Service の NodePort は適宜変更してください
http://node_ip:30595/#new
で Operator の管理 UI にアクセスできます
PostgreSQL サーバの構築
管理 UI から行ってみます 先程の URL にアクセスすると PostgreSQL を作成するためのフォームが表示されます
Name や Users など好きな情報を入力して作成しましょう なお後で紹介しますが Operator 経由の PostgreSQL の構築では好きなユーザは作成できますが好きなユーザに好きなパスワードを設定することはできません 基本的には Operator が自動で生成します
作成中になるとステータスもちゃんと表示されています 完了するまで待ちましょう
作成が完了すると以下のように PostgreSQL が作成されます
- kubectl get all -l team=acid
NAME READY STATUS RESTARTS AGE
pod/acid-test-0 1/1 Running 0 12m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/acid-test ClusterIP 10.107.79.204 <none> 5432/TCP 12m
service/acid-test-repl ClusterIP 10.107.39.37 <none> 5432/TCP 12m
NAME READY AGE
statefulset.apps/acid-test 1/1 12m
NAME TEAM VERSION PODS VOLUME CPU-REQUEST MEMORY-REQUEST AGE STATUS
postgresql.acid.zalan.do/acid-test acid 13 1 10Gi 100m 100Mi 12m Running
構成を変更して NodePort からアクセスできるようにしてみる
デプロイした PostgreSQL の構成も管理 UI から変更できます
作成したクラスタの「Edit」を選択すると以下のような編集画面になります
外部からアクセスできるようにするためには「enableConnectionPooler」「enableMasterLoadBalancer」「enableReplicaLoadBalancer」を true にします
下にある「Apply」をクリックすれば PostgreSQL クラスタの再構築が行われます 完了すると以下のように外部からアクセスできるようになっています
- kubectl get svc -l team=acid
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
acid-test LoadBalancer 10.107.79.204 <pending> 5432:31815/TCP 18m
acid-test-repl LoadBalancer 10.107.39.37 <pending> 5432:30569/TCP 18m
アクセスする
パスワードはシークレットから取得します あとは公開したノードの IP とポートを使って postgres ユーザでアクセスできるか確認してみましょう
- export PGPASSWORD=$(kubectl get secret postgres.acid-test.credentials.postgresql.acid.zalan.do -o ‘jsonpath={.data.password}’ | base64 -d)
- psql -U postgres -p 31815 -h node_ip postgres
基本的な使い方はこんな感じです 今回は UI でデプロイしましたがマニフェストも UI が自動生成してくれるのでマニフェストでデプロイしたい場合でも簡単です
おまけ: ユーザの好きなパスワードは設定できない
過去に紹介した bitnami の PostgreSQL helm chart を使うとユーザのパスワードを設定できます Operator でもできないかなと思い色々試したのですがダメでした 一応試した方法を紹介します (参考)
やった方法としては
- secret を事前に登録
- マニフェストでユーザのロールを指定
です
- vim secret.yaml
apiVersion: v1
data:
password: YXNkZmdoamtsCg==
username: cHJhZWZlY3Q=
kind: Secret
metadata:
labels:
application: spilo
cluster-name: acid-gitlab
team: acid
name: praefect.acid-gitlab.credentials.postgresql.acid.zalan.do
namespace: default
type: Opaque
kubectl apply -f ./secret.yaml
マニフェストをデプロイすると Operator 自動で secret を作成してしまうので事前に登録しておきました
そしてその後で Operator を使ってマニフェストからデプロイします
- vim postgres.yaml
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
labels:
team: acid
name: acid-gitlab
namespace: default
spec:
allowedSourceRanges: null
databases:
praefect: praefect
enableConnectionPooler: true
enableMasterLoadBalancer: true
enableReplicaLoadBalancer: true
numberOfInstances: 1
postgresql:
version: '13'
resources:
limits:
cpu: 500m
memory: 500Mi
requests:
cpu: 100m
memory: 100Mi
teamId: acid
users:
praefect:
- superuser
- login
- createrole
- createdb
volume:
size: 10Gi
- kubectl apply -f ./postgres.yaml
これで事前に作成した secret のパスワードを使って psql コマンドでログインしようとしてみましたがダメでした
あくまでも secret は外部からパスワードを確認する方法のようで PostgreSQL の内部では自動生成されたパスワードを使ってユーザの作成が行われているようです
最後に
バックアップやバージョンアップも簡単にできるので簡易 RDS みたいに使えます
UI があるのはかなり便利かなと思います
0 件のコメント:
コメントを投稿