2021年6月12日土曜日

k8s で PostgreSQL Operator を試してみた (Zalando編)

k8s で PostgreSQL Operator を試してみた (Zalando編)

概要

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 を使います

最新版が Artifacthub で公開されてはいないので Github から直接チャートを展開します 以下のように Operator が展開されれば OK です まだこの時点では PostgreSQL サーバ自体はありません

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 です

デフォルトだと外部からアクセスできないようになっているので 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 ユーザでアクセスできるか確認してみましょう

基本的な使い方はこんな感じです 今回は 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 件のコメント:

コメントを投稿