注意

本文档适用于 Ceph 开发版本。

块设备与 Kubernetes

您可以使用 Ceph 块设备镜像与 Kubernetes v1.13 及更高版本通过ceph-csi,它动态地提供 RBD 镜像以支持 Kubernetesvolumes并将这些 RBD 镜像映射为块设备(可选地挂载pod的工作节点上。Ceph 将块设备镜像作为对象跨集群分布,这意味着大型的 Ceph 块设备镜像比独立服务器具有更好的性能!

要使用 Ceph 块设备与 Kubernetes v1.13 及更高版本,您必须在您的 Kubernetes 环境中安装和配置ceph-csi。以下

重要

ceph-csi默认使用 RBD 内核模块,这可能不支持所有CRUSH 调整参数Ceph.

Create a Pool

默认情况下,Ceph 块设备使用rbd池。为 Kubernetes 卷存储创建一个池。确保您的 Ceph 集群正在运行,然后创建池。

$ ceph osd pool create kubernetes

请参阅Create a Pool关于指定池的放置组数量的详细信息,请参阅放置组关于您应该为池设置多少放置组的详细信息。

新创建的池在使用前必须初始化。使用rbd工具初始化池:

$ rbd pool init kubernetes

配置 ceph-csi

设置 Ceph 客户端身份验证

为 Kubernetes 创建一个新用户并ceph-csi。执行以下操作并记录生成的密钥:

$ 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 ConfigMap

The ceph-csi需要一个ConfigMap对象存储在 Kubernetes 中以定义 Ceph 集群的监控地址。收集 Ceph 集群的唯一fsid和监控地址:

$ ceph mon dump
<...>
fsid b9127830-b0cc-4e34-aa47-9d1a2e9949a8
<...>
0: [v2:192.168.1.1:3300/0,v1:192.168.1.1:6789/0] mon.a
1: [v2:192.168.1.2:3300/0,v1:192.168.1.2:6789/0] mon.b
2: [v2:192.168.1.3:3300/0,v1:192.168.1.3:6789/0] mon.c

Note

ceph-csi目前仅支持遗留的 V1 协议.

生成一个csi-config-map.yaml文件类似于以下示例,将fsid替换为“clusterID”,并将监控地址替换为“monitors”:

$ cat <<EOF > csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    [
      {
        "clusterID": "b9127830-b0cc-4e34-aa47-9d1a2e9949a8",
        "monitors": [
          "192.168.1.1:6789",
          "192.168.1.2:6789",
          "192.168.1.3:6789"
        ]
      }
    ]
metadata:
  name: ceph-csi-config
EOF

生成后,将新的ConfigMap对象存储在 Kubernetes 中:

$ kubectl apply -f csi-config-map.yaml

Ceph-CSI 的最新版本ceph-csi also require an additional ConfigMap对象来定义密钥管理服务 (KMS) 提供者详细信息。如果 KMS 没有设置,请在csi-kms-config-map.yaml文件中放置一个空的配置或参考https://github.com/ceph/ceph-csi/tree/master/examples/kms:

$ cat <<EOF > csi-kms-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    {}
metadata:
  name: ceph-csi-encryption-kms-config
EOF

生成后,将新的ConfigMap对象存储在 Kubernetes 中:

$ kubectl apply -f csi-kms-config-map.yaml

Ceph-CSI 的最新版本ceph-csi also require yet another ConfigMap对象

$ cat <<EOF > ceph-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  ceph.conf: |
    [global]
    auth_cluster_required = cephx
    auth_service_required = cephx
    auth_client_required = cephx
  # keyring is a required key and its value should be empty
  keyring: |
metadata:
  name: ceph-config
EOF

生成后,将新的ConfigMap对象存储在 Kubernetes 中:

$ kubectl apply -f ceph-config-map.yaml

生成ceph-csicephxSecret

ceph-csi需要用于与 Ceph 集群通信的 cephx 凭据。生成一个csi-rbd-secret.yaml文件类似于以下示例,使用新创建的 Kubernetes 用户 ID 和 cephx 密钥:

$ cat <<EOF > csi-rbd-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: default
stringData:
  userID: kubernetes
  userKey: AQD9o0Fd6hQRChAAt7fMaSZXduT3NWEqylNpmg==
EOF

生成后,将新的Secret对象存储在 Kubernetes 中:

$ kubectl apply -f csi-rbd-secret.yaml

配置ceph-csi插件

创建所需的ServiceAccount和 RBACClusterRole/ClusterRoleBindingKubernetes 对象。这些对象不一定需要针对您的 Kubernetes 环境进行定制,因此可以直接使用ceph-csi部署 YAML:

$ 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

重要

提供者和节点插件 YAML 默认会拉取ceph-csi容器(quay.io/cephcsi/cephcsi:canary)的开发版本。应更新 YAML 以使用发布版本容器进行生产工作负载。

使用 Ceph 块设备

创建一个StorageClass

KubernetesStorageClass定义了一类存储。可以创建多个StorageClass对象以映射到不同的服务质量级别(即 NVMe 与基于 HDD 的池)和功能。

例如,要创建一个ceph-csi StorageClass映射到上面创建的kubernetes池,可以使用以下 YAML 文件,确保“clusterID”属性与您的 Ceph 集群匹配fsid:

$ 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: b9127830-b0cc-4e34-aa47-9d1a2e9949a8
   pool: kubernetes
   imageFeatures: layering
   csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
   csi.storage.k8s.io/provisioner-secret-namespace: default
   csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
   csi.storage.k8s.io/controller-expand-secret-namespace: default
   csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
   csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
   - discard
EOF
$ kubectl apply -f csi-rbd-sc.yaml

注意,在 Kubernetes v1.14 和 v1.15 中,卷扩展功能处于 alpha 状态,并需要启用ExpandCSIVolumes功能门。

创建一个PersistentVolumeClaim

A PersistentVolumeClaim是用户请求抽象存储资源的方式。然后,该PersistentVolumeClaim将与一个Pod资源相关联以提供PersistentVolume,该 PersistentVolume 将由 Ceph 块镜像支持。可以包括可选的volumeMode来选择挂载的文件系统(默认)或基于原始块设备的卷。

使用ceph-csi,指定FilesystemforvolumeMode可以支持ReadWriteOnceReadOnlyMany 访问模式声明,并指定BlockforvolumeMode可以支持ReadWriteOnce, ReadWriteMany, and ReadOnlyMany 访问模式声明。

例如,要创建一个基于块的PersistentVolumeClaim,可以使用以下 YAML 请求原始块存储从ceph-csi-based StorageClass created above, the following YAML can be used to request raw block storage from the csi-rbd-sc StorageClass:

$ 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

创建的上述 StorageClass,以下 YAML 可以用于请求挂载的文件系统:PersistentVolumeClaimto aPod资源作为原始块设备:

$ 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

To create a file-system-based PersistentVolumeClaim,可以使用以下 YAML 请求挂载的文件系统(由 RBD 图像支持)从ceph-csi-based StorageClass created above, the following YAML can be used to request a mounted file system (backed by an RBD image) from the csi-rbd-sc StorageClass:

$ 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

创建的上述 StorageClass,以下 YAML 可以用于请求挂载的文件系统:PersistentVolumeClaimto aPod resource as a mounted file system:

$ 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

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.