kubernetesでPersistent Volumesを使ってみたときのメモです。基本的に以下のドキュメントの内容です。
http://kubernetes.io/docs/user-guide/persistent-volumes/

Persistent Volumesとは

Persistent VolumesはPodで使うストレージを管理するための仕組みです。

サポートしているストレージの一覧

Vagrant環境を使っているので、一番手っ取り早く用意出来るNFSをストレージ領域として利用します。クラウドストレージとか、FC、iSCSIなどなど大体サポートしているみたいなので適切なものを選べば良いと思います。

シングルノードのクラスタの場合は検証用としてHostPathでローカルのストレージが利用出来るようになっています。

Persistent Volumesはネットワークボリュームを使うことを前提に設計されているのでkubernetesのノードとは切り離して管理することが出来るようになっています。

環境

前回の構成にサーバ(192.168.33.41)を追加してnfsをインストールします。

作成されたサーバに40GBくらいのディスク領域が割り当てられるので、この領域をnfsで使えるように設定します。

nasの準備

追加したサーバにnfs serverを起動してnfsが利用出来るようにします。nfs-utilsが最初からインストールされていたため、次の様に設定するだけでnfsが使えるようになります。

$ vagrant ssh nas1
vagrant$ sudo su -
root$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00 38G 1.3G 37G 4% /
devtmpfs 909M 0 909M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 8.3M 912M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/sda2 1014M 89M 926M 9% /boot
tmpfs 184M 0 184M 0% /run/user/1000

37GB空いているので/var/share以下をnfsで利用できるように設定します。

root$ mkdir /var/share
root$ echo '/var/share 192.168.33.0/24(rw,async,no_root_squash)' >> /etc/exports
root$ systemctl start rpcbind nfs-server
root$ systemctl enable rpcbind nfs-server
root$ exportfs
/var/share 192.168.33.0/24

Persistent Volumesを作る

nasに37GB程度ディスク領域があるので適当に20Giのpvを作ります。

root$ vi nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0001
annotations:
volume.beta.kubernetes.io/storage-class: "slow"
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 192.168.33.41
path: /var/share

capacityでpvのディスクサイズを指定します。

Access Modesは3つあって、

  • ReadWriteOnce: 1つのノードからR/Wでマウントできる
  • ReadOnlyMany: 複数のノードからReadOnlyでマウントできる
  • ReadWriteMany: 複数のノードからR/Wでマウントできる

が指定できます。利用するストレージによっては指定できないものがあるのでドキュメントを確認してください。
http://kubernetes.io/docs/user-guide/persistent-volumes/#access-modes

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

nfs利用時にpersistentVolumeReclaimPolicyにRecycleを指定することで、再要求した時にrm -rf /thevolume/*が実行されます。

あとは、追加したnasを指定します。

作った設定ファイルを使ってPersistentVolumeをkubectlで作成します。

root$ kubectl create -f nfs-pv.yaml
persistentvolume "pv0001" created
root$ kubectl get pv -o wide
NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE
pv0001 20Gi RWO Available 25s

PersistentVolumeClaimsを作る

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

試しに、pvから1Giのストレージを要求するためにpvcを作ります。

root$ vi  nfs-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-claim1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

pvcを作成します。

root$ kubectl create -f nfs-claim.yaml
persistentvolumeclaim "nfs-claim1" created
root$ kubectl get pvc -o wide
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
nfs-claim1 Bound pv0001 20Gi RWO 7s

podに割り当てる

適当なpodを作ってpvcをvolumeとしてマウントしてみます。

ここでは以下の設定ファイルで、nginxのpodを作って1Giのpvcを/usr/share/nginx/htmlにマウントします。

root$ vi nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nginx-pvc
volumes:
- name: nginx-pvc
persistentVolumeClaim:
claimName: nfs-claim1

podを作ります。

root$ kubectl create -f nginx-pod.yaml
root$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-pod 1/1 Running 0 52s 172.30.38.2 centos-minion-2

nasの/var/shareをnginx-podが/usr/share/nginx/htmlにマウントしているので次のようにnasでファイルを追加してみます。

root$ echo 'I love Kubernetes storage!' > /var/share/index.html

pv、pvc、podの設定がうまくできていると、masterで以下のようにnginxに対してリクエストを送ると追加したファイルの内容がレスポンスとして表示されます。

root$ curl 172.30.38.2
I love Kubernetes storage!

表示されない場合は以下のコマンドで原因を探ると良いかもしれません。

root$ kubectl describe po nginx-pod

Events:に失敗した操作が表示されてたりします。

削除

pvを削除してpersistentVolumeReclaimPolicy: Recycleが動いているか確認します。

root$ kubectl delete pod nginx-pod
pod "nginx-pod" deleted
root$ kubectl delete pvc nfs-claim1
persistentvolumeclaim "nfs-claim1" deleted
root$ kubectl delete pv pv0001
persistentvolume "pv0001" deleted

nasでファイルを確認します。

root$ ls -l /var/share/index.html
-rw-r--r--. 1 root root 27 Jan 7 18:03 index.html

リアルタイムに消えないらしく、数分後に確認したらいつの間にか消えていました。

おわり。

参考

  1. http://kubernetes.io/docs/user-guide/persistent-volumes/
  2. http://kubernetes.io/docs/user-guide/persistent-volumes/walkthrough/