ljzsdut
GitHubToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeBack to homepage

12 Ceph对接k8s

storageClass

k8s对接rbd-官方文档

rf5MK6-1633866446393

ceph-csi 默认使用 RBD 内核模块,该模块可能不支持所有 Ceph CRUSH tunablesRBD image features

1、创建Pool

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

ceph osd pool create kubernetes 64

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

rbd pool init kubernetes

2、配置CEPH-CSI

在ceph中创建一个名称为kubernetes的新用户。

ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes'

创建CEPH-CSI的configmap:

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

$ 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

$ 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

$ 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

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

为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

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

配置CEPH-CSI插件:

创建所需的 ServiceAccount 和 RBAC ClusterRole/ClusterRoleBinding Kubernetes 对象:

$ 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和节点插件。:

$ 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 以将发布版本容器用于生产工作负载。

3、使用ceph块设备

创建一个storageclass

例如,要创建一个映射到上面创建的 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 功能门。

创建一个pvc

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


$ 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


$ 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

以下内容可能已经过时

以下内容可能已经过时

以下内容可能已经过时

前提:k8s集群的各个节点安装ceph-common程序包

1、创建rbd相关的存储池,并创建测试使用的image,以rbddata/myimg为例

ceph osd pool create rbddata 64 64
rbd pool init rbddata
rbd create rbddata/myimg --size 2Gi

2、创建拥有访问相关存储池的用户账号,以k8s为例

ceph auth get-or-create client.k8s mon 'allow r' osd 'allow * pool=rbddata' -o ceph.client.k8s.keyring  

将keyring和ceph.conf文件拷贝到k8s各个节点的/etc/ceph/目录下(如果volume使用secret的方式,可以不拷贝keyring文件)

3、在k8s各个节点,以ceph上k8s用户验证:

rbd --user=k8s -p rbddata ls

4、创建Pod使用rbd

pod内挂载rbd,实际是rbd设备挂载到了node节点上,然后被pod使用。并非是rbd设备直接挂载到pod内。

  • 以keyring接入ceph
  • 以secret方式接入ceph