在Kubernetes中搭建ceph的StorageClass

在Kubernetes中搭建ceph的StorageClass

搭建Ceph集群

注意

此文中的ceph只支持mimic以下的版本,推荐使用luminous版本

设备需求

操作系统 数量 CPU 内存 磁盘
CentOS7 2或者3 2 2G 200G

配置ssh互信

  • 配置3台设备的HostName以及hosts文件
    hostname hosts
    cephNode1 /etc/hosts文件配置3台设备的IP和hostname
    cephNode2 /etc/hosts文件配置3台设备的IP和hostname
    cephNode3 /etc/hosts文件配置3台设备的IP和hostname
  • 做ssh互信
    ssh-copy-id ${hostname}

安装Ceph

  • 配置ceph的repo (配置阿里云的即可)
    [ceph]
    name=ceph
    baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/x86_64/
    gpgcheck=0
    [ceph-noarch]
    name=cephnoarch
    baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch/
    gpgcheck=0
    
  • 安装ceph
    • cephNode1安装ceph-deploy和ceph
      yum -y install epel-release
      yum clean all
      yum makecache
      yum -y install ceph ceph-deploy
      
    • cephNode2(和cephNode3)安装ceph
      yum -y install epel-release
      yum clean all
      yum makecache
      yum -y install ceph
      
  • 安装过程中遇到的问题
    • 缺少安装包问题,如下图
      在Kubernetes中搭建ceph的StorageClass_第1张图片
      问题解决方案:yum -y install epel-release
    • hostname问题

      这个问题推荐先配置好hostname在做ceph的安装

创建Ceph的Pool

  • 调整防火墙策略,如果您是在测试环境,可以考虑关闭firewalld
    systemctl stop firewalld
    
  • ceph初始化
    • 在cephNode1上执行以下操作
    • 初始化
      mkdir ~/cluster
      cd ~/cluster
      ceph-deploy new cephNode1
      
    • 配置ceph.conf
        osd pool default size = 2
        osd crush chooseleaf type = 0
        osd max object name len = 256
        osd journal size = 128
      
    • 执行以下命令完成ceph初始化
      ceph-deploy mon create-initial
      ceph-deploy mgr create cephNode1
      ceph-deploy admin cephNode1 cephNode2 cephNode3
       ```
      
  • ceph准备disk,如果防火墙没有放开,此步骤会失败
    ceph-deploy osd create --data ${你的200G磁盘地址} cephNode1
    ceph-deploy osd create --data ${你的200G磁盘地址} cephNode2
    ceph-deploy osd create --data ${你的200G磁盘地址} cephNode3
    
  • 创建ceph pool
    • 初始化pool rbd,不初始化这个不能使用rbd ls等命令
       cd ~/cluster
       ceph osd pool create rbd 100 100
       rbd pool init rbd
       rbd ls
      
      • 创建pool kube
        cd ~/cluster
        ceph osd pool create kube 50 50
        ceph osd pool ls
        ceph osd pool application enable kube rbd
        ceph osd crush tunables hammer
        ceph auth get-or-create client.k8s mon 'allow r' osd 'allow rwx pool=k8s' -o ceph.client.k8s.keyring
        
  • 测试ceph
    # 创建pool	
    rbd create foo --size 4096 --pool rbd --image-format=1
    # 列举pool	
    rbd ls
    # 删除pool	
    rbd rm foo
    
  • 准备如下文件
    ceph.client.admin.keyring
    ceph.client.kube.keyring
    ceph.conf
    

配置StorageClass

  • 在kubernetes中安装与ceph集群相同版本的ceph-common
    yum -y install ceph-common
    
  • 将上一步中准备的文件拷贝到kubernetes集群中的每一个节点的/etc/ceph/目录下(这一步有的时候不一定起作用,下面还有一次拷贝)
  • 部署ceph的rbac
    • 获取相关的k8s文件
      git clone https://github.com/kubernetes-incubator/external-storage.git
      
    • 修改相关文件
      cd external-storage/ceph/rbd/deploy
      NAMESPACE=default # change this if you want to deploy it in another namespace
      sed -r -i "s/namespace: [^ ]+/namespace: $NAMESPACE/g" ./rbac/clusterrolebinding.yaml ./rbac/rolebinding.yaml
      kubectl -n $NAMESPACE apply -f ./rbac
      
      • 建议在kube-system命名空间中装一次
      • 因为存在一个权限问题,所以,需要修改rbac/clusterrole.yaml文件中添加如下内容,隶属于roles模块
        - apiGroups: [""]
        resources: ["secrets"]
        verbs: ["get", "create", "delete"]
        
      • 这里需要将ceph的那几个配置文件拷贝到对应的rbd-provisioner容器中,如果不拷贝,可能会出现找不到keyring或者ceph.conf的情况
    • 部署StorageClass
      cd external-storage/ceph/rbd/examples/
      
      
      • 部署secrets
        查看secrets.yaml文件,按照文件中的提示获取auth base64码,并配置
        
      • 部署StorageClass,修改class.yaml文件,以下为样例
      ```
      kind: StorageClass
      apiVersion:storage.k8s.io/v1
      metadata:
         name: rbd
      provisioner: ceph.com/rbd
      parameters:
          monitors: 10.80.0.144:6789(修改这里)
          pool: k8s(修改这里)
          adminId: admin
          adminSecretNamespace: kube-system
          adminSecretName: ceph-admin-secret
          userId: kube
          userSecretNamespace: kube-system(这里视情况修改,看你的secret建在哪个namespace了)
          userSecretName: ceph-secret
          imageFormat: "2"
          imageFeatures: layering
      ```
      
      • 部署PVC
        kubectl apply -f claim.yaml
        
      • 部署Pod
      ```
       kubectl apply -f ${目录下的pod的yaml文件}
      ```
      
      • 如果PVC Bound成功,pod也成功mount到volume则此次实验成功

你可能感兴趣的:(Kubernetes,文件存储系统,Ceph)