天天看點

k8s: pod has unbound PersistentVolumeClaims問題解決

1. 背景

使用helm chart 部署redis-ha的時候 pod報錯 pod has unbound PersistentVolumeClaims

k8s: pod has unbound PersistentVolumeClaims問題解決

2. 原因分析

檢視了 redis-ha的 charts檔案,發現value.yaml 中的storageClassName 取數為空,當storageClassName為空的時候如果沒有指定 DefaultStorageClass ,那麼是不會配置設定 pv給 claim的。

3. 說明一下DefaultStorageClass

PVC和PV的綁定是通過StorageClassName進行的。然而如果定義PVC時沒有指定StorageClassName呢?這取決與admission插件是否開啟了DefaultDefaultStorageClass功能:

如果DefaultDefaultStorageClass功能開啟,那麼此PVC的StorageClassName就會被指定為DefaultStorageClass。DefaultStorageClass從何處而來呢?原來在定義StorageClass時,可以在Annotation中添加一個鍵值對:storageclass.kubernetes.io/is-default-class: true,那麼此StorageClass就變成預設的StorageClass了。

如果DefaultDefaultStorageClass功能沒有開啟,那麼沒有指定StorageClassName的PVC隻能被綁定到同樣沒有指定StorageClassName的PV。

檢視了我們環境中的storageclass 定義,發現沒有開啟DefaultDefaultStorageClass功能。

4. 解決辦法

修改chart 檔案中的pvc 取值, 讓storageClass=現有的storageclass name

建立storageClass(依據class.yaml 和 deployment.yaml )

k8s: pod has unbound PersistentVolumeClaims問題解決
[[email protected] dpv]$ kubectl get sc
NAME                  PROVISIONER   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage   westos/nfs    Delete          Immediate           false                  42m
[[email protected] dpv]$ 
           

修改value.yaml

k8s: pod has unbound PersistentVolumeClaims問題解決

過一會兒再次檢視pod狀态 ,已經running

[[email protected] ~]$ kubectl get pod -n redis 
NAME                READY   STATUS    RESTARTS   AGE
redis-ha-server-0   2/2     Running   0          22m
redis-ha-server-1   2/2     Running   0          8m48s