Block Devices and Kubernetes — Ceph Documentationhtml
存儲類 | Kubernetesnode
# 配置文件解釋 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast provisioner: kubernetes.io/rbd parameters: monitors: 10.16.153.105:6789 adminId: kube adminSecretName: ceph-secret adminSecretNamespace: kube-system pool: kube userId: kube userSecretName: ceph-secret-user userSecretNamespace: default fsType: ext4 imageFormat: "2" imageFeatures: "layering" allowVolumeExpansion: true
monitors
:Ceph monitor,逗號分隔。該參數是必需的。adminId
:Ceph 客戶端 ID,用於在池 ceph 池中建立 image 。默認是 "admin"。adminSecret
:adminId
的 Secret 名稱。該參數是必需的。 提供的 secret 必須有值爲 "kubernetes.io/rbd" 的 type 參數。adminSecretNamespace
:adminSecret
的命名空間。默認是 "default"。pool
: Ceph RBD 池. 默認是 "rbd"。userId
:Ceph 客戶端 ID,用於映射 RBD 鏡像。默認與 adminId
相同。git
userSecretName
:用於映射 RBD 鏡像的 userId
的 Ceph Secret 的名字。 它必須與 PVC 存在於相同的 namespace 中。該參數是必需的。 提供的 secret 必須具備值爲 "kubernetes.io/rbd" 的 type 參數,例如以這樣的方式建立:github
kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" \ --from-literal=key='QVFEQ1pMdFhPUnQrSmhBQUFYaERWNHJsZ3BsMmNjcDR6RFZST0E9PQ==' \ --namespace=kube-system
userSecretNamespace
:userSecretName
的命名空間。fsType
:Kubernetes 支持的 fsType。默認:"ext4"
。imageFormat
:Ceph RBD 鏡像格式,"1" 或者 "2"。默認值是 "1"。imageFeatures
:這個參數是可選的,只能在你將 imageFormat
設置爲 "2" 才使用。 目前支持的功能只是 layering
。默認是 "",沒有功能打開您可使用 Ceph Block 設備 image 與 Kubernetes v1.13 和之後經過ceph-csi,它動態地提供 RBD image 以支持 Kubernetes 卷,並映射這些 RBD image 做爲塊設備(可選地安裝 image 中包含的文件系統)在運行線程的運行窗格,以引用 RBD 支持的卷。 Ceph 設備 image 做爲整個羣集的對象進行塊設備管理,這意味着大型 Ceph Block 設備 image 比獨立服務器具備更好的性能!web
若要將 Ceph Block 設備與 Kubernetes v1.13 及更高版本一塊兒使用,必須在 Kubernetes 環境中安裝和配置。下圖描述了 Kubernetes/Ceph。ceph-csi
shell
注意:
ceph-csi
默認使用 RBD 內核模塊,它可能不支持全部 Ceph CRUSH 可調諧或 RBD image 功能。jsonimageFormat: "2"
imageFeatures: "layering"api
默認狀況下,Ceph 塊設備使用池。爲 Kubernetes 卷存儲建立池。確保 Ceph 羣集正在運行,而後建立池。rbd
服務器
$ ceph osd pool create kubernetes
新建立的池在使用前必須先初始化。使用該工具初始化池:rbd
$ rbd pool init kubernetes
爲 kubernetes 和 ceph-csi 建立一個新用戶。執行如下操做並記錄生成的密鑰:
注意:
目前版本可能存在 Bug, kubernetes 用戶在進行認證受權後,k8s 生成的 pod 申請PVC 的時候會顯示認證失敗,使用 admin 用戶就沒有此問題。因此建議直接採用 admin 用戶
$ ceph auth list client.admin key: AQBvGNtf5hzJERAAvnOqP+1AkODNYL43/dssGA== caps: [mds] allow * caps: [mgr] allow * caps: [mon] allow * caps: [osd] allow * # OR $ ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes' [client.kubernetes] key = AQD9o0Fd6hQRChAAt7fMaSZXduT3NWEqylNpmg==
ceph-csi須要存儲在 Kubernetes 中的ConfigMap對象來定義 Ceph 羣集的 Ceph 監視器地址。收集 Ceph 羣集惟一 fsid和監視器地址:
[root@node1 ~]# ceph mon dump fsid 3f5560c6-3af3-4983-89ec-924e8eaa9e06 [root@node1 ~]# ceph -s cluster: id: 3f5560c6-3af3-4983-89ec-924e8eaa9e06 health: HEALTH_OK
注意 ceph-csi
目前僅支持傳統的V1 協議。
生成相似於如下示例的 csi-config-map.yaml文件,將fsid替換爲"clusterID",將監視器地址替換爲"監視器":
$ cat <<EOF > csi-config-map.yaml --- apiVersion: v1 kind: ConfigMap data: config.json: |- [ { "clusterID": "3f5560c6-3af3-4983-89ec-924e8eaa9e06", "monitors": [ "192.168.6.160:6789", "192.168.6.161:6789", "192.168.6.162:6789" ] } ] metadata: name: ceph-csi-config EOF
生成後,將新的ConfigMap 對象存儲在 kubernetes :
$ kubectl apply -f csi-config-map.yaml
ceph-csi須要 cephx 憑據才能與 Ceph 羣集通訊。使用新建立的 Kubernetes 用戶 ID 和 cephx 密鑰生成相似於如下示例的csi-rbd-secret.yaml文件:
注意:
由於kubernetes用戶會報錯,我使用的 admin 用戶
$ cat <<EOF > csi-rbd-secret.yaml --- apiVersion: v1 kind: Secret metadata: name: csi-rbd-secret namespace: default stringData: userID: admin # 用戶名 userKey: AQBvGNtf5hzJERAAvnOqP+1AkODNYL43/dssGA== # 用戶key EOF
生成後,將新的機密對象存儲在 kubernetes :
$ kubectl apply -f csi-rbd-secret.yaml
建立所需的ServiceAccount和 RBAC羣集區域/羣集區域綁定 kubernetes 對象。這些對象不必定須要針對您的 Kubernetes 環境進行自定義,所以能夠從ceph-csi 部署 YAM使用:
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml $ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml
最後,建立ceph-csi預配和節點插件。除了ceph-csi 容器發佈版本以外,這些對象不必定須要針對您的 Kubernetes 環境進行自定義,所以能夠按樣使用ceph-csi部署 YAML:
$ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml $ kubectl apply -f csi-rbdplugin-provisioner.yaml $ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml $ kubectl apply -f csi-rbdplugin.yaml
默認會缺乏一個 kms-csi 的一個文件, 致使生成 pod 的時候會報錯
$ cat kms-config.yaml --- apiVersion: v1 kind: ConfigMap data: config.json: |- { "vault-test": { "encryptionKMSType": "vault", "vaultAddress": "http://vault.default.svc.cluster.local:8200", "vaultAuthPath": "/v1/auth/kubernetes/login", "vaultRole": "csi-kubernetes", "vaultPassphraseRoot": "/v1/secret", "vaultPassphrasePath": "ceph-csi/", "vaultCAVerify": "false" }, "vault-tokens-test": { "encryptionKMSType": "vaulttokens", "vaultAddress": "http://vault.default.svc.cluster.local:8200", "vaultBackendPath": "secret/", "vaultTLSServerName": "vault.default.svc.cluster.local", "vaultCAVerify": "false", "tenantConfigName": "ceph-csi-kms-config", "tenantTokenName": "ceph-csi-kms-token", "tenants": { "my-app": { "vaultAddress": "https://vault.example.com", "vaultCAVerify": "true" }, "an-other-app": { "tenantTokenName": "storage-encryption-token" } } } } metadata: name: ceph-csi-encryption-kms-config $ kubectl apply -f kms-config.yaml
重要說明 預配器和節點插件YAM將默認提取ceph-csi 容器(quay.io/cephcsi/cephcsi:canary)。應更新 YAML 以將發佈版本容器用於生產工做負載。
Kubernetes存儲類定義存儲類。能夠建立多個 StorageClass 對象以映射到不一樣的服務質量級別(即 NVMe 與基於 HDD 的池)和功能。
例如,若要建立映射到上面建立的kubernetes池的ceph-csi存儲類,在確保"clusterID"屬性與 Ceph 羣集的fsid匹配後,可使用如下 YAML 文件:
$ cat <<EOF > csi-rbd-sc.yaml --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-rbd-sc provisioner: rbd.csi.ceph.com parameters: clusterID: 3f5560c6-3af3-4983-89ec-924e8eaa9e06 pool: kubernetes csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret csi.storage.k8s.io/provisioner-secret-namespace: default csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret csi.storage.k8s.io/node-stage-secret-namespace: default imageFormat: "2" imageFeatures: "layering" reclaimPolicy: Delete mountOptions: - discard EOF $ kubectl apply -f csi-rbd-sc.yaml
PVC 是用戶對抽象存儲資源的請求。而後, PVC 將關聯到Pod資源以預配持久卷,該資源將由 Ceph 塊 image 支持。能夠選擇可選的 VolumeMode,用於在裝載的文件系統(默認)或基於原始塊設備的卷之間進行選擇。
使用ceph-csi ,爲卷模式指定文件系統能夠同時支持讀取寫入一個和讀取單一多訪問模式聲明,而指定卷模式的塊能夠支持讀取寫入一下,讀取寫入多,和讀取單一多訪問模式聲明。
例如,要建立一個基於塊的 PVC ,該聲明利用上面建立的基於 ceph-csi的存儲類,可使用如下 YAML 從csi-rbd-sc 存儲類請求原始塊存儲:
$ cat <<EOF > raw-block-pvc.yaml --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: raw-block-pvc spec: accessModes: - ReadWriteOnce volumeMode: Block resources: requests: storage: 1Gi storageClassName: csi-rbd-sc EOF $ kubectl apply -f raw-block-pvc.yaml
$ cat <<EOF > raw-block-pod.yaml --- apiVersion: v1 kind: Pod metadata: name: pod-with-raw-block-volume spec: containers: - name: fc-container image: fedora:26 command: ["/bin/sh", "-c"] args: ["tail -f /dev/null"] volumeDevices: - name: data devicePath: /dev/xvda volumes: - name: data persistentVolumeClaim: claimName: raw-block-pvc EOF $ kubectl apply -f raw-block-pod.yaml
若要建立使用上面建立的基於ceph-csi 的基於 cephfs PVC ,可使用如下 YAML 從csi-rbd-sc存儲類請求裝載的文件系統(由 RBD image 支持) :
$ cat <<EOF > pvc.yaml --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: rbd-pvc spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 1Gi storageClassName: csi-rbd-sc EOF $ kubectl apply -f pvc.yaml
$ cat <<EOF > pod.yaml --- apiVersion: v1 kind: Pod metadata: name: csi-rbd-demo-pod spec: containers: - name: web-server image: nginx volumeMounts: - name: mypvc mountPath: /var/lib/www/html volumes: - name: mypvc persistentVolumeClaim: claimName: rbd-pvc readOnly: false EOF $ kubectl apply -f pod.yaml