zoukankan      html  css  js  c++  java
  • k8s中使用ceph-csi在ceph中进行数据持久化

    一、具体相关文档可以查看ceph官网:

    https://docs.ceph.com/docs/master/rbd/rbd-kubernetes/

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

    该映像会动态配置RBD映像以支持Kubernetes 卷并将这些RBD映像映射为工作节点上的块设备(可选地安装映像中包含的文件系统)引用RBD支持的卷的运行 Pod

    三、首先我们需要一个部署一个ceph存储集群以及k8s集群,如果没有部署相关集群(可以参数之前文档部署ceph存储以及k8s集群)

    1、首先需要在我们ceph上面创建一个存储池:

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

    [root@ceph-admin ceph]# ceph osd pool create kubernetes
    
    pool ' kubernetes' created

    查看ceph里面有哪些存储池:

    [root@ceph-admin ceph]# ceph osd pool ls
    rbd
    cephfs_data
    cephfs_metadata
    jenkins
    kubernetes

    三、配置ceph-csi

    1、首先需要在k8s上面安装ceph客户端:

    yum -y install ceph # 注意需要配置ceph的相关yum源,可以从ceph集群那台主机上面将ceph的yum源拷贝到k8s集群的所有节点上面

    2、设置CEPH客户端身份验证:

    [root@ceph-admin ceph]# cat /etc/ceph/ceph.client.admin.keyring 
    [client.admin]
    key = AQAs89depA23NRAA8yEg0GfHNC/uhKU9jsgp6Q==
    caps mds = "allow *"
    caps mon = "allow *"
    caps osd = "allow *"

    这里我们需要将/etc/ceph/ceph.client.admin.keyring 复制到k8s集群的所有节点上。

    在CEPH-CSI需要ConfigMap存储在Kubernetes以限定一个Ceph监视器地址为Ceph的群集对象。收集Ceph集群唯一的fsid和监视器地址:

    查看cephfsid和监视器地址:

    [root@ceph-admin ceph]# ceph mon dump
    dumped monmap epoch 1
    epoch 1
    fsid be5bb59c-4033-4a7a-82b5-5ef6f098548d
    last_changed 2020-06-04 02:59:56.424318
    created 2020-06-04 02:59:56.424318
    0: 192.168.111.169:6789/0 mon.ceph-admin

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

    注意 ceph-csi当前仅支持旧版V1协议。

    cat <<EOF> csi-config-map.yaml
    
    apiVersion: v1
    kind: ConfigMap
    data:
    config.json: |-
    [
    {
    "clusterID": "be5bb59c-4033-4a7a-82b5-5ef6f098548d",   # 这是上面使用ceph mon dump查看
    "monitors": [
    "192.168.111.169:6789"
    ]
    }
    ]
    metadata:
        name: ceph-csi-config
    
    EOF

    部署config-map:

    kubectl apply -f csi-config-map.yaml

    4、使用新创建的admin 用户ID和cephx密钥生成secret

    cat <<EOF > csi-rbd-secret.yaml
    
    apiVersion: v1
    kind: Secret
    metadata:
    name: csi-rbd-secret
    namespace: default
    stringData:
    userID: admin
    userKey: AQAs89depA23NRAA8yEg0GfHNC/uhKU9jsgp6Q==
    
    EOF
    
    部署secret
    
    kubectl apply -f csi-rbd-secret.yaml

    5、配置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

    6、最后,创建ceph-csi设置程序和节点插件

    wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
    
    vim csi-rbdplugin-provisioner.yaml

     按照上图注释:ceph-csi-encryption-kms-config (因为本地没有ceph-csi-encryption-kms-config配置,所以需要注释点,否则部署是失败)

    kubectl apply -f csi-rbdplugin-provisioner.yaml
    
    wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml
    
    vim csi-rbdplugin.yaml
    
    ......
    
    找到( 进行注释)
    
    # - name: ceph-csi-encryption-kms-config
    # mountPath: /etc/ceph-csi-encryption-kms-config/
    
    #- name: ceph-csi-encryption-kms-config
    # configMap:
    # name: ceph-csi-encryption-kms-config
    
    kubectl apply -f csi-rbdplugin.yaml

    7、查看启动插件的pod:(如下图情况说明相关插件部署完成)

     8、用CEPH块设备:

    首先创建StorageClass

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

    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: be5bb59c-4033-4a7a-82b5-5ef6f098548d
    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
    
    [root@k8s-master ceph-csi]# kubectl apply -f csi-rbd-sc.yaml
    
    storageclass.storage.k8s.io/csi-rbd-sc created

    查看storageclass:

    [root@k8s-master ceph-csi]# kubectl get storageclass
    
    NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
    course-nfs-storage nfs-storage Delete Immediate false 21d
    csi-rbd-sc rbd.csi.ceph.com Delete Immediate false 6h14m

    9、创建PVC

    PersistentVolumeClaim是由用户为抽象存储资源的请求。
    该PersistentVolumeClaim然后将关联到波德资源提供一个PersistentVolume,这将由Ceph的块图像进行备份。
    可以包括可选的volumeMode以在已挂载的文件系统(默认)或基于原始块设备的卷之间进行选择。

    例如:基于块的PersistentVolumeClaim

    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
    
    [root@k8s-master ceph-csi]# kubectl apply -f raw-block-pvc.yaml 
    persistentvolumeclaim/raw-block-pvc created

    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

    基于文件系统挂载的PVC

    cat <<EOF > rbd-pvc.yaml
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: rbd-pvc
    spec:
    accessModes:
    - ReadWriteOnce
    volumeMode: Filesystem
    resources:
    requests:
    storage: 1Gi
    storageClassName: csi-rbd-sc
    EOF
    
    [root@k8s-master ceph-csi]# kubectl apply -f rbd-pvc.yaml

    查看PVC绑定情况:

    [root@k8s-master ceph-csi]# kubectl get pvc
    NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    jenkins Bound pvc-0592fc6a-4bca-44e1-8d3e-b4d27bfd84be 15Gi RWX course-nfs-storage 21d
    jenkins-slave-mvn-pvc Bound jenkins-slave-mvn-pv 10Gi RWX 21d
    jenkins-slave-mvnconfig-pvc Bound jenkins-slave-mvnconfig-pv 100Mi RWX 21d
    jenkins-slave-pvc Bound jenkins-slave-pv 10Gi RWX 21d
    rbd-pvc Bound pvc-a2b62c13-756c-4b67-af42-35569ecc0d47 1Gi RWO csi-rbd-sc 6h6m

    这里使用以文件系统PersistentVolumeClaim绑定 到Pod资源作为已挂载的文件系统

    cat <<EOF > rbd-demo-pod.yaml
    ---
    apiVersion: v1
    kind: Pod
    metadata:
    name: 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
    
    [root@k8s-master ceph-csi]# kubectl apply -f rbd-demo-pod.yaml

    查看pod是否正常启动

    备注:如果出现改pod一直处于ContainerCreating 状态:

    我们可以使用kubectl describe pod/rbd-demo-pod 查看如果提示以下报错:

     原因是OS kernel不支持块设备镜像的一些特性,所以映射失败:

    我们可以根据报错提示在ceph集群admin主机上面直接diable这个rbd镜像的不支持的特性:

    [root@ceph-admin ceph]# rbd feature disable kubernetes/csi-vol-da1372f8-bb3d-11ea-a040-76cc35818538 object-map fast-diff deep-flatten

    然后在重启下pod就可以了;

  • 相关阅读:
    Adobe Reader XI 自动闪退问题
    NoSQL非关系型数据库Redis (键值对(key-value)数据库) 学习笔记
    MarkdownPad2报错: Html Rendering Error (An error occurred with the Html rendering component.)
    Thymeleaf学习笔记
    Elasticsearch学习笔记2--Spring Data
    Redis5.0学习笔记
    Xshell6 评估期已过——解决办法
    Windows版抓包工具Wireshark3.0
    PHP 判断数据是否为空 ‘0’判断为空可选
    python3 多线程,多进程 ,IO多路复用
  • 原文地址:https://www.cnblogs.com/abner123/p/13220075.html
Copyright © 2011-2022 走看看