ICPでnfsを使用してMySQLを稼働してみる

## やったこと
[ローカル端末にインストールした IBM Cloud Private (以下ICP)](https://qiita.com/yurak/items/d56575635bca0061155d)上で、MySQL を稼働させます。
Deployment, PersistentVolume, PersistentVolumeClaim を一度削除してみて再度作成した際に、データが戻るか確認してみます。

## やっていないこと
Kubernetesの仕様については説明しません。
[公式のドキュメント](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)および[ストレージについてのQiita](https://qiita.com/toshihirock/items/0c91bbedf0e144acf6fc)を参考にさせていただきました。

MySQLの構築手順については説明しません。
[ICPにMySQLに接続するLibertyアプリケーションをデプロイ](https://qiita.com/sotoiwa/items/8ff88d1742e2b6443835)を参考にさせていただきました。

## MySQL構築
### PVの作成

PersistentVolume や PersistentVolumeClaim が削除されてもボリュームにデータが残るよう`persistentVolumeReclaimPolicy: Retain`を指定します。

```mysql-pv.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
  name: mysql-pv
  labels:
    name: mysql-nfs
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 20Gi
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /storage/share01
    server: 192.168.27.100
```

`kubectl apply`後、作成を確認します。

```sh
$ kubectl get pv mysql-pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
mysql-pv   20Gi       RWO            Retain           Available                                   20s
```

### PVCの作成
他にマウントするPVはない予定ですが、念の為ストレージ２０Gに対して15Gを要求します。

```mysql-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 15Gi
  selector:
    matchLabels:
      name: mysql-nfs
```

`kubectl apply`後、作成を確認します。

```sh
$ kubectl get pvc mysql-pvc
NAME        STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pvc   Bound    mysql-pv   20Gi       RWO                           11s

$ $ kubectl get pv mysql-pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
mysql-pv   20Gi       RWO            Retain           Bound    default/mysql-pvc                           5m23s
```

その他のリソースについては説明を省きます。

```sh
$ find . -name "*.yaml"|xargs -I {} kubectl apply -f {}
deployment.apps/mysql created
secret/mysql-secret created
service/mysql created
configmap/mysql-configmap created
```

## nfs検証
Deployment, PersistentVolume, PersistentVolumeClaim を一度削除してみて再度作成した際に、データが戻るか確認してみます。

### 初期データ投入
Apache Bench を使い、Liberty アプリケーションからインサートします。
`ab -n 10 -c 10 https://192.168.27.100/wlp/sample/InsertDB`

Pod に`kubectl exec`し、データの一覧を確認します。
レコードが10行入っています。

```sh
mysql> select * from msg;
+-------+-------------------------+---------------------+---------------------+
| id    | msg                     | created_time        | updated_time        |
+-------+-------------------------+---------------------+---------------------+
| 14383 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 15090 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 17349 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 25210 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 57343 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 57642 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 62796 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 69842 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 79874 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 99697 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
+-------+-------------------------+---------------------+---------------------+
10 rows in set (0.01 sec)
```

### リソース削除
deployment, PersistentVolume, PersistentVolumeClaim を一度削除します。

```sh
$ kubectl delete deploy mysql
$ kubectl delete pvc mysql-pvc
$ kubectl delete pv mysql-pv
```

nfsボリュームマウント先には、mysqlデータが削除されていないことが確認できます。

```sh
root@master:/storage/share01# ls -ltr
total 166932
-rw-r----- 1 vboxadd vboxsf 50331648 Apr 28 09:04 ib_logfile1
drwxr-x--- 2 vboxadd vboxsf     4096 Apr 28 09:04 performance_schema
-rw-r----- 1 vboxadd vboxsf       56 Apr 28 09:04 auto.cnf
-rw------- 1 vboxadd vboxsf     1680 Apr 28 09:04 ca-key.pem
-rw-r--r-- 1 vboxadd vboxsf     1112 Apr 28 09:04 ca.pem
-rw------- 1 vboxadd vboxsf     1676 Apr 28 09:04 server-key.pem
-rw-r--r-- 1 vboxadd vboxsf     1112 Apr 28 09:04 server-cert.pem
-rw------- 1 vboxadd vboxsf     1680 Apr 28 09:04 client-key.pem
-rw-r--r-- 1 vboxadd vboxsf     1112 Apr 28 09:04 client-cert.pem
-rw-r--r-- 1 vboxadd vboxsf      452 Apr 28 09:04 public_key.pem
-rw------- 1 vboxadd vboxsf     1680 Apr 28 09:04 private_key.pem
drwxr-x--- 2 vboxadd vboxsf     4096 Apr 28 09:04 mysql
drwxr-x--- 2 vboxadd vboxsf     4096 Apr 28 09:04 sys
drwxr-x--- 2 vboxadd vboxsf     4096 Apr 28 09:04 webapp
-rw-r----- 1 vboxadd vboxsf  3091191 Apr 28 09:04 binlog.000001
-rw-r----- 1 vboxadd vboxsf       32 Apr 28 09:04 binlog.index
-rw-r----- 1 vboxadd vboxsf 31457280 Apr 28 09:08 mysql.ibd
-rw-r----- 1 vboxadd vboxsf     3488 Apr 28 09:16 binlog.000002
-rw-r----- 1 vboxadd vboxsf     4864 Apr 28 09:16 ib_buffer_pool
-rw-r----- 1 vboxadd vboxsf 10485760 Apr 28 09:16 undo_002
-rw-r----- 1 vboxadd vboxsf 12582912 Apr 28 09:16 undo_001
-rw-r----- 1 vboxadd vboxsf 50331648 Apr 28 09:16 ib_logfile0
-rw-r----- 1 vboxadd vboxsf 12582912 Apr 28 09:16 ibdata1
drwxr-x--- 2 vboxadd vboxsf     4096 Apr 28 09:16 #innodb_temp
```

### 再作成

再度リソースを定義します。

```sh
$ find . -name "*.yaml"|xargs -I {} kubectl apply -f {}
persistentvolume/mysql-pv created
persistentvolumeclaim/mysql-pvc created
deployment.apps/mysql created
```

Pod に`kubectl exec`し、データの一覧を確認します。
先ほどのレコードを確認できました。

```sh
mysql> select * from msg;
+-------+-------------------------+---------------------+---------------------+
| id    | msg                     | created_time        | updated_time        |
+-------+-------------------------+---------------------+---------------------+
| 14383 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 15090 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 17349 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 25210 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 57343 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 57642 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 62796 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 69842 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 79874 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
| 99697 | Hello oss-3tier-webapp! | 2019-04-28 18:08:32 | 2019-04-28 18:08:32 |
+-------+-------------------------+---------------------+---------------------+
10 rows in set (0.01 sec)
```