この記事について
この記事は分散データベース YugaByteDB を手元のKubernetesクラスタ(k8s)にインストールした際の手順をまとめます。
技術的にYugaByteDBのような分散DBに興味があり、触ってみるための環境を手に入れるためにインストールを行いました。
したがって、プロダクション環境のインストール手順ではないことをご承知おきください。
また、「YugaByteDBって何?」「何ができるの?」と言った内容は筆者もこれから勉強するので記載しません。
詳しい方の記事を読まれることをお勧めします。
環境
インストールした環境は基本的にはセルフマネージドk8sになります。
一般的なk8s環境であれば環境に依存する部分は少ないと思いますが、環境の詳細を以下に示します。
インストール環境の詳細
- 仮想マシン:
- AWS EC2 t3a.medium (マスター1台+ワーカー3台=4台)
- 2つのAvailability Zoneに2台ずつ配置(同一Region)
- OS:
- Ubuntu 18.04
- container runtime:
- Kubernetes:
- installed by kubeadm
- CNI Plugin: Weave Net
- v1.17.4
- StorageClass
- 筆者の環境ではRook Cephを使ってCephクラスターを構築しレプリケーションなしのRBDストレージを使用
YugaByteDB operator のインストール
YugabyteDB operatorについて
YugaByteDB公式のインストール手順 では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やPRも提出されているのでそのうち直ると思いますが、執筆時点では手元で修正する必要があります。
筆者の修正例も掲載しますが、PRの修正済みブランチからソースコードを取得するほうがよいでしょう。
筆者による修正例
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,
},
}
}
修正済みソースコードのルートディレクトリから build/Dockerfile
をビルドし、適当なコンテナレジストリに置きます。
CustomResourceDefinition(crd)をインストールします。
kubectl create -f deploy/crds/yugabyte_v1alpha1_ybcluster_crd.yaml
operatorをインストール時に修正したコンテナイメージを使用するためにマニフェストを修正します。
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などを必要に応じて修正しておきます。
kubectl create -f deploy/crds/yugabyte_v1alpha1_ybcluster_cr.yaml
YugaByteDB へのアクセス
公式の手順通りに ysqlsh
や ycqlsh
といった専用のツールでアクセス可能です。なおデフォルトではアクセスの認証情報以下の通りです。
- ユーザ名: postgres
- パスワード: なし
- パスワード認証を行わない
kubectl exec -it yb-tserver-0 /home/yugabyte/bin/ysqlsh -- -h yb-tserver-0 --echo-queries
kubectl exec -it yb-tserver-0 /home/yugabyte/bin/cqlsh yb-tserver-0
また、上記はYugaByteDBクラスタ内のPodからのアクセスですが、クラスタ外のPodからもアクセスできます。特にpsqlのようなPostgreSQL互換クライアントから以下のようにアクセス可能です。
kubectl run -it --rm --restart=Never --image=postgres psql -- psql -h yb-tservers -p 5433 -U postgres
パスワード認証は行わないので -W
オプションは不要です。
ポートが5433であることに注意すれば通常通り接続できます。
感想
インストールしただけだと普通のPostgreSQLですね。