Ceph 與 StorageClass 集成

Ceph RBD 與 StorageClass 綁定

相關文檔解釋

Block Devices and Kubernetes — Ceph Documentationhtml

存儲類 | Kubernetesnode

k8s經過rbd使用ceph,pvc在線擴容nginx

# 配置文件解釋
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"。
  • adminSecretadminId 的 Secret 名稱。該參數是必需的。 提供的 secret 必須有值爲 "kubernetes.io/rbd" 的 type 參數。
  • adminSecretNamespaceadminSecret 的命名空間。默認是 "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
  • userSecretNamespaceuserSecretName 的命名空間。
  • fsType:Kubernetes 支持的 fsType。默認:"ext4"
  • imageFormat:Ceph RBD 鏡像格式,"1" 或者 "2"。默認值是 "1"。
  • imageFeatures:這個參數是可選的,只能在你將 imageFormat 設置爲 "2" 才使用。 目前支持的功能只是 layering。默認是 "",沒有功能打開
  • allowVolumeExpansion: 若是對PVC擴容,則其對應的"storage class"中allowVolumeExpansion字段須要設置成true

具體步驟

您可使用 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-csishell

注意: ceph-csi默認使用 RBD 內核模塊,它可能不支持全部 Ceph CRUSH 可調諧或 RBD image 功能json

imageFormat: "2"
imageFeatures: "layering"api

建立 Pool

默認狀況下,Ceph 塊設備使用池。爲 Kubernetes 卷存儲建立池。確保 Ceph 羣集正在運行,而後建立池。rbd服務器

$ ceph osd pool create kubernetes

新建立的池在使用前必須先初始化。使用該工具初始化池:rbd

$ rbd pool init kubernetes

配置 CEPH-CSI

設置 CEPH 客戶端身份驗證

爲 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 配置映射

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 Secret

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

配置CEPH-CSI插件

建立所需的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 的時候會報錯

kms-config GitHub地址

$ 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 以將發佈版本容器用於生產工做負載。

使用 CEPH 塊設備

建立存儲類

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 是用戶對抽象存儲資源的請求。而後, 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

演示 pod 綁定 RBD 模式 PVC

$ 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

演示 Pod 綁定 cephfs 的 PVC:

$ 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
相關文章
相關標籤/搜索