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