PostgreSQL Operator on Kubernetes

業務でKubernetes環境にPostgreSQLをインストールする機会がありました。
色々調べてみると、Operator(以下参考)というものを利用すると学習コストの高い
scaling, failover, backup等を自動化できるとのことなので試してみました。
- [Kubernetes Operator](https://qiita.com/shotat/items/4a60083fd20d11936860)

# PostgreSQL Operator
今回は[crunchyData](https://access.crunchydata.com/documentation/postgres-operator/latest/)のPostgreSQL Operatorを採用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271464/2b49412d-a6af-c1a1-6b39-0520b2f9b70d.png)




# 構成
- Kubernetes：v1.15
- crunchyData PostgreSQL Operator：v4.2.2
- 作業端末(クライアント)のOS：`centOS7.5`
- ansible：v2.9.2
- git：https://github.com/CrunchyData/postgres-operator.git

# 前提条件
- `clusterRole`の追加権限をもつKubernetes環境(クラスタ管理者であればOK)
- ansible2.5以上インストール済
- gitインストール済

# 設定
gitからPostgreSQL Operatorをインストールするプレイブックをダウンロード

```
git clone https://github.com/CrunchyData/postgres-operator.git
cd postgres-operator
git checkout v4.2.2 # 任意のバージョンに変更可能
cd ansible
```

# 環境に応じてinventoryファイルを修正
### kubernetesクラスタ名を取得

```
kubectl config current-context
<clustername>
```



### inventoryファイルに追記
```
vi inventory
--
kubernetes_context="clustername" # Kubernetesクラスタ名
pgo_admin_password="XXXXXXX" # 任意のパスワード
backrest_storage='rook'  # デフォルトのストレージを設定
backup_storage='rook'
primary_storage='rook'
replica_storage='rook'
```
※ストレージの設定方法については別記事にて設定方法記載します
本環境ではrook-cephによるBlockストレージを採用していましたので`rook`と記載しております。

# mainファイルの修正(ハマりどころ)
環境によって差異があるかもしれませんが、自分の場合、
インストール実行中に`task:DownLoad PGO Linux Client`にてエラーが発生したため、
`~./postgres-operator/ansible/roles/pgo-operator/tasks/main.yaml`を下記に修正

```
~
- name: DownLoad PGO Linux Client
    become: yes
    become_method: sudo
    become_user: <username> # ←この行追加(作業ユーザ名を記載)
~
```

# Operator インストール
ansibleディレクトリにいることを確認して下記コマンドを実行してoperatorをインストール
kubernetesクラスタによっては数分かかる場合があります。

```
ansible-playbook -i inventory --tags=install main.yml
```

### pgoクライアントの設定
PostgreSQL Operatorのインストール中に、pgoコマンドラインを利用できるようにするため
下記コマンドを実行して環境変数を設定します。

```
cat <<EOF >> ~/.bashrc
export PGOUSER="${HOME?}/.pgo/pgo/pgouser"
export PGO_CA_CERT="${HOME?}/.pgo/pgo/client.crt"
export PGO_CLIENT_CERT="${HOME?}/.pgo/pgo/client.crt"
export PGO_CLIENT_KEY="${HOME?}/.pgo/pgo/client.pem"
export PGO_APISERVER_URL='https://127.0.0.1:8443'
export PGO_NAMESPACE=pgouser1
EOF

source ~/.bashrc
```
※macOSの場合、~/.bash_profile

# 確認
ansibleプレイブックのインストールが完了したら確認します。
下記コマンドでOperatorのpodが立っていることがわかります。

```
kubectl -n pgo get deployments
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
postgres-operator   1/1     1            1           2m

kubectl -n pgo get pods
NAME                                READY   STATUS    RESTARTS   AGE
postgres-operator-56d6ccb97-tmz7m   4/4     Running   0          3m
```

pgoコマンドラインが実行できるか確認してみます。
新しいコンソールウィンドウで、次のコマンドを実行して簡易的にAPIアクセスするためポートフォワードします。

```
kubectl -n pgo port-forward svc/postgres-operator 8443:8443
```

元のコンソールからバージョン確認コマンドを実行します。
```
pgo version
```

次のような結果が出力されれば成功です。

```
pgo client version 4.2.2
pgo-apiserver version 4.2.2
```

# PostgreSQLクラスタ構築
次のようなコマンドで簡単にkubernetesにPostgreSQLをデプロイすることができます。

```
pgo create cluster -n pgouser1 hippo
```


# まとめ

今回はKubernetesにPostgretSQL Operatorをインストールする手順について紹介しました。
operatorを利用すれば冗長構成、プーリング、ストレージ容量等コマンドラインで設定も可能ですので、
用途にあったPostgreSQL環境が容易に構築できます。
また、バックアップの作成やリストアもpgoコマンドで簡単に実行できます。
ぜひ試してみてください。