• k8s:Rook方式安装Ceph


    Ceph介绍

    Ceph官方文档:https://docs.ceph.com/en/quincy/

    Ceph可以有

    • Ceph对象存储:键值存储,其接口就是简单的GET,PUT,DEL等。如七牛,阿里云oss等
    • Ceph块设备:AWS的EBS青云的云硬盘阿里云的盘古系统,还有Ceph的RBD(RBD是Ceph面向块存储的接口)
    • Ceph文件系统:它比块存储具有更丰富的接口,需要考虑目录、文件属性等支持,实现一个支持并行化的文件存储应该是最困难的。

    一个Ceph存储集群需要

    • 至少一个Ceph监视器、Ceph管理器、Ceph OSD(对象存储守护程序)
    • 需要运行Ceph文件系统客户端,则需要部署 Ceph Metadata Server。
    • image-20220630135556090
    • Monitors: Ceph Monitor (ceph-mon) 监视器:维护集群状态信息
      • 维护集群状态的映射,包括监视器映射,管理器映射,OSD映射,MDS映射和CRUSH映射。
      • 这些映射是Ceph守护程序相互协调所必需的关键群集状态。
      • 监视器还负责管理守护程序和客户端之间的身份验证。
      • 通常至少需要三个监视器才能实现冗余和高可用性。
    • Managers: Ceph Manager 守护进程(ceph-mgr) : 负责跟踪运行时指标和Ceph集群的当前状态
      • Ceph Manager守护进程(ceph-mgr)负责跟踪运行时指标和Ceph集群的当前状态
      • 包括存储利用率,当前性能指标和系统负载。
      • Ceph Manager守护程序还托管基于python的模块,以管理和公开Ceph集群信息,包括基于Web的Ceph Dashboard和REST API。
      • 通常,至少需要两个管理器才能实现高可用性。
    • Ceph OSDs: Ceph OSD (对象存储守护进程, ceph-osd) 【存储数据】
      • 通过检查其他Ceph OSD守护程序的心跳来存储数据,处理数据复制,恢复,重新平衡,并向Ceph监视器和管理器提供一些监视信息。
      • 通常至少需要3个Ceph OSD才能实现冗余和高可用性。
    • MDSs: Ceph Metadata Server (MDS, ceph-mdsceph元数据服务器)
      • 存储能代表 Ceph File System 的元数据(如:Ceph块设备和Ceph对象存储不使用MDS).
      • Ceph元数据服务器允许POSIX文件系统用户执行基本命令(如ls,find等),而不会给Ceph存储集群带来巨大负担

    Ceph架构:

    image-20220630135703014

    官方推荐的安装方式:通过Cephadm或者Rook安装,而在官方文档中直接说明在k8s中用rook安装运行ceph。

    image-20220630135915672

    rook和ceph是什么关系?

    Rook 是一个开源云原生存储编排器,为各种存储解决方案提供平台、框架和支持,以便与云原生环境进行原生集成。

    Rook 将存储软件转变为自我管理、自我扩展和自我修复的存储服务。它通过自动化部署、引导、配置、供应、扩展、升级、迁移、灾难恢复、监控和资源管理来实现这一点。 Rook 使用底层云原生容器管理、调度和编排平台提供的设施来履行其职责。 Rook 利用扩展点深度集成到云原生环境中,并为调度、生命周期管理、资源管理、安全性、监控和用户体验提供无缝体验。

    准备环境环境

    我这里准备了一个三主三从的k8s集群:k8s版本1.21.1

    image-20220630135336820

    安装ceph的前提条件:https://rook.io/docs/rook/v1.9/Getting-Started/Prerequisites/prerequisites/#ceph-prerequisites

    需要准备空的硬盘,无格式化文件系统。

    image-20220630141813421

    我已经提前准备好:三个node节点都分别挂载了一个空的磁盘,设备名叫做sdb。(不会的自行百度,这里不介绍)

    [root@k8s-node1 ~]# lsblk -f
    NAME                                                                                                  FSTYPE      LABEL           UUID                                   MOUNTPOINT
    sdb                                                                                                   
    sr0                                                                                                   iso9660     CentOS 7 x86_64 2019-09-11-19-02-53-00
    sda
    ├─sda2                                                                                                LVM2_member                 TyxKHQ-OqOq-21je-Gvij-5sRm-S4oh-nwkXl8
    │ ├─centos-swap                                                                                       swap                        ee0f3f30-eea1-4b21-a06c-7e0eb57bfde7
    │ ├─centos-home                                                                                       xfs                         cf60f3b7-3dc8-4722-b621-8780560994f0   /home
    │ └─centos-root                                                                                       xfs                         bc9c74aa-8c31-4302-bce4-198aaf9429de   /
    └─sda1                                                                                                xfs                         369d0015-8436-42ec-a5e3-0996759efe95   /boot
    

    安装

    部署&修改operator

    在k8s主节点执行;

    git clone --single-branch --branch v1.6.3 https://github.com/rook/rook.git
    cd rook/cluster/examples/kubernetes/ceph/
    

    下载完官方给的源码后,修改operator.yaml,把默认镜像改成阿里云加速的镜像

      ROOK_CSI_CEPH_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/cephcsi:v3.3.1"
      ROOK_CSI_REGISTRAR_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-node-driver-registrar:v2.0.1"
      ROOK_CSI_RESIZER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-resizer:v1.0.1"
      ROOK_CSI_PROVISIONER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-provisioner:v2.0.4"
      ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-snapshotter:v4.0.0"
      ROOK_CSI_ATTACHER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-attacher:v3.0.2"
    

    image-20220630144351095

    kubectl create -f crds.yaml -f common.yaml -f operator.yaml #注意修改operator.yaml
    
    # verify the rook-ceph-operator is in the `Running` state before proceeding
    kubectl -n rook-ceph get pod
    

    部署集群

    修改cluster.yaml

    第一处修改:

      storage: # cluster level storage configuration and selection
        useAllNodes: false
        useAllDevices: false
        #deviceFilter:
        config:
          # crushRoot: "custom-root" # specify a non-default root label for the CRUSH map
          # metadataDevice: "md0" # specify a non-rotational storage so ceph-volume will use it as block db device of bluestore.
          # databaseSizeMB: "1024" # uncomment if the disks are smaller than 100 GB
          # journalSizeMB: "1024"  # uncomment if the disks are 20 GB or smaller
          osdsPerDevice: "3" # this value can be overridden at the node or device level
          # encryptedDevice: "true" # the default value for this option is "false"
        nodes:
        - name: "k8s-node3"
          devices:
          - name: "sdb"
        - name: "k8s-node1"
          devices:
          - name: "sdb"
        - name: "k8s-node2"
          devices:
          - name: "sdb"
    

    image-20220630144912794

    这里需要注意nodes里面name和devices.name要对应上。

    然后osds的数目我改成了3.

    第二处修改:改成由阿里云加速的镜像

    registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ceph-ceph:v15.2.11
    

    image-20220630145114774

    第三处修改:count由1改成2,这样mgr会自动变成主从架构。

    image-20220630145210178

    修改完成后,执行

    kubectl apply -f cluster.yaml
    watch -n 1 kubectl get pod -n rook-ceph #要确保一定要有以下组件,具体pod数目可能与我不一样,与node节点数目已经配置文件中配置的数目有关。(各种pod数目可能和我不一样,但要确保各种pod都有)
    

    我这里大概花了十几分钟,最后部署好了。具体看服务器配置和网速。

    image-20220630145712714

    安装ceph官方工具

    kubectl  create -f toolbox.yaml -n rook-ceph
    #查看pod
    kubectl  get pod -n rook-ceph -l app=rook-ceph-tools
    #进入pod
    kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
    #查看集群状态
    ceph status
    #查看osd状态
    ceph osd status
    #集群空间用量
    ceph df
    
    image-20220630152430903

    暴露dashboard

    暴露ceph的dashboard成svc:

    vi mysvc.yaml
    
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: rook-ceph-mgr
        ceph_daemon_id: a
        rook_cluster: rook-ceph
      name: rook-ceph-mgr-dashboard-active
      namespace: rook-ceph
    spec:
      ports:
      - name: dashboard
        port: 8443
        protocol: TCP
        targetPort: 8443
      selector:  #service选择哪些Pod
        app: rook-ceph-mgr
        ceph_daemon_id: a
        rook_cluster: rook-ceph
      sessionAffinity: None
      type: NodePort
    
    kubectl apply -f mysvc.yaml
    kubectl get svc -n rook-ceph
    

    image-20220630150609046

    浏览器访问32515端口,https://192.168.1.121:32515/

    ceph控制台默认账号 admin

    获取默认密码:

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

    image-20220630151142869

    进入首页:

    image-20220630151515950

    去除警告:AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED

    image-20220630151646839

    #进入toolbox
    kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
    ceph config set mon auth_allow_insecure_global_id_reclaim false
    

    配置完成后,状态立马就改变了。

    image-20220630152912858

    部分参考:https://blog.csdn.net/qq_14999375/article/details/118110564

    基本使用

    块存储(RDB)

    RDB: RADOS Block Devices

    RADOS: Reliable, Autonomic Distributed Object Store

    不能是RWX模式。

    cd rook/cluster/examples/kubernetes/ceph/csi/rbd
    #创建存储类和CephBlockPool
    kubectl apply -f storageclass.yaml
    #查看存储类
    kubectl get sc
    

    image-20220630171030681

    测试:

    创建一个statefulSet:

    vi sts.yaml
    
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: sts-nginx
      namespace: default
    spec:
      selector:
        matchLabels:
          app: sts-nginx # has to match .spec.template.metadata.labels
      serviceName: "sts-nginx"
      replicas: 3 # by default is 1
      template:
        metadata:
          labels:
            app: sts-nginx # has to match .spec.selector.matchLabels
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: sts-nginx
            image: nginx
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "rook-ceph-block" #使用块存储存储类
          resources:
            requests:
              storage: 20Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sts-nginx
      namespace: default
    spec:
      selector:
        app: sts-nginx
      type: ClusterIP
      ports:
      - name: sts-nginx
        port: 80
        targetPort: 80
        protocol: TCP
    
    kubectl apply -f sts.yaml
    kubectl get pvc
    kubectl get pvc www-sts-nginx-0
    

    image-20220630172020300

    查看pvc,都是Bound状态。

    kubectl get pvc -A
    

    image-20220701111504096

    查看dashboard:

    image-20220701112107448

  • 相关阅读:
    使用正向proxy 连调部署在k8s 中的spring cloud 中的rest服务
    goflow golang 的基于flow的编程库
    gvm golang 的多版本工具
    jvm-profiler 学习试用
    httpdiff http 请求diff 工具
    tengine lua 模块docker 镜像集成
    tengine 支持dubbo 的docker镜像
    openresty ngx.location.capture http2 问题
    systemd 使用rc.local 说明
    revel golang的全栈开发框架
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/16433935.html
Copyright © 2020-2023  润新知