Longhorn with Rancher


はじめに

今回は Rancher で Longhorn です。
いわゆるコンテナ用永続ストレージです。
特徴として、

  • PVC から動的プロビジョニング
  • 複数 Node でレプリカ
  • Web ダッシュボード付属
  • etc.

詳しいお話は弊社 Iさんの記事を。
Longhorn + WordPress on GKE

構成

Host Machine
OS:Windows 10
VirtualBox:6.0.18

Guest Machine
CentOS:7.6
docker-ce:18.09
kubernetes:1.17
Rancher:2.4.2

Rancher & k8s
Rancher & k8s controller/etcd x1
k8s worker x3
※worker にはストレージとして、/(8G) の他に docker(50G)、longhorn(50G) をアタッチ

前準備

上記のサーバ構成を構築後からスタートです。

公式通り、iscsi-initiator-utils をインストールし、必要なディスクをマウントします。

必須パッケージインストール
$ yum install iscsi-initiator-utils -y

今回はストレージを別に用意してますが、お試しであれば不要です。
必要なディスクサイズだけ確保してください。
※「/var/lib/rancher/longhorn」に pv が作成されていきます。

ディスクマウント確認
$ lsblk -o NAME,FSTYPE,MOUNTPOINT -i
NAME              FSTYPE      MOUNTPOINT
sda
|-sda1            xfs         /boot
`-sda2            LVM2_member
  |-centos-root   xfs         /
  `-centos-swap   swap        ★swap は無効化済み
sdb
`-sdb1            LVM2_member
  `-var-docker    ext4        /var/lib/docker
sdc
`-sdc1            LVM2_member
  `-longhorn-data ext4        /var/lib/rancher/longhorn

Deploy

Rancher の library catalog に含まれているので、「apps」⇒「起動」から Deploy します。

Longhorn を選択すると以下の画面が表示されます。
名前、名前空間(namespace) はデフォルトの「longhorn-system」です。
テンプレートバージョンは「0.8.0」です。

私の場合「loghorn-driver-deployer」Pod が CrashLoopBack で起動しませんでした。
このため、「Kubelet Root Directory」に以下を指定することで起動しました。
Kubelet Root Directory:/var/lib/kubelet

PV 作成先のパスを「Default Data Path」で指定します。
Default Data Path:/var/lib/rancher/longhorn

Dashboard(管理画面) のサービスを今回は「NodePort」で指定しています。
L7 LB もあるのでお好みで指定してください。

最後に「起動」ボタンで Deploy です。
環境にもよりますが、5分以内で起動すると思います。

テスト

実際に PV/PVC を作ってみましょう

pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: tmp
  namespace: default
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: longhorn
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mnt
  namespace: default
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: longhorn
pv,pvc作成
$ kubectl apply -f pvc.yaml
persistentvolumeclaim/tmp created
persistentvolumeclaim/mnt created

$ kubectl get pvc,pv
NAME                        STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/mnt   Bound    pvc-xxx   3Gi        RWO            longhorn       9s
persistentvolumeclaim/tmp   Bound    pvc-yyy   1Gi        RWO            longhorn       10s

NAME                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM         STORAGECLASS   REASON   AGE
persistentvolume/pvc-xxx   3Gi        RWO            Delete           Bound    default/mnt   longhorn                5s
persistentvolume/pvc-yyy   1Gi        RWO            Delete           Bound    default/tmp   longhorn                5s

テスト Pod 作ってマウントしてみましょう。

pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: alpine
  namespace: default
spec:
  containers:
  - image: alpine:edge
    name: alpine
    volumeMounts:
    - mountPath: /mnt
      name: mnt
    - mountPath: /tmp
      name: tmp
    tty: true
  volumes:
  - name: mnt
    persistentVolumeClaim:
      claimName: mnt
  - name: tmp
    persistentVolumeClaim:
      claimName: tmp
pod作成
$ kubectl apply -f pod.yaml
pod/alpine created

$ kubectl get pod
NAME     READY   STATUS    RESTARTS   AGE
alpine   1/1     Running   0          16s

$ kubectl exec alpine -- df -hT /mnt /tmp
Filesystem           Type            Size      Used Available Use% Mounted on
/dev/longhorn/pvc-xxx
                     ext4            2.9G      9.0M      2.9G   0% /mnt
/dev/longhorn/pvc-yyy
                     ext4          975.9M      2.5M    957.4M   0% /tmp

無事に pv/pvc が作成され、pod にマウントできました。

Dashboard

折角なので Dashboard のスクリーンショットを何枚か。
Dashboard は Apps にリンクあります。
※以下の場合「31833/tcp」が Dashboard へのリンクです。

まずは、「dashboard」画面です。
グラフと下にはイベントログが表示されています。

次に「Node」画面です。
Node 毎のリソース状況が表示されます。

最後に「Volume」画面です。
pv で払い出しているボリュームの一覧が表示されます。
Attach 先の Pod も表示されています。

また、各 Volume を選択すると詳細な画面に遷移します。
Volume の Snapshot の状況の表示や Snapshot/Backup のスケジュールも設定できます。

おわりに

クラスタストレージ環境が Rancher のカタログで Deploy できるので非常にお手軽に利用できます。
また、機能も必要十分にあるため、色々使い倒していけるのではと思います。
どこかで他のストレージ環境との I/O ベンチマークなども見ていければと思います。