Longhorn について

Kubernetes の学習・運用も大変ですが、 volume, backup の運用が特に大変な部分ではないでしょうか。私は数ある Storage Provider の中からどれがベストなのか、実際に利用して試行錯誤を繰り返していました。 GlusterFS, Rook Ceph, OpenEBS, Longhorn を候補に検証を行いました。 当初はGlusterFS を利用していました。 GlusterFS については kubernetes に対応した gluster-kubernetes のプロジェクトがあるのですが ARM64 に対応していなかったため、 ベアメタルに GlusterFS + Heketie 環境を構築し Dynamic Provisioning volume の実現していました。しかし、障害などが発生するたびに、バックアップ機能が内包されている簡易なものが欲しいという思いが高まりました。そこから Storage Provider 選定が始まりました。 Rook Ceph はインストールは簡単ですが、少し重い点と Ceph 自体の学習コストがネックでした。 OpenEBS については複数のデータエンジンがあり、ワークロードによって選択肢があります。また、 CAS(Container Attache Storage) という概念で構成されていて、 Kubernetes のマイクロサービス管理機能に内包される点が非常に気に入りました。しかし、RWX にネイティブ対応していない点がネックになりました。 Mayastor エンジンに期待しています。最終的には Longhorn に落ち着きました。
Kubernetes のディストリビューションは Microk8s と RKE を利用しています。

以下がLonghorn に決めた理由です。

  • WebUI がわかりやすい
  • バックアップ・スナップショット機能が内包されている
  • NFS, S3 外部バックアップに対応している
  • リストアが簡単
  • 高可用

元々システムの可視化は重要と考えていましたが、Kubernetes を利用するようになり、 Kubernetes Dashboard, Longhorn UI, Grafana 等で視覚的に把握できるありがたみを改めて感じました。

WebUI もわかりやすく、特にバックアップ・スナップショット機能が内包されていて、 NFSサーバ等の外部にバックアップできる点がお勧めです。
しかし、Longhorn の利用して1年ほど立ちますが、以下のバグに悩まされ、なかなか紹介に至れませんでした。

[BUG] MountVolume.SetUp failed for volume ~ rpc error: code = Internal desc = exit status 1 due to multipathd on the node

multipath.config に Longhorn が作成したディスクを blacklist に追加することで解決しました。同じ事象が発生している方は対処をお勧めします。
https://github.com/longhorn/longhorn/issues/1210

Kubernetes を運用していると、Cluster が壊れてしまうことがあります。Cluster はすぐに再構築できても PV は復旧できません。Kubernetes を利用する際は、可用性とシンプルなバックアップ・リストアを考慮した Storage Provider を決めことが運用コスト削減につながると思います。

install

前提条件

  1. docker MountFlags shared
vi /lib/systemd/system/docker.service 

以下追加

[Service]
~~~
MountFlags=shared
~~~
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. open-iscsiのインストール
    各OSのパッケージマネージャで open-iscsi をインストール
apt-get install open-iscsi
yum --setopt=tsflags=noscripts install iscsi-initiator-utils
systemctl enable iscsid
systemctl start iscsid

以下の pod でインストール可能

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.2.4/deploy/prerequisite/longhorn-iscsi-installation.yaml
  1. NFSv4クライアントのインストール
    各OSのパッケージマネージャで nfs-common をインストール
apt-get install nfs-common
yum install nfs-utils

以下のpod でインストール可能

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.2.4/deploy/prerequisite/longhorn-nfs-installation.yaml
  1. kubernetes version 1.8以上
kubectl version

推奨環境

ハード

  • 3ノード
  • ノードあたり4つのvCPU
  • ノードあたり4GiB
  • ストレージ用のノード上のSSD/NVMeまたは同様のパフォーマンスブロックデバイス

OS

  • Ubuntu 18.04, 20.04
  • SLES 15 SP1、15 SP2、15 SP3
  • CentOS 7, 8
  • RHEL 7.9, 8.3, 8.4
  • Oracle Linux 8.3
  • Rocky Linux 8.4

ディスク

  • LVM

StorageClass

  • デフォルトの StorageCLass 名を変更しない

CPUリクエストの適切な設定
下記の場合は15%の CPU Requests

defaultSettings:
  guaranteedEngineManagerCPU: 15
  guaranteedReplicaManagerCPU: 15

kubectl discribe node

  Namespace        Name                           CPU Requests  CPU Limits   Memory Requests  Memory Limits  Age
  longhorn-system  instance-manager-e-30d83df2     600m (15%)    0 (0%)       0 (0%)           0 (0%)         13d
  longhorn-system  instance-manager-r-a5fa516d     600m (15%)    0 (0%)       0 (0%)           0 (0%)         13d

values.yaml のスケジュール設定
replicaSoftAntiAffinity が true の場合1つの node でも障害が発生した場合複数のレプリカがダウンしてしまう可能性があるため false とする。
allowVolumeCreationWithDegradedAvailability を false にすると volume の空き容量がない場合 エラーを通知してくれる。 true の場合クラスターの空き容量が不足している状態が継続するリスクがある。

defaultSettings:
  replicaSoftAntiAffinity: false
  allowVolumeCreationWithDegradedAvailability: false

事前準備

helm でインストールするので values.yaml の準備
values.yaml は git で対象のバージョンを参照
https://github.com/longhorn/longhorn/blob/v1.2.4/chart/values.yaml

configure

リポジトリ追加・アップデート

helm repo add longhorn https://charts.longhorn.io
helm repo update

values.yaml から helm でインストール

helm install longhorn longhorn/longhorn \
-f values.yaml \
--namespace longhorn-system \
--create-namespace

NFS backup

NFS backup については version 4 に対応
fsid=0 を設定することによって version 4 となる

values.yaml で nfs server の / を設定

defaultSettings:
  backupTarget: "nfs://192.168.1.10:/"

nfs の設定ファイルへ /backup/nfs を設定

node1:/# cat /etc/exports 
/backup/nfs *(rw,sync,fsid=0,crossmnt,no_subtree_check)

上記の設定すると longhorn が backupstore フォルダを作成し pv を保存する

node1:/# ls -l backup/nfs/
drwx------ 3 nobody nogroup 21 Jan 14 00:15 backupstore

job と組み合わせることによって定期バックアップを行ってくれる

UI

uninstall

helm uninstall longhorn -n longhorn-system

kubernetes を利用するにあたって一番悩まされたのが volume 周りでしたが Longhorn を利用することによって解決されました。 レプリカ等による高可用なアーキテクチャ、シンプルでわかりやすい UI 、組み込み式のスナップショット・バックアップは非常に高機能です。Cluster が壊れる事もある kubernetes において NFS や S3 で Cluster 外部にバックアップを行えるのは重要と考えています。 kubernetes を利用する際は是非 Longhorn をお勧めします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です