Bluemix-k8s のドキュメントでは、PersistentVolume と PersistentVolumeClaim の対応づけは、Capacityを同じとしか記述されておらず(2017/9/25現在)、それでは、20Giのパフォーマンス・ストレージが2つ存在すると、対応づけは運任せになってしまう。 例えば、こんな感じです。 mysql-claim1 と mysql-pv1 を対応付けたいのですが、mysql-claim1 と mysql-pv2 がボンドされてしまいました。
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
mysql-claim1 Bound mysql-pv2 20Gi RWX 16s
mysql-claim2 Bound mysql-pv1 20Gi RWX 5s
これでは使えないので、確実に目的のPersistentVolume と Claimを意図した様に確実に結びつける方法についてのメモです。
対策 selector 利用
次の例の様に、永続ボリュームの設定で、 metadata の下に、labels: を追加して、name: pv1 を設定します。
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv1
labels:
name: pv1
spec:
capacity:
storage: "20Gi"
accessModes:
- ReadWriteMany
nfs:
server: "fsf-dal1001c-fz.adn.networklayer.com"
path: "/IBM02SV289550_2/data01"
そして、spec: 下に selector: を追加して、matchLabels: に name: pv1 を設定します。 これで、labelが一致したものが対応する様になります。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-claim1
annotations:
volume.beta.kubernetes.io/storage-class: ""
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: "20Gi"
selector:
matchLabels:
name: pv1
これで、以下の例の様に、思い通りに、結びつけられる様になります。
$ kubectl apply -f s01_PersistentVol.yml
persistentvolume "mysql-pv1" created
$ kubectl apply -f s02_PersistentVol.yml
persistentvolume "mysql-pv2" created
$ kubectl apply -f s03_PersistentVolClaim.yml
persistentvolumeclaim "mysql-claim1" created
$ kubectl get pv
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
mysql-pv1 20Gi RWX Retain Bound default/mysql-claim1 20s
mysql-pv2 20Gi RWX Retain Available 13s
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
mysql-claim1 Bound mysql-pv1 20Gi RWX 10s
意図した対応づけになりました。
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
mysql-claim1 Bound mysql-pv1 20Gi RWX 1m
mysql-claim2 Bound mysql-pv2 20Gi RWX 16s
簡単ですが、以上です。
参考資料
(1) https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistent-volumes
(2) https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims