Bluemix
kubernetes
ibmcloud
IBM-Cloud

【IBM Cloud k8s検証メモ】二つ以上の永続ストレージを識別してマウント

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 を設定します。

s01_PersistentVol.yml
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が一致したものが対応する様になります。

s03_PersistentVolClaim.yml
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