k8s Tasksを通しでやってみる：Configure a Pod to Use a PersistentVolume for Storage

参考資料
--------------------
[Configure a Pod to Use a PersistentVolume for Storage (kubernetes.io)](https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/)
[Declarative Management of Kubernetes Objects Using Kustomize (kubernetes.io)](https://kubernetes.io/docs/tasks/manage-kubernetes-objects/kustomization/)


何を学べるか
--------------------
- 永続ストレージについての、各オブジェクト(リソース)間の依存関係

```
  [Host]     [PersistentVolume]      [PersistentVolumeClaim]      [Pod]
/mnt/data <--  task-pv-volume  <-----     task-pv-claim      <- task-pv-pod
```
*上の矢印(`<-`)は、オブジェクト間の依存関係を意味します*

- Podで永続ストレージを使うには、事前準備として以下が必要になる
  - 実際に保存するストレージ(ディレクトリ)を作っておく
  - `PersistentVolume`を作っておく
  - `PersistentVolumeClaim`を作っておく


前提条件
--------------------
- k8s v1.14以降 (Kustomizeが必要)
- k8sクラスタ起動済み (参考資料では`minikube`を使用)


環境情報
--------------------
- CNI実装: calico
- CRI実装: Docker
- ホストOS: Ubuntu 18.04


手順
--------------------

### 1/1 : ホストOSにマウント用ディレクトリを作る

```
sudo mkdir /mnt/data
```

### 2/2 : 作ったディレクトリに`index.html`ファイルを作る

```
sudo sh -c "echo 'Hello from Kubernetes storage' > /mnt/data/index.html" && ls /mnt/data

index.html
```

### 3/3 : `PersistentVolume`を作る

```
kubectl apply -f https://k8s.io/examples/pods/storage/pv-volume.yaml

persistentvolume/task-pv-volume created
```

### 4/4 : `PersistentVolume`の`task-pv-volume`が作られた事を確認する

```
kubectl get pv task-pv-volume

NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
task-pv-volume   10Gi       RWO            Retain           Available           manual                  42s
```

### 5/5 : `PersistentVolumeClaim`を作る

```
kubectl apply -f https://k8s.io/examples/pods/storage/pv-claim.yaml

persistentvolumeclaim/task-pv-claim created
```

### 6/6 : `PersistentVolume`と`PersistentVolumeClaim`のSTATUSが`Bound`である事を確認する

```
kubectl get pv task-pv-volume

NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
task-pv-volume   10Gi       RWO            Retain           Bound    default/task-pv-claim   manual                  37m

kubectl get pvc task-pv-claim

NAME            STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
task-pv-claim   Bound    task-pv-volume   10Gi       RWO            manual         22m
```

### 7/7 : `PersistentVolumeClaim`を指定したPodを作る

```
kubectl apply -f https://k8s.io/examples/pods/storage/pv-pod.yaml

pod/task-pv-pod created
```

```
kubectl get pod task-pv-pod

NAME          READY   STATUS    RESTARTS   AGE
task-pv-pod   1/1     Running   0          2m28s
```


### 8/8 : `PersistentVolumeClaim`を指定したPodを作る

```
kubectl exec -it task-pv-pod -- /bin/bash

root@task-pv-pod:/#
```

### 9/9 : 作ったPodのシェルに入って`PersitentVolume`内の`index.html`を`curl`コマンドで要求する

```
root@task-pv-pod:/# apt-get update

...

root@task-pv-pod:/# apt-get install curl

...

root@task-pv-pod:/# curl localhost

Hello from Kubernetes storage
```


終わりましたので、クリーンアップしましょう。

Pod

```
kubectl delete pod task-pv-pod

pod "task-pv-pod" deleted
```

わざと`PersistentVolume`から削除してみた所、`PersistentVolumeClaim`の削除待ちになったようです。

```
kubectl delete pvc task-pv-volume

persistentvolume "task-pv-volume" deleted
```

```
kubectl get pv -A

NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                   STORAGECLASS   REASON   AGE
task-pv-volume   10Gi       RWO            Retain           Terminating   default/task-pv-claim   manual                  68m
```

```
kubectl delete pvc task-pv-claim

persistentvolumeclaim "task-pv-claim" deleted
```

```
kubectl get pv -A

No resources found.
```


```
kubectl get pvc -A

No resources found.
```


まとめ
--------------------

`PersistentVolume`について簡単に実施したタスクでした。
各オブジェクト(リソース)間の関係性を簡単に確認出来たので、それだけでも有益でした。
様々な障害発生ケースは思い付くのですが、記事の趣旨に合わないので別記事を作ろうかと思案中です。

以上です。


補足：略語(慣習的な用語を除く)
--------------------
- k8s: Kubernetes
- CNI: Container Networking Interface
- CRI: Container Runtime Interface