Kubernetes集成Ceph

半兽人 发表于: 2023-11-01   最后更新时间: 2023-11-03 17:33:51  
{{totalSubscript}} 订阅, 384 游览

Ceph块设备 和 Kubernetes

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

要在 Kubernetes v1.13 及更高版本中使用 Ceph 块设备,必须在 Kubernetes 环境中安装和配置 ceph-csi。下图描述了 Kubernetes/Ceph 技术栈。

Kubernetes集成Ceph

重要:
ceph-csi 默认使用 RBD 内核模块,这些模块可能不支持所有 Ceph CRUSH可调变量RBD镜像功能。

创建一个POOL

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

ceph osd pool create kubernetes

有关为池指定放置组数量的详情,请参阅创建池;有关应为池设置的放置组数量的详情,请参阅放置组

新创建的池在使用前必须初始化。使用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 配置表

ceph-csi 需要一个存储在 Kubernetes 中的 ConfigMap 对象来定义 Ceph 群集的 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

生成与以下示例类似的 csi-config-map.yaml 文件,将 “clusterID” 替换为 fsid,将“monitors” 替换为monitor地址:

$ 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

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

kubectl apply -f csi-config-map.yaml

最新版本的 ceph-csi 还需要一个额外的 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

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

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

最新版本的 ceph-csi 还需要另一个 ConfigMap 对象来定义 Ceph 配置,以便添加到 CSI 容器内的 ceph.conf 文件中:

$ 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

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

kubectl apply -f ceph-config-map.yaml

生成 ceph-csi cephx 秘密

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

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

kubectl apply -f csi-rbd-secret.yaml

配置 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 provisioner 和节点插件。除了 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)

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
   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 是用户对抽象存储资源的请求。然后,PersistentVolumeClaim 将与 Pod 资源关联,以提供 PersistentVolume,该卷将由 Ceph 块映像支持。可选的 volumeMode 可用于选择挂载文件系统(默认)或基于原始块设备的卷。

使用 ceph-csi,为 volumeMode 指定 Filesystem 可以支持 ReadWriteOnce 和 ReadOnlyMany 访问模式声明,为 volumeMode 指定 Block 可以支持 ReadWriteOnce、ReadWriteMany 和 ReadOnlyMany 访问模式声明。

例如,要创建一个基于块的 PersistentVolumeClaim,并利用上面创建的基于 ceph-csi 的 StorageClass,可使用以下 YAML 向 csi-rbd-sc StorageClass 请求raw块存储:

$ 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

要创建基于文件系统的 PersistentVolumeClaim,并利用上面创建的基于 ceph-csi 的 StorageClass,可以使用下面的 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

REF

https://docs.ceph.com/en/latest/rbd/rbd-integrations/

更新于 2023-11-03
在线,8小时前登录

查看ceph更多相关的文章或提一个关于ceph的问题,也可以与我们一起分享文章