Saat melakukan membuat Proof of Concept (POC) di Minikube untuk Redis HA, saya mendapat issue, PVC statusnya masih pending dan setelah dicari tau ternyata issue tersebut karena PV di kubernetes belum dibuat. Solusinya disini tidak bisa digunakan di AWS, Azure ataupun Google Cloud karena jenis storage yang dibutuhkan berbeda, tetapi untuk cara troubleshooting sama.
Contoh error yang muncul di events anda describe
$ kubectl get events -n infra -w 45s Warning FailedScheduling pod/redis-redis-ha-server-0 0/2 nodes are available: persistentvolumeclaim "data-redis-redis-ha-server-0" bound to non-existent persistentvolume "data-redis-0". preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling..
Solusi
Cara troubleshooting dan solusi atas masalah ini akan kita bahas disini
1. Cek PVC
Cek status PVC di namespace yang bersangkutan
$ kubectl get pvc -n infra NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-redis-redis-ha-server-0 Pending standard 9m59s
untuk lebih detail kenapa statusnya pending, coba di describe
$ kubectl describe pvc/data-redis-redis-ha-server-0 -n infra # output ... Normal ExternalProvisioning 52s (x43 over 10m) persistentvolume-controller Waiting for a volume to be created either by the external provisioner 'k8s.io/minikube-hostpath' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.
Cek berapa ukuran storage yang direquest oleh PVC dan accessModes
kubectl get pvc/data-redis-redis-ha-server-0 -o yaml -n infra # output spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi
accessModes
harus sesuai dengan accessModes
di PVC, untuk storage minimum storage yang tersedia di PV harus lebih besar atau sama dengan yang direquest PVC.
karena PVC dibuat dari PV, maka cek juga object tersebut
$ kubectl get pv
# output
No resources found
pada kasus ini karena cluster ini baru, belum ada PV yang dibuat sebelumnya yang bisa memberikan kebutuhan storage yang diminta oleh PVC.
2. Buat PV
Buat pv.yaml
yang berisi
apiVersion: v1 kind: PersistentVolume metadata: name: pv-data-01 spec: storageClassName: standard capacity: storage: 20Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete hostPath: path: "/tmp/data-redis-0"
deploy object pv tersebut
kubectl apply -f pv.yaml
tunggu beberapa saat hingga PV dibuat, lalu cek juga PVC, seharusnya statusnya sudah bound
$ kubectl get pvc -n infra NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-redis-redis-ha-server-0 Bound pv-data-01 10Gi RWO standard 5m
Bila anda menemukan issue seperti ini di cluster Kubernetes anda baca referensi cloud provider masing-masing, untuk mendapatkan informasi yang lebih akurat.