RBD 和 KUBERNETES(pacific版本)

您可以将 Ceph 块设备映像与 Kubernetes v1.13 以及更高版本通过 ceph -csi一起使用,它动态地提供 RBD 映像以支持 Kubernetes 并将这些 RBD 映像映射为工作节点上的块设备(可选地挂载映像中包含的文件系统)运行引用 RBD 支持的卷的pod 。Ceph 将块设备映像条带化为整个集群中的对象,这意味着大型 Ceph 块设备映像比独立服务器具有更好的性能!

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

重要:ceph-csi默认使用 RBD 内核模块,它可能不支持所有 Ceph CRUSH 可调参数RBD 映像特性

1. 创建一个池

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

$ ceph osd pool create kubernetes

有关为池指定归置组数量的详细信息,请参阅创建池,有关应为池设置的归置数量的详细信息,请参阅归置组。

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

$ rbd pool init kubernetes

2. 配置 CEPH-CSI

2.1 设置 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==

2.2 生成CEPH-CSI CONFIGMAP 

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

$ 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

笔记:ceph-csi目前只支持旧版 V1 协议

生成类似于以下示例的csi-config-map.yaml文件,将 fsid 替换为“clusterID”,并将MON地址替换为“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

2.3 生成CEPH -CSI CEPHX SECRET 

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

$ 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

2.4 配置 CEPH-CSI 插件

创建所需的 ServiceAccount 和 RBAC ClusterRole / ClusterRoleBinding Kubernetes 对象。这些对象不一定需要为您的 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

重要:默认情况下,provisioner 和节点插件 YAML 将拉取 ceph -csi 容器的开发版本 (quay.io/cephcsi/cephcsi:canary)。应更新 YAML 以将发布版本容器用于生产工作负载。

3. 使用 CEPH 块设备

3.1 创建一个存储类

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

例如,要创建一个映射到上面创建的kubernetes池的 ceph -csi StorageClass , 在确保“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: b9127830-b0cc-4e34-aa47-9d1a2e9949a8
   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
reclaimPolicy: Delete
mountOptions:
   - discard
EOF
$ kubectl apply -f csi-rbd-sc.yaml

3.2 创建一个PERSISTENTVOLUMECLAIM

PersistentVolumeClaim是用户对抽象存储资源的请求。然后PersistentVolumeClaim将与Pod资源相关联以提供PersistentVolume,该 PersistentVolume 将由 Ceph 块映像支持。可以包含可选的volumeMode以在已挂载的文件系统(默认)或基于原始块设备的卷之间进行选择。

使用 ceph -csi ,为 volumeMode 指定 Filesystem 可以同时支持 ReadWriteOnce ReadOnlyMany accessMode 声明, 为 volumeMode 指定 Block 可以支持ReadWriteOnceReadWriteMany和 ReadOnlyMany accessMode声明。

例如,要使用上面创建的基于 ceph-csi StorageClass创建基于块的PersistentVolumeClaim,可以使用以下 YAML 从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

下面演示了将上述 PersistentVolumeClaim作为原始块设备绑定到Pod资源的示例:

$ 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 StorageClass创建基于文件系统的PersistentVolumeClaim, 可以使用以下 YAML 从csi-rbd-sc StorageClass请求已安装的文件系统(由 RBD 映像支持):

$ 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

下面演示了将上述 PersistentVolumeClaim 绑定到 Pod 资源作为挂载文件系统的示例:

$ 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

 

posted @ 2022-04-11 15:50  Varden  阅读(290)  评论(0编辑  收藏  举报