Azure Kubernetes Serviceの永続化ボリュームにAzure NetApp Filesを使用する

Azure NetApp Filesを、Azure Kubernetes Serviceの永続ディスクとして使ってみました。
公式マニュアル通りでいけますが、戸惑ったところなどを中心に書いていきます。
[Azure NetApp Files と Azure Kubernetes Service を統合する](https://docs.microsoft.com/ja-jp/azure/aks/azure-netapp-files)

# 全体像
* 今回作る環境です。NetApp Filesのボリュームを配置するサブネットは、NetApp Files専用にしないといけないので、始めにネットワークの設計が必要です。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/82f6a180-fa45-2b55-668c-92c4abce3f84.png)

# vNetを作成する
* まずはvNetを作成します。NetApp Files利用可能リージョンの都合上「East US」リージョンを選択しています。サブネットはまずはAKS用に/25で作ってます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/11481d49-c869-22de-583d-c98a631111ea.png)

* 次にNetApp Files用のサブネットを作ります。作成したvNetに移動して[+Subnet]ボタンをクリックします。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/de149da2-c21c-a535-fbb9-9dc50ee4f855.png)

* NetApp用のサブネットは/28あればよいとのことなので/28で作ります。Subnet delegationに[Microsoft.NetApp/volumes]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ef2d88dd-00c6-1e63-6128-f9dee0154cb0.png)

# AKSを作成する
* 配置するネットワークに先ほど作成したAKS用サブネットを指定して作成します。ARM Templateで作る場合は以下の記事を参考にしてみてください。  
[Azure Kubernetes ServiceをARMテンプレートで作成する](https://qiita.com/shingo_kawahara/items/c65ed88da717f52c4f79)

* ポータルから作る場合は、Network configurationを[Advanced]にして、AKS用サブネットを指定します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/75016e80-595d-a10f-2bfb-5d9cb892a423.png)

# NetApp Filesを作成する
* 別途記事を書いているので参考にしてください。  
[Azure NetApp FIlesでボリュームを作成し、Azure VMからNFSマウントする](https://qiita.com/shingo_kawahara/items/1e7ec068aaaf5148da73)

# PVを作成する
* ポータルから作成したボリュームを選択し、ボリュームのIPアドレスを調べる。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/9c4244ab-4adb-34bd-a2fe-814c121b9460.png)

* 以下yamlファイルを作成します。IPアドレスは先ほど調べた値に変更します。

```pv-nfs.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: [Your IP Address]
    path: /volume1
```

* PVを作成します。  

```
$ kubectl apply -f .\pv-nfs.yaml
$ kubectl get pv
```

# PVCを作成する
* 以下yamlファイルを作成します。

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

* PVCを作成します。

```
$ kubectl apply -f .\pvc-nfs.yaml
$ kubectl get pvc
```

# Podを作成する
* 以下yamlファイルを作成します。

```nginx-nfs.yaml
kind: Pod
apiVersion: v1
metadata:
  name: nginx-nfs
spec:
  containers:
  - image: nginx
    name: nginx-nfs
    command:
    - "/bin/sh"
    - "-c"
    - while true; do echo $(date) >> /mnt/azure/outfile; sleep 1; done
    volumeMounts:
    - name: disk01
      mountPath: /mnt/azure
  volumes:
  - name: disk01
    persistentVolumeClaim:
      claimName: pvc-nfs
```

* Podを作成します。

```
$ kubectl apply -f .\nginx-nfs.yaml
$ kubectl get po
```

# マウント状態確認

* コンテナに入って、マウントできていればOKです。

```
$ kubectl exec -it nginx-nfs bash
# df -h
# ls -l /mnt/azure
```

# 別のPodから同じNFSボリュームに書き込んでみる

* 以下yamlファイルを作成します。

```nginx-nfs2.yaml
kind: Pod
apiVersion: v1
metadata:
  name: nginx-nfs2
spec:
  containers:
  - image: nginx
    name: nginx-nfs2
    command:
    - "/bin/sh"
    - "-c"
    - while true; do echo $(date) >> /mnt/azure/outfile2; sleep 1; done
    volumeMounts:
    - name: disk01
      mountPath: /mnt/azure
  volumes:
  - name: disk01
    persistentVolumeClaim:
      claimName: pvc-nfs
```

* コンテナに入って、outfile2というファイルが作られていたらOKです。こちらのPodからoutfileも確認することができます。

```
$ kubectl exec -it nginx-nfs bash
# df -h
# ls -l /mnt/azure
```