Kubernetes の永続ストレージとして DRBD を使用


DRBD を Kubernetes で使用する FlexVolume プラグインというのは以前からありますが、最近は LINSTOR 経由で使用するプラグインも公開されましたので紹介します。

LINSTOR External Provisioner というのがボリュームの作成と削除を行い、LINSTOR FlexVolume Provisioner というのが、ボリュームの接続、切り離し、マウント、アンマウント、ファイルシステムの作成を行います。

以下に構築例として、Kubernetes の永続ストレージとして DRBDを設定する方法を示します。

前提条件

前提条件として、すでに以下の構成がなされているとします。

  • 3台のホストを用意する。1台を Master(LINSTOR では controller), 残り2台を Worker (LINSTOR では satellite) として使用。
  • すべてのホストに CentOS 7.5、DRBD9, LINSTOR をインストール。
  • すべてのホストに Docker, Kubernetes をインストール。
  • Kubernetes の Master node, Worker node は設定済みである。
  • LINSTOR の node の作成は設定済みである。

* LINSTOR のインストールは DRBD9 LINSTOR 構築手順書 を参照ください。パッケージを自分でビルドする方法もありますので LINBIT レポジトリなしでも試せます。

ソフトウェア

今回使用したソフトウェア情報を以下に記載します。

  • CentOS 7.5
  • kmod-drbd-9.0.14_3.10.0_862-1
  • drbd-9.5.0-1
  • drbd-utils-9.5.0-1
  • linstor-client-0.2.2-1
  • linstor-server-0.2.6-1
  • python-linstor-0.2.2-1
  • docker-ce-18.06.0.ce-3
  • kubeadm-1.11.1-0
  • kubectl-1.11.1-0
  • kubelet-1.11.1-0

docker パッケージは https://download.docker.com/linux/centos/docker-ce.repo, kubernetes 関連パッケージは https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch から取得

LINSTOR External Provisioner の設定

Master ノードで linstor-external-provisioner をビルドします。

端末を一つ用意し、linstor-external-provisioner を起動します。

stdout, stderr がそのまま端末に表示されますので必要に応じてリダイレクトしてください。

LINSTOR FlexVolume Provisioner の設定

全てのノードで LINSTOR FlexVolume Provisioner をビルドします。1つのでノードでビルドしてコピーするでもかまいません。

/etc/systemd/system/kubelet.service.d/10-kubeadm.conf を編集し enable-controller-attach-detach=false を追加します。

設定後 kubelet を再起動します。

設定を確認します。

/etc/linstor/linstor-client.conf の編集

linstor-flexvolume から linstor コマンドが使われるので、Satellite ノードでも linstor コマンドが動作しなければならなりません。以下を Satellite ノードで実行します。

controllers で controller ノードのアドレスを指定します。Satellite ノードでも linstor node list が動作するのを確認してください。

storage pool の準備

Master ノード上で Kubernetes で使用する DRBD storage pool を準備します。ここでは drbd_test とします。

以上で設定は終了です。

StorageClass, PersistentVolumeClaim の準備

あとは StorageClass に登録し (controllers は環境に合わせて書き換える)、

PersistentVolumeClaim でボリュームを割当ます。

正しく動作すると resource, storage-pool は以下のようになります。

fedora で DRBD を永続ストレージとして使う

最後に、fedoraコンテナを作成し動作確認します。

ここで、しばらくして、
 Unable to mount volumes

と表示される場合は、10-kubeadm.conf にパッチがあっていないか、satellite ノードで linstor コマンドが動作していない可能性がありますので設定を確認します。

問題なければ、fedora pod に接続し、DRBD volume に書き込んでみます。

/dev/drbd1000 が /data にマウントされているので、ここに書き込み、exit コマンドで fedora pod を抜けます。

いったん、fedora pod を削除します。前回は tate-z57 に割り当てられていたので、cordon でこれを除外し、再度 fedora pod を作成します。

今度は tate-z56 に割り当てられました。再度 fedora pod に接続します。

先程の書き込みが確認でき、DRBD が永続ストレージとして使用できるのが確認できました。

参考

以下を参考にしましたので、詳細はこちらを参照ください。