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 |
37GB空いているので/var/share以下をnfsで利用できるように設定します。
root$ mkdir /var/share |
Persistent Volumesを作る
nasに37GB程度ディスク領域があるので適当に20Giのpvを作ります。
root$ vi nfs-pv.yaml |
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 |
PersistentVolumeClaimsを作る
作成したnfsの20Giのpvからpodに紐付けるための領域を要求します。pvcを作ることでpodにストレージを追加することができます。
試しに、pvから1Giのストレージを要求するためにpvcを作ります。
root$ vi nfs-claim.yaml |
pvcを作成します。
root$ kubectl create -f nfs-claim.yaml |
podに割り当てる
適当なpodを作ってpvcをvolumeとしてマウントしてみます。
ここでは以下の設定ファイルで、nginxのpodを作って1Giのpvcを/usr/share/nginx/htmlにマウントします。
root$ vi nginx-pod.yaml |
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 |
表示されない場合は以下のコマンドで原因を探ると良いかもしれません。
root$ kubectl describe po nginx-pod |
Events:に失敗した操作が表示されてたりします。
削除
pvを削除してpersistentVolumeReclaimPolicy: Recycle
が動いているか確認します。
root$ kubectl delete pod nginx-pod |
nasでファイルを確認します。
root$ ls -l /var/share/index.html |
リアルタイムに消えないらしく、数分後に確認したらいつの間にか消えていました。
おわり。