kubernetesのPersistent Volumesをnginxで使ってみた

![kuber.png](https://qiita-image-store.s3.amazonaws.com/0/258841/0afa5a1d-e693-f8d9-af8c-391e7e23dba7.png)

# Persistent Volumesとは

Persistent VolumesはPodで使うストレージを管理するための仕組みです。
ここではnginxを使用してデプロイ/サービスの作成/削除を行っても消えないコンテンツの作成を実践していきます。

参考 [https://kubernetes.io/docs/concepts/storage/persistent-volumes/]

# 環境
minikube version: v0.28.2

# 手順

#### ① nasの準備
```
下記をホストノードで実行

■ 公開用ディレクトリの作成
$ sudo mkdir /share 

■ パーミッションの変更
$ sudo chmod 777 /share

■ NFS サーバーの設定
$ sudo vi /etc/expors
/share -mapall=nobody:wheel -network 192.168.99.0 -mask 255.255.255.0

■ NFSサーバ起動
$ sudo nfsd start
$ sudo nfsd update 

$ sudo showmount -e
Exports list on localhost:
/share                              192.168.99.0

■ minikubeからマウント確認
minikube$ minikube ssh
minikube$ mkdir /share
minikube$ sudo mount -t nfs 192.168.99.1:/share /share

minikube$ df -T | grep nfs
192.168.99.1:/share nfs      248856960 158028288  90572672  64% /share

■ 特にマウントしとく必要はないのでアンマウント
minikube$ sudo umount /share/
```

#### ② Persistent Volumesを作る
pv(永続ボリューム)を作ります。
下記のようなファイルを作成

```yaml:nfs-pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs001
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
    #- ReadOnlyMany  複数ノードからREAD ONLY1マウント可能にするモード
    #- ReadWriteOnce 1つのノードからR/Wでマウントできるモード
  # PersistentVolumeClaim を削除した時の動作
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  mountOptions:
    - hard
  ## マウント先のNFS Serverの情報を記載
  nfs:
    path: /share
    server: 192.168.99.1
```

ここでは1つのノードから利用するのでReadWriteOnceを指定します。

```
$ kubectl create -f nfs-pv.yaml
persistentvolume "nfs001" created

$ kubectl get pv -o wide
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                STORAGECLASS   REASON    AGE
nfs001    1Gi        RWX            Recycle          Bound     default/nfs-claim1   slow                     2h
```


#### ③ PersistentVolumeClaimsを作る
pvからpodに紐付けるための領域を要求します。pvcを作ることでpodにストレージを追加することができます。

下記のようなファイルを作ります

```yaml:nfs-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-claim1
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: slow
```

詳細は公式をドキュメントをどうぞ
[https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes]

```
$ kubectl create -f nfs-pv.yaml
persistentvolumeclaim "nfs-claim1" created

$ kubectl get pvc -o wide
NAME         STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-claim1   Bound     nfs001    1Gi        RWX            slow           2h
```

#### ⑤podに割り当てる

以下のようなyamlファイルを作成
基本的には普通のnginxのyamlと変わらないがvolumesに今回作成した永続ボリュームを指定している

```yaml:nginx.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-dep
spec:
  replicas: 2
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: mydate
      volumes:
        - name: mydate
          persistentVolumeClaim:
            claimName: nfs-claim1
```

#### ⑥デプロイ

```
$ kubectl create -f nginx-pod.yaml
deployment.extensions/nginx-dep created

$ kubectl expose deployment nginx-dep --type="NodePort"
service/nginx-dep exposed

$ kubectl get pod -o wide
NAME                         READY     STATUS    RESTARTS   AGE       IP           NODE
nginx-dep-75b78c75cb-bxj45   1/1       Running   0          2h        172.17.0.5   minikube
nginx-dep-75b78c75cb-d89wd   1/1       Running   0          2h        172.17.0.6   minikube
```

# 確認

```
■コンテナ
$ kubectl exec nginx-dep-75b78c75cb-x2895 -it /bin/bash

root@nginx-dep-75b78c75cb-x2895:/# df
Filesystem          1K-blocks      Used Available Use% Mounted on
overlay              16888216   1567168  14331916  10% /
tmpfs                   65536         0     65536   0% /dev
tmpfs                 1019312         0   1019312   0% /sys/fs/cgroup
/dev/sda1            16888216   1567168  14331916  10% /etc/hosts
shm                     65536         0     65536   0% /dev/shm
192.168.99.1:/share 248856960 158031360  90569600  64% /usr/share/nginx/html
tmpfs                 1019312        12   1019300   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                 1019312         0   1019312   0% /proc/scsi
tmpfs                 1019312         0   1019312   0% /sys/firmware

■ ダッシュボード
$ minikube dashboard

■ URL表示
$ minikube service nginx-dep --url
http://192.168.99.100:31508 
```

デプロイ/サービスを削除しても作成したWebコンテンツは削除されない

```
$ kubectl delete deployment nginx-dep
deployment.extensions "nginx-dep" deleted

$ ls -l /share/file1.html 
-rw-r--r--  1 root  wheel  2656  8 26 15:45 /share/file1.html
```