Kubernetes 持久化存储 Cephfs
熟悉kubernetes volume的同學應該了解,kubernetes 對volume的提供支持“靜態PV”和“動態PV”兩種方式。
-
靜態PV:集群管理員創建一些PV,之后便可用于PVC消費。
-
動態PV:相比靜態PV而言,動態PV無需管理員手動創建PV,PV的操作是由一個叫StorageClass的控制器創建。對于Cephfs volume來說,截止到kubernetes 1.16版本并沒有直接提供Cephfs的StorageClass。
?
雖然官方并沒有直接提供對Cephfs StorageClass的支持,但是社區給出了類似的解決方案 external-storage/cephfs,后面我們會使用到。
地址:https://github.com/kubernetes-incubator/external-storage
1.?靜態PV
編輯?Cephfs PV 對象文件?cephfs-pv.yaml
apiVersion: v1kind: PersistentVolumemetadata: name: cephfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteMany cephfs: monitors: - 192.168.0.3:6789 user: kube secretRef: name: secret-for-cephfs readOnly: false persistentVolumeReclaimPolicy: Recycle創建 PV:$?kubectl?create?-f?cephfs-pv.yaml?-n?cephfs
$?kubectl?get?pv?-n?cephfs創建PVC:
$?vim?cephfs-pv-claim.yamlapiVersion:?v1kind:?PersistentVolumeClaimmetadata:??name:?cephfs-pv-claim??namespace:?cephfs?spec:??accessModes:????-?ReadWriteMany??resources:????requests: storage: 1Gi在 deployment 中使用 PV:
??
apiVersion: apps/v1kind:?Deploymentmetadata:??name:?cephfs-pvc??namespace:?cephfsspec:??replicas:?2??template:????metadata: labels:????????app:?cephfs-pvc????spec:??????containers:??????-?name:?nginx????????image:?busybox:latest????????volumeMounts:????????-?name:?cephfs-pv??????????mountPath:?/data/cephfs??????????readOnly:?false??????volumes:??????-?name:?cephfs????????persistentVolumeClaim: claimName: cephfs-pv-claim這樣,在同一個deployment中的2個pod容器內都可以讀寫同一個cephfs volume了。
2.?動態PV
對于規模不大的容器平臺而言,靜態PV方式就可以滿足需求;但是當容器規模很大時,你不知道用戶什么時候創建PV,因此動態PV方式就非常有用了。下面我們看下如何基于 external-storage/cephfs 來實現動態PV。
?
部署 cephfs-provisioner
cephfs-provisioner 是 kubernetes 官方社區提供的Cephfs的StorageClass支持。用于動態的調用后端存儲Cephfs創建PV。
cephfs-provisoner 的實現機制如圖所示:
?
它主要是包含兩部分:
-
cephfs-provisoner.go
是cephfs-provisoner(cephfs的StorageClass)的核心,主要是 watch kubernetes中 PVC 資源的CURD事件,然后以命令行方式調用 cephfs_provisor.py腳本創建PV。
-
cephfs_provisoner.py
python 腳本實現的與cephfs交互的命令行工具。cephfs-provisoner 對cephfs端volume的創建都是通過該腳本實現。里面封裝了volume的增刪改查等功能。
創建 StorageClass:
$?kubectl?create?-f?class.yaml$ kubectl get sc -n cephfsNAME PROVISIONER AGEcephfs ceph.com/cephfs 33d基于RBAC授權方式啟動cephfs-provisioner:
$?kubectl?create?-f??*$ kubectl get deploy -n cephfs這樣動態創建PV的環境就準備好了。
?
動態PV方式,無需再手動創建PV,只需創建PVC,cephfs-provisoner會自動的為該PVC在后端cephfs存儲上創建對應的PV。
kind:?PersistentVolumeClaimapiVersion:?v1metadata:??name:?pvc-1??annotations:????volume.beta.kubernetes.io/storage-class:?"cephfs"spec:??accessModes:????-?ReadWriteMany??resources:????requests: storage: 1Gi此時,我們創建PVC后,會看到同時會自動創建并綁定上一個PV。
?
至此,基于 cephfs 的動態PV方式就介紹完了。
?
cephfs-provisoner的坑
?
在使用 cephfs-provisoner 與公司 cephfs 對接的時候遇到了一些坑,在這里一并說一下。
?
-
路徑問題
?
在 cephfs_provisioner/ cephfs_provisioner.py 的實現中,默認在cephfs中創建的根目錄名是”kubernetes“,所有后續創建的卷都在cephfs端的 /kubernetes/ 一級目錄下 ,代碼實現中以VOlUME_GROUP="kubernetes"定義。因此,如果你不想在 cephfs 中以該名字命名,需要修改VOLUME_GROUP值。
?
另外,它的二級目錄也是固定的為/kubernetes/volumes,二級目錄是python-cephfs模塊中由DEFAULT_VOL_PREFIX變量定義:POOL_PREFIX = "fsvolume_"
DEFAULT_VOL_PREFIX = "/volumes" DEFAULT_NS_PREFIX = "fsvolumens_"因此,要定制化在cephfs端的一級和二級目錄,需要修改這兩個地方。
?
-
權限問題
?
這里遇到兩個權限問題:
?
掛載權限問題
默認python-cephfs模塊在連接cephfs掛載時是mount的根目錄”/“。
?
而根目錄只有admin用戶才有權限進行掛載,所以這個地方除了admin用戶外,沒辦法使用其它用戶。但是,我們在使用cephfs時,為了安全,管理員是不會給我們admin用戶使用的,所以這個地方肯定是接受不了的。為此,我們定制修改了libcephfs2和python-cephfs的源碼,增加了connect_with_path方法,允許指定掛載的目錄,這樣我們只要在掛載時不使用根目錄即可。?
?
? ?2. 讀寫權限問題
在 cephfs_provisoner.py 的實現中,默認添加了對 cephfs namespace的支持,因此在對volume授權時會添加對namespace 相關的權限設置。因為,我們使用的ceph版本luminous沒有對namespace進行支持,所以,在使用時產生了創建的volume掛載到pod內后沒有讀寫權限"input/output error"的問題。此時,你在cephfs端查看卷的讀寫權限時,你可以看到目錄讀寫權限都是問號。于是我們修改了這部分邏輯,去掉了 namespace 相關的部分。
總結
以上是生活随笔為你收集整理的Kubernetes 持久化存储 Cephfs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: servlet+JQuery ajax以
- 下一篇: packer build 报错 无任何输