YugaByteDBインストール(on k8s)

この記事について
================

この記事は分散データベース [YugaByteDB](https://www.yugabyte.com/yugabytedb/) を手元のKubernetesクラスタ(k8s)にインストールした際の手順をまとめます。

技術的にYugaByteDBのような分散DBに興味があり、触ってみるための環境を手に入れるためにインストールを行いました。
したがって、プロダクション環境のインストール手順ではないことをご承知おきください。

また、「YugaByteDBって何？」「何ができるの？」と言った内容は筆者もこれから勉強するので記載しません。
[詳しい方の記事](https://qiita.com/search?q=yugabytedb)を読まれることをお勧めします。



環境
====

インストールした環境は基本的にはセルフマネージドk8sになります。
一般的なk8s環境であれば環境に依存する部分は少ないと思いますが、環境の詳細を以下に示します。

<details>
<summary>インストール環境の詳細</summary>
<div>

- 仮想マシン:
    - AWS EC2 t3a.medium (マスター1台+ワーカー3台=4台)
    - 2つのAvailability Zoneに2台ずつ配置(同一Region)
- OS:
    - Ubuntu 18.04
- container runtime:
    - Docker CE
    - https://docs.docker.com/install/linux/docker-ce/ubuntu/
- Kubernetes:
    - installed by kubeadm
    - CNI Plugin: Weave Net
    - v1.17.4
    - StorageClass
        - 筆者の環境ではRook Cephを使ってCephクラスターを構築しレプリケーションなしのRBDストレージを使用
</div>
</details>

YugaByteDB operator のインストール
=================================

YugabyteDB operatorについて
---------------------------

YugaByteDB公式の[インストール手順](https://docs.yugabyte.com/latest/deploy/kubernetes/oss/) では4種類のインストール方法が選択できます。

- Helm Chart
- Operator
    - YugaByteDB operator
    - Operator Hub
    - Rook operator

Helmは基本的にインストール時の静的なマニフェストをテンプレートから生成するものです。
一方でOperatorはそれ自体k8s上のアプリケーションとして稼働して、今回の場合で言えばYugaByteDBのようなリソースを管理してくれます。
Operatorのほうが任せられることが多いですが、何をしてくれるかはOperatorの作りによります。
開発者がアプリケーションの知識を詰め込める（＝自分でやることが少ない）だろうと想定してOperatorを使用しましたが、後述の通りOperator実装に問題があり、修正することになりました。ただ、自分の簡単な修正だけできちんと動いているので基本的な実装には問題ないようです。

また、Operatorの中でもYugaByteDB operatorを選んだのはドキュメントの
> This operator currently provides more configuration options as compared to the Rook operator.

という一文を信じてのことです。


インストール
------------

先にも書きましたが、現在リリースされているYugaByteDB operatorには問題があります。
既存のoperatorを使うとYBClusterリソースのstorageClassの設定値が実際に作成されるリソースに反映されません。
すでに[issue](https://github.com/yugabyte/yugabyte-operator/issues/4)や[PR](https://github.com/yugabyte/yugabyte-operator/pull/6)も提出されているのでそのうち直ると思いますが、執筆時点では手元で修正する必要があります。
筆者の修正例も掲載しますが、PRの[修正済みブランチ](https://github.com/svanellewee/yugabyte-operator/tree/storageclass-mods)からソースコードを取得するほうがよいでしょう。

<details>
<summary>筆者による修正例</summary>
<div>

```diff
diff --git a/pkg/controller/ybcluster/ybcluster_create_controller.go
 b/pkg/controller/ybcluster/ybcluster_create_controller.go
index 07d0677..b3c0a78 100644
--- a/pkg/controller/ybcluster/ybcluster_create_controller.go
+++ b/pkg/controller/ybcluster/ybcluster_create_controller.go
@@ -229,6 +229,7 @@ func createStatefulSet(cluster *yugabytev1alpha1.YBCluster, isTServerStatefulset
 func getVolumeClaimTemplates(storageSpec *yugabytev1alpha1.YBStorageSpec) *[]corev1.PersistentVolumeClaim {
        volumeClaimTemplates := make([]corev1.PersistentVolumeClaim, storageSpec.Count)
        for i := 0; i < int(storageSpec.Count); i++ {
+               storageClassName := storageSpec.StorageClass
                volumeClaimTemplates[i] = corev1.PersistentVolumeClaim{
                        ObjectMeta: metav1.ObjectMeta{
                                Name: fmt.Sprintf("%s%d", volumeMountName, i),
@@ -240,6 +241,7 @@ func getVolumeClaimTemplates(storageSpec *yugabytev1alpha1.YBStorageSpec) *[]cor
                                                corev1.ResourceStorage: resource.MustParse(storageSpec.Size),
                                        },
                                },
+                               StorageClassName: &storageClassName,
                        },
                }
        }
```
</div>
</details>

修正済みソースコードのルートディレクトリから `build/Dockerfile` をビルドし、適当なコンテナレジストリに置きます。

CustomResourceDefinition(crd)をインストールします。

```shell
kubectl create -f deploy/crds/yugabyte_v1alpha1_ybcluster_crd.yaml
```

operatorをインストール時に修正したコンテナイメージを使用するためにマニフェストを修正します。

```diff
diff --git a/deploy/operator.yaml b/deploy/operator.yaml
index 53d8eea..0e762d7 100644
--- a/deploy/operator.yaml
+++ b/deploy/operator.yaml
@@ -104,7 +104,7 @@ spec:
       containers:
         - name: yugabyte-k8s-operator
           # Replace this with the built image name
-          image: quay.io/yugabyte/yugabytedb-operator
+          image: uri.example.com/to/your/operator/repository
           command:
             - yugabyte-k8s-operator
           imagePullPolicy: Always
```

YugaByteDB のインストール
=========================

公式の手順通り行いますが、StorageClassなどを必要に応じて修正しておきます。

```shell
kubectl create -f deploy/crds/yugabyte_v1alpha1_ybcluster_cr.yaml
```

YugaByteDB へのアクセス
=======================

公式の手順通りに `ysqlsh` や `ycqlsh` といった専用のツールでアクセス可能です。なおデフォルトではアクセスの認証情報以下の通りです。

- ユーザ名: postgres
- パスワード: なし
    - パスワード認証を行わない

```shell
kubectl exec -it yb-tserver-0 /home/yugabyte/bin/ysqlsh -- -h yb-tserver-0 --echo-queries
```
```shell
kubectl exec -it yb-tserver-0 /home/yugabyte/bin/cqlsh yb-tserver-0
```

また、上記はYugaByteDBクラスタ内のPodからのアクセスですが、クラスタ外のPodからもアクセスできます。特にpsqlのようなPostgreSQL互換クライアントから以下のようにアクセス可能です。

```shell
kubectl run -it --rm --restart=Never --image=postgres psql -- psql -h yb-tservers -p 5433 -U postgres
```

パスワード認証は行わないので `-W` オプションは不要です。

ポートが5433であることに注意すれば通常通り接続できます。


感想
====

インストールしただけだと普通のPostgreSQLですね。