zoukankan      html  css  js  c++  java
  • Kubernetes存储——rook-ceph

    一、搭建 rook-ceph(集群)版本:v6

    1.1 服务规划(4c3g)

    k8s-master(k8s集群) k8s-node01(k8s集群) k8s-node02(k8s集群)
    192.168.99.1 192.168.99.2 192.168.99.3

    1.2 扫描新磁盘

    所有 k8s 节点另外准备一块磁盘(裸盘)(/dev/sdb)

    在所有节点添加1块100GB的新磁盘:/dev/sdb,作为OSD盘,提供存储空间,添加完成后扫描磁盘,确保主机能够正常识别到:

    $ for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done
    # 扫描 SCSI 总线并添加 SCSI 设备
    
    $ for scsi_device in $(ls /sys/class/scsi_device/); do echo 1 > /sys/class/scsi_device/$scsi_device/device/rescan; done
    # 重新扫描 SCSI 总线
    
    $ lsblk
    # 查看已添加的磁盘,能够看到sdb说明添加成功
    

    1.3 部署rook-ceph集群

    因为这里k8s集群只有三台,所以必须配置k8s的master运行pod

    
    [root@k8s-master ~]# kubectl describe node k8s-master |grep Taints
    Taints: node-role.kubernetes.io/k8s-master:NoSchedule
    # 查看master表示不运行pod
    
    [root@k8s-master ~]# kubectl describe node k8s-master |grep Taints
    Taints: <none>
    # 查看master表示运行pod
    
    [root@k8s-master ~]# kubectl taint nodes k8s-master node-role.kubernetes.io/k8s-master-
    # 让master节点参与pod负载
    
    [root@k8s-master ~]# kubectl taint nodes k8s-master node-role.kubernetes.io/k8s-master=:NoSchedule
    # 让master节点恢复不参与pod负载 
    

    rook-ceph官网

    github代码

    rook-ceph镜像下载链接:https://pan.baidu.com/s/1SPK7K3NAWKhGTV_-A2tSOQ
    提取码:cjmx

    $ https://github.com/rook/rook.git (https://gitee.com)
    $ git clone https://gitee.com/huanhui/rook.git
    $ git clone --single-branch --branch v1.6.7 https://github.com/rook/rook.git
    # 根据自身网络情况,任选其中一种即可
    
    $ cd rook/cluster/examples/kubernetes/ceph
    # 进入对应的目录
    
    $ grep image operator.yaml # 查看所需镜像
    $ grep image cluster.yaml
    $ mkdir rook-ceph-images && cd rook-ceph-images
    $ unzip '*.zip'
    $ ls *tar |xargs -i docker load -i {} && docker images
    $ rm -rf rook-ceph-images
    # 离线导入镜像
    
    $ kubectl create -f crds.yaml -f common.yaml -f operator.yaml
    
    $ kubectl create -f cluster.yaml
    # 修改cluster.yaml文件
    

    2021-10-18_152708

    $ kubectl get pod -n rook-ceph -o wide
    $ kubectl get deployment -n rook-ceph
    $ kubectl get svc -n rook-ceph
    

    1.4 配置ceph dashboard

    在cluster.yaml文件中默认已经启用了ceph dashboard!

    rook-ceph-mgr-dashboard监听的端口是8443,创建nodeport类型的service以便集群外部访问!

    $ cd ~/rook/cluster/examples/kubernetes/ceph
    $ kubectl apply -f dashboard-external-https.yaml
    
    $ kubectl get svc -n rook-ceph
    rook-ceph-mgr-dashboard-external-https   NodePort    10.105.9.199     <none>        8443:30077/TCP      13s
    

    访问:https://192.168.99.1:30077

    1.5 获取dashboard登陆账号、密码

    默认用户名为:admin

    $ kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
    # 获取密码
    

    1.6 部署 ceph toolbox

    $ cd ~/rook/cluster/examples/kubernetes/ceph
    $ kubectl apply -f toolbox.yaml
    

    进入该pod,查看ceph集群状态

    [root@k8s-master ~]# kubectl exec -it rook-ceph-tools-78cdfd976c-z4ps4 -n rook-ceph /bin/bash
    
    [root@rook-ceph-tools-78cdfd976c-z4ps4 /]# ceph -s
    

    二、k8s使用 rook-ceph 的块存储

    2.1 rook提供RBD服务

    rook可以提供以下3类型的存储:

    • Block:Create block storage to be consumed by a pod
    • Object:Create an object store that is accessible inside or outside the Kubernetes cluster
    • Shared File System:Create a file system to be shared across multiple pods

    2.2 使用rook-ceph的块存储

    1、基于 CSI 驱动程序创建卷

    2、基于 flex 驱动程序创建卷

    1、此示例使用 CSI 驱动程序,它是 K8s 1.13 和更新版本的首选驱动程序。

    2、flex 驱动程序(K8s 1.12 或更早版本需要)的存储类

    要基于 flex 驱动程序创建卷,确保通过 Ceph CSI 启用了 flex 驱动程序。为此,您需要在您的操作员部署文件 operator.yaml 中设置 ROOK_ENABLE_FLEX_DRIVERtrue,与 CSI 驱动程序相同。

    注意:CSI 驱动程序,此示例要求每个节点至少有 1 个 OSD,每个 OSD 位于3 个不同的节点上。因为failureDomain设置为host并且replicated.size设置为3

    在kubernetes集群里,要提供rbd块设备服务,需要有如下步骤:

    1、创建 rbd-provisione

    2、创建 pool

    3、创建对应的 storageclass

    4、使用rbd对应的storageclass创建pvc,然后动态申请pv

    5、创建pod使用pv( 使用存储 )

    通过rook创建Ceph Cluster集群之后,rook自身提供了rbd-provisioner服务,所以不需要再部署其provisioner(供应商,就是提供存储的)。

    2.2.1 使用CSI驱动程序
    # 1、CSI 驱动程序 (2、3步骤可以直接使用下面命令执行)
    $ kubectl create -f ~/rook/cluster/examples/kubernetes/ceph/csi/rbd/storageclass.yaml
    
    # 2、flex 驱动程序
    $ kubectl create -f cluster/examples/kubernetes/ceph/flex/storageclass.yaml
    
    2.2.2 创建pool
    # 创建一个自己的工作目录
    $ cd /root/rook/cluster/examples/kubernetes/ceph
    $ mkdir my_yaml
    
    $ cat > pool.yaml << EOF
    apiVersion: ceph.rook.io/v1
    kind: CephBlockPool
    metadata:
      name: replicapool   # operator会监听并创建一个pool
      namespace: rook-ceph
    spec:
      failureDomain: host
      replicated:
        size: 3
        requireSafeReplicaSize: true
    EOF
    
    $ kubectl apply -f pool.yaml
    # 创建了一个名为 replicapool 的存储池
    

    apply执行完后,登录 ceph dashboard 界面上能看到对应的pool!

    2.2.3 创建对应的storageclass
    $ cat > storageclass.yaml << EOF
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
       name: rook-ceph-block # 这里创建一个storage class, 在pvc中指定这个storage class即可实现动态创建PV
    provisioner: rook-ceph.rbd.csi.ceph.com
    parameters:
      clusterID: rook-ceph
      Pool: replicapool
      imageFormat: "2"
      imageFeatures: layering
      csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
      csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph # 必须与rook-ceph集群ns相同
      csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
      csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
      csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
      csi.storage.k8s.io/fstype: ext4 # 指定卷的文件系统类型。如果没有指定,它将使用ext4
    allowVolumeExpansion: true
    reclaimPolicy: Delete # 不写默认值为Delete,其他选项包括“保留(Retain)”、“回收(Recycle)”
    EOF
    

    如果您在“rook-ceph”以外的命名空间中部署了 Rook operator ,请更改配置器中的前缀以匹配您使用的命名空间。例如,如果 Rook operator 在名称空间“my-namespace”中运行,则供应商值应为“my-namespace.rbd.csi.ceph.com”。

    $ kubectl apply -f storageclass.yaml
    $ kubectl get storageclass
    # 创建了一个名为 rook-ceph-block 的storageClass
    
    2.2.4 创建pvc测试
    $ cat > test-pvc.yaml << EOF
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: wp-pv-claim
      labels:
        app: wordpress
    spec:
      storageClassName: rook-ceph-block	# 指定storage class
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi # 需要一个20G的盘
    EOF 
    
    $ kubectl apply -f test-pvc.yaml
    # 创建一个名为wp-pv-claim的pvc
    
    $ kubectl get pvc
    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
    wp-pv-claim   Bound    pvc-8ca4b37a-bfdf-49eb-ad46-c39309115664   20Gi       RWO            rook-ceph-block   16s
    
    $ kubectl get pv
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS      REASON   AGE
    pvc-8ca4b37a-bfdf-49eb-ad46-c39309115664   20Gi       RWO            Delete           Bound    default/wp-pv-claim   rook-ceph-block            17s
    
    kubectl exec -it rook-ceph-tools-656b876c47-2mffd -n rook-ceph /bin/bash #进入容器查看相关信息
    
    [root@rook-ceph-tools-78cdfd976c-5wpmv /]# rbd showmapped
    
    [root@rook-ceph-tools-78cdfd976c-5wpmv /]# rbd list replicapool
    [root@rook-ceph-tools-78cdfd976c-5wpmv /]# rbd info -p replicapool xxxxxxx
    

    2021-10-18_154711

    2.2.5 清理块创建的所有工件
    $ kubectl delete -f test-pvc.yaml
    $ kubectl delete -n rook-ceph cephblockpools.ceph.rook.io replicapool
    $ kubectl delete storageclass rook-ceph-block
    
    *************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
  • 相关阅读:
    黑苹果安装 this is an unknown cpu model 0x3a
    JQMobile引入外部CSS,JS文件
    iphone系统更新 3002错误
    移动端HTML5框架
    花生壳动态域名解析使用
    win7 配置IIS + php 环境
    php在字符串中替换多个字符
    PHP 获取文件名和扩展名的方法
    Mysql无法创建外键的原因
    wordpress无法登录的解决方法
  • 原文地址:https://www.cnblogs.com/lvzhenjiang/p/15420912.html
Copyright © 2011-2022 走看看