Longhorn with Rancher

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

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

詳しいお話は弊社 Iさんの記事を。
⇒ [Longhorn + WordPress on GKE](https://qiita.com/cyberblack28/items/fbc93044d6d338a4b24c)

# 構成

**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 をインストールし、必要なディスクをマウントします。

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

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

```shell-session:ディスクマウント確認
$ 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」です。

![qiita001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/9a321f55-3009-518f-b486-12ffe853d5d1.jpeg)

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

![qiita002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/486a3fb9-a9d4-8c4d-a652-d6731747c387.jpeg)

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

![qiita003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/1bcedbfd-ca32-5fbb-4534-582bc4588bf1.jpeg)

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

![qiita004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/4c5e7f95-49b1-cecb-f702-e81d51077815.jpeg)

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

# テスト

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

```yaml: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
```

```bash: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 作ってマウントしてみましょう。

```yaml: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
```

```bash: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 へのリンクです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/c77f7d93-3ab6-81b9-2aa8-13fde9df9d39.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/0494ac01-b528-1808-c24e-b70e0a2c71a6.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/1b2da172-a2fa-7030-58c6-5d230a9fcc7f.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/ce405b92-6adc-b749-c96f-c2a25f56bc0d.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/87688ad6-ea75-727a-a536-b1496276af51.png)

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