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
前提条件
- docker MountFlags shared
 
vi /lib/systemd/system/docker.service 
以下追加
[Service]
~~~
MountFlags=shared
~~~
sudo systemctl daemon-reload
sudo systemctl restart docker
- 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
- 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
- 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 をお勧めします。
