KubernetesでGlusterFSを使う。

#初めに
共有ストレージが欲しかったんや。
NASでNFS使ってもよかったけど、メンテナスするときにサーバ全体を停止させるのが面倒。
だったらHCIライクにすればよいのではと。


#前提
・自宅でKubernetes環境を構築（3台）
・GlusterFS構築済み


#目的
共有ストレージを設定する。

#GlusterFSの構成

![GlusterFS.png](https://qiita-image-store.s3.amazonaws.com/0/162569/c8757df4-9d9e-993b-48e5-8d09da5ed1d4.png)

```bash

[root]# gluster peer status
Number of Peers: 2

Hostname: etcd-master3
Uuid: 36d78117-e3ba-4bcc-b8bd-aa53109b7de7
State: Peer in Cluster (Connected)

Hostname: etcd-master2
Uuid: 03b802d9-dc51-4105-91b6-8720baabe80e
State: Peer in Cluster (Connected)
[root]#
```

#Endpointsの設定

``` glusterfs-endpoint.yaml
kind: Endpoints
apiVersion: v1
metadata:
  name: glusterfs
subsets:
- addresses:
  - ip: "192.168.1.21" ★GlusterFS　peer ipアドレスを指定する。
  ports:
  - port: 1
- addresses:
  - ip: "192.168.1.22" ★GlusterFS　peer ipアドレスを指定する。
  ports:
  - port: 1
- addresses:
  - ip: "192.168.1.23" ★GlusterFS　peer ipアドレスを指定する。
  ports:
  - port: 1 ★適当に指定

```

上記ファイルを適用する。

```bash
$ kubectl create -f glusterfs-endpoint.yaml
```

#Serviceの設定

```glusterfs-service.yaml
kind: Service
apiVersion: v1
metadata:
  name: glusterfs
spec:
  ports:
  - port: 1　★endpointで指定したポート番号
  
```

上記ファイルを適用する。

```bash
$ kubectl create -f glusterfs-service.yaml
```

これで準備おっけー

#ボリュームの準備
/home/glusterfs/ 配下にディレクトリを作成してGlusterFS用の領域としている。

```bash
各サーバで実行する。

[root]# mkdir /home/glusterfs/docker-registry/

□ etcd-master1
□ etcd-master2
□ etcd-master3

```

###ボリュームを3台でミラーする構成を取る。

```bash
いずれか1台で実行する。

3台でミラー構成を構築
[root]# gluster vol create docker-registry replica 3 etcd-master1:/home/glusterfs/docker-registry/ etcd-master2:/home/glusterfs/docker-registry/ etcd-master3:/home/glusterfs/docker-registry/

ボリューム作成
[root]# gluster vol set docker-registry

ボリュームの提供を開始する。
[root]# gluster vol start docker-registry

```

###作成したボリュームを確認する。

```bash

[root]# gluster vol status
Status of volume: docker-registry
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick etcd-master1:/home/glusterfs/docker-r
egistry                                     49158     0          Y       13108
Brick etcd-master2:/home/glusterfs/docker-r
egistry                                     49158     0          Y       5667
Brick etcd-master3:/home/glusterfs/docker-r
egistry                                     49158     0          Y       10874
Self-heal Daemon on localhost               N/A       N/A        Y       13131
Self-heal Daemon on etcd-master2            N/A       N/A        Y       5692
Self-heal Daemon on etcd-master3            N/A       N/A        Y       10951

Task Status of Volume docker-registry
------------------------------------------------------------------------------
There are no active volume tasks

```

###ボリュームをマウントし、ディレクトリ作成

```bash

[root]# mount -t glusterfs localhost:docker-registry /mnt
[root]# mkdir /mnt/regi-pv
```


#ボリューム定義

```pv.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
  name: regi-docker-registry-pv
  labels:
    name: regi-docker-registry-pv
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 20Gi　★20GiB分確保する
  glusterfs:
    endpoints: glusterfs
    path: docker-registry/regi-pv ★作成したボリューム/ディレクトリ
    readOnly: false
```

上記ファイルを適用する。

```bash
$ kubectl create -f pv.yaml
```


#ボリューム要求

```pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: regi-docker-registry-pvc
  name: regi-docker-registry-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 20Gi
  selector:
     matchLabels:
       name: regi-docker-registry-pv
status: {}

```

上記ファイルを適用する。

```bash
$ kubectl create -f pvc.yaml
```

#ボリュームの確認

```
[root]# kubectl get pv
NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                               STORAGECLASS   REASON    AGE
regi-docker-registry-pv   20Gi       RWX            Retain           Bound      default/regi-docker-registry-pvc                             8s
[root]# 
[root]# kubectl get pvc
NAME                       STATUS    VOLUME                    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
regi-docker-registry-pvc   Bound     regi-docker-registry-pv   20Gi       RWX                           45s
[root]#
```

以上。