StatufulSet volumeClaimTemplates をIKSで動作させる方法



Kubernetes StatfulSetのチュートリアル https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#creating-a-statefulset にある YAMLファイルをIKS (IBM Cloud Kubernetes Service)で動作させるためのメモです。

## 問題
 
このリンク先のYAMLをGKEに適用すると動作するが、IKSに適用すると、StatefulSetのポッドを起動することができない。

~~~
$ kubectl apply -f web.yml
service "nginx" created
statefulset "web" created

$ kubectl get sts
NAME      DESIRED   CURRENT   AGE
web       2         1         3m
~~~

原因は、ストレージクラスの指定が無く、Persistent Volume が無いメッセージが表示されペンディングとなる。(no persistent volumes available for this claim and no storage class is set)

~~~
$ kubectl get pvc
NAME        STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
www-web-0   Pending                                                      3m

$ kubectl describe pvc www-web-0
Name:          www-web-0
Namespace:     default
StorageClass:  
Status:        Pending
Volume:        
Labels:        app=nginx
Annotations:   <none>
Finalizers:    []
Capacity:      
Access Modes:  
Events:
  Type    Reason         Age               From                         Message
  ----    ------         ----              ----                         -------
  Normal  FailedBinding  1s (x5 over 55s)  persistentvolume-controller  no persistent volumes available for this claim and no storage class is set
~~~


## 対策

storageClassName: ibmc-file-bronzeを追加すること、および、ストレージサイズを20Giを設定する。 

~~~
$ diff -c web-gke.yml web-iks.yml 
*** web.yml	2018-06-09 20:11:20.000000000 +0900
--- web.yml	2018-06-09 20:20:55.000000000 +0900
***************
*** 41,46 ****
        name: www
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
!           storage: 1Gi
--- 41,47 ----
        name: www
      spec:
        accessModes: [ "ReadWriteOnce" ]
+       storageClassName: ibmc-file-bronze
        resources:
          requests:
!           storage: 20Gi
~~~


IKSの永続ボリュームのストレージクラスは、以下があります。

~~~
$ kubectl get storageclasses
NAME                      PROVISIONER        AGE
default                   ibm.io/ibmc-file   118d
ibmc-file-bronze          ibm.io/ibmc-file   39d
ibmc-file-custom          ibm.io/ibmc-file   39d
ibmc-file-gold            ibm.io/ibmc-file   39d
ibmc-file-retain-bronze   ibm.io/ibmc-file   39d
ibmc-file-retain-custom   ibm.io/ibmc-file   39d
ibmc-file-retain-gold     ibm.io/ibmc-file   39d
ibmc-file-retain-silver   ibm.io/ibmc-file   39d
ibmc-file-silver          ibm.io/ibmc-file   39d
~~~

一方、GKEのストレージクラスをリストすると次の様になります。

~~~
$ kubectl config use-context gke-cluster-1
Switched to context "gke-cluster-1".

$ kubectl get storageclasses
NAME                 PROVISIONER            AGE
standard (default)   kubernetes.io/gce-pd   2d
~~~

IKSは選択肢が多いので、指定する必要があるようです。

それから、IKSの永続ストレージは、20Gi〜1200Giとなっており、最小量が20Giでした。

~~~
$ kubectl describe storageclasses ibmc-file-bronze
Name:            ibmc-file-bronze
IsDefaultClass:  No
Annotations:     kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"labels":{"addonmanager.kubernetes.io/mode":"Reconcile","kubernetes.io/cluster-service":"true"},"name":"ibmc-file-bronze","namespace":""},"parameters":{"classVersion":"2","iopsPerGB":"2","reclaimPolicy":"Delete","sizeRange":"[20-12000]Gi","type":"Endurance"},"provisioner":"ibm.io/ibmc-file"}
,storageclass.beta.kubernetes.io/is-default-class=
Provisioner:    ibm.io/ibmc-file
Parameters:     classVersion=2,iopsPerGB=2,reclaimPolicy=Delete,sizeRange=[20-12000]Gi,type=Endurance
ReclaimPolicy:  Delete
Events:         <none>
~~~


ということで、YAMLを少し修正すると、次のように動作しました。

IKSでのStatefulSetの動作状態

~~~
$ kubectl get sts 
NAME      DESIRED   CURRENT   AGE
web       2         2         2m

$ kubectl get pvc
NAME        STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
www-web-0   Bound     pvc-7f2ecd31-6bd4-11e8-b027-ee19c07a9ac9   20Gi       RWO            ibmc-file-bronze   3m
www-web-1   Bound     pvc-c4de5ffb-6bd4-11e8-b027-ee19c07a9ac9   20Gi       RWO            ibmc-file-bronze   1m
~~~


GKEでのStatefulSetの動作状態

~~~
$ kubectl get sts
NAME      DESIRED   CURRENT   AGE
web       2         2         2m

$ kubectl get pvc
NAME        STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
www-web-0   Bound     pvc-c442bc4e-6ba6-11e8-83ef-42010a92012c   2G         RWO            standard       2m
www-web-1   Bound     pvc-f4d21239-6ba6-11e8-83ef-42010a92012c   2G         RWO            standard       1m
~~~