【Linux运维】Ceph分布式集群存储
Ceph是一个可靠的、自动重均衡、自动恢复的分布式存储系统
根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备存储和文件系统服务
在虚拟化领域里,比较常用到的是Ce
Ceph基础介绍 Ceph是一个可靠的、自动重均衡、自动恢复的分布式存储系统 根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备存储和文件系统服务 在虚拟化领域里,比较常用到的是Ceph的块设备存储,比如在OpenStack项目里,Ceph的块设备存储可以对接OpenStack的cinder后端存储、Glance的镜像存储和虚拟机的数据存储,比较直观的是Ceph集群可以提供一个raw格式的块存储来作为虚拟机实例的硬盘 Ceph相比其它存储的优势点在于它不单单是存储,同时还充分利用了存储节点上的计算能力,在存储每一个数据时,都会通过计算得出该数据存储的位置,尽量将数据分布均衡,同时由于Ceph的良好设计,采用了CRUSH算法、HASH环等方法,使得它不存在传统的单点故障的问题,且随着规模的扩大性能并不会受到影响 Ceph的核心组件 Ceph的核心组件包括Ceph OSD、Ceph Monitor和Ceph MDS Ceph OSD:(OSD的英文全称是Object Storage Device) Ceph OSD的架构实现由物理磁盘驱动器、Linux文件系统和Ceph OSD服务组成 对于Ceph OSD Deamon而言集群linux,Linux文件系统显性的支持了其拓展性,一般Linux文件系统有好几种,比如有BTRFS、XFS、Ext4等,BTRFS虽然有很多优点特性,但现在还没达到生产环境所需的稳定性,一般比较推荐使用XFS Ceph Monitor: Ceph MDS:(全称是Ceph MetaData Server) Ceph基础架构组件 Ceph是一个对象(object)式存储系统,它把每一个待管理的数据流(例如一个文件)切分为一到多个固定大小的对象数据,并以其为原子单元完成数据存取 对象数据的底层存储服务是由多个主机(host)组成的存储系统,该集群也被称之为RADOS(Reliable Automatic Distributed Object Store)存储集群,即可靠,自动化,分布式对象存储系统 如上图所示,librados是RADOS存储集群的API,它支持C,C++,Java,Python,Ruby和PHP等编程语言 由于直接基于librados这个API才能使用Ceph集群的话对使用者是有一定门槛的。当然,这一点Ceph官方也意识到了,于是他们还对Ceph做出了三个抽象资源,分别为RADOSGW,RBD,CEPHFS等 RadosGw,RBD和CephFS都是RADOS存储服务的客户端,他们把RADOS的存储服务接口(librados)分别从不同的角度做了进一步抽象,因而各自适用不同的应用场景,如下所示: RadosGw: RBD: CephFS: Ceph部署 | 环境介绍 | 所有节点都添加映射关系 cat >/etc/hosts< 10.0.0.202 ceph202 10.0.0.203 ceph203 10.0.0.204 ceph204 EOF | 配置免密登录 (后续ceph-deploy工具依赖免密登录) # 在ceph202上生成密钥 ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' -q # 拷贝密钥到其它节点 ssh-copy-id ceph203 ssh-copy-id ceph204 # 让所有节点共用同一套密钥 scp -rp ~/.ssh ceph203:~ scp -rp ~/.ssh ceph204:~ | ceph202 安装"ceph-deploy"工具 # 准备国内的软件源(含基础镜像软件源和epel源) curl? -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum install epel-release -y # 配置ceph软件源 cat > /etc/yum.repos.d/oldboyedu-ceph.repo <<'EOF' [ceph-noarch] name=Ceph noarch packages baseurl=https://download.ceph.com/rpm-mimic/el7/noarch enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://download.ceph.com/keys/release.asc EOF # ceph202主机安装"ceph-deploy"工具,用于后期部署ceph集群 sed -ri 's#(keepcache=)0#\11#' /etc/yum.conf yum makecache yum -y install ceph-deploy # 将rpm软件源推送到其它节点 scp /etc/yum.repos.d/*.repo ceph203:/etc/yum.repos.d/ scp /etc/yum.repos.d/*.repo ceph204:/etc/yum.repos.d/ | ceph环境准备 # ceph202 节点安装ceph环境 yum -y install ceph ceph-radosgw # 将软件打包到本地并推送到其它节点 mkdir ceph-rpm find /var/cache/yum/ -type f -name "*.rpm" | xargs mv -t ceph-rpm/ tar zcf oldboyedu-ceph.tar.gz ceph-rpm scp oldboyedu-ceph.tar.gz ceph203:~ scp oldboyedu-ceph.tar.gz ceph204:~ # 其它节点安装ceph环境 tar xf oldboyedu-ceph.tar.gz &&? cd ~/ceph-rpm && yum -y localinstall *.rpm 相关软件包功能说明如下: | 初始化ceph配置并安装组件 # 自定义创建ceph的配置文件目录~ mkdir -pv /oldboyedu/ceph/cluster && cd /oldboyedu/ceph/cluster/ # 初始化ceph的配置文件,注意观察执行命令的所在目录文件变化哟~ ceph-deploy new --public-network 10.0.0.0/24 ceph202 ceph203 ceph204 # 安装ceph-monitor并启动ceph-mon cd /oldboyedu/ceph/cluster/ && ceph-deploy mon create-initial # 将配置和client.admin密钥推送到指定的远程主机以便于管理集群 cd /oldboyedu/ceph/cluster/ && ceph202 ceph203 ceph204 # 安装并启动ceph-mgr组件 cd /oldboyedu/ceph/cluster/ && ceph-deploy mgr create ceph202 ceph203 ceph204 # 安装OSD设备 cd /oldboyedu/ceph/cluster ceph-deploy osd create ceph202 --data /dev/sdb ceph-deploy osd create ceph203 --data /dev/sdb ceph-deploy osd create ceph204 --data /dev/sdb 使用ceph对接k8s | 使用Ceph身份验证密钥 # 如果提供了Ceph身份验证密钥,则该密钥应首先进行base64编码,然后将编码后的字符串放入密钥yaml中。 # grep key /etc/ceph/ceph.client.admin.keyring |awk '{printf "%s", $NF}'|base64 QVFCNE54ZGhiZzZvQlJBQTZkS1VJeStheVJVV2FFUHBPMHZVNnc9PQ== # 创建Secret资源,注意替换key的值,要和ceph集群的key保持一致哟,上一步我已经取出来了。 cat > oldboyedu-ceph-secret.yaml <<'EOF' apiVersion: v1 kind: Secret metadata: name: ceph-secret namespace: oldboyedu-tomcat type: "kubernetes.io/rbd" data: key: QVFCNE54ZGhiZzZvQlJBQTZkS1VJeStheVJVV2FFUHBPMHZVNnc9PQ== EOF # 在K8S集群中创建Secret资源,以便于后期Pod使用该资源。 cat >oldboyedu-ceph-secret.yaml < apiVersion: v1 kind: Secret metadata: name: ceph-secret namespace: oldboyedu-tomcat type: "kubernetes.io/rbd" data: key: QVFCNE54ZGhiZzZvQlJBQTZkS1VJeStheVJVV2FFUHBPMHZVNnc9PQ== EOF kubectl apply -f oldboyedu-ceph-secret.yaml | 创建k8s专用的存储池 ceph osd pool create k8s 128 128# 如果提供了Ceph身 | 创建资源池 # 创建kubernetes集群常用的资源池 ceph osd pool create k8s 128 128 # 在k8s资源池创建块设备,值得注意的是,我们可以指定该镜像的特性,否则由于内核版本过低而无法挂载哟 rbd create -p k8s --size 1024 --image-feature layering oldboyedu-linux # 创建K8S的资源,将MySQL的Pod持久化到ceph集群 cat >02-mysql-deploy.yml < apiVersion: extensions/v1beta1 kind: Deployment metadata: name: mysql namespace: oldboyedu-tomcat spec: replicas: 1 template: ? metadata: ? ? labels: ? ? ? app: oldboyedu-mysql ? spec: ? ? nodeName: 10.0.0.104 ? ? volumes: ? ? ? ?- name: mysql-data ? ? ? ? rbd: ? ? ? ? ? ?# 指定ceph集群的mon节点 ? ? ? ? ? monitors: ? ? ? ? ? ?- '10.0.0.202:6789' ? ? ? ? ? ?- '10.0.0.203:6789' ? ? ? ? ? ?- '10.0.0.204:6789' ? ? ? ? ? ?# 指定存储池 ? ? ? ? ? pool: k8s ? ? ? ? ? ?# 指定rbd镜像名称 ? ? ? ? ? image: oldboyedu-linux ? ? ? ? ? ?# 指定文件系统类型,其会自动帮咱们进行格式化哟~ ? ? ? ? ? fsType: xfs ? ? ? ? ? ?# 是否可读,如果设置为true表示只读权限哟~ ? ? ? ? ? readOnly: false ? ? ? ? ? ?# 指定访问ceph集群的用户 ? ? ? ? ? user: admin ? ? ? ? ? ?# 指定访问集群的密钥资源,这个就是我们自己创建的secret局部资源,请一定要确保Pod和secret在同一个namespace,否则无法访问哟。 ? ? ? ? ? secretRef: ? ? ? ? ? ? name: ceph-secret ? ? ? ? ? ?# 指定镜像格式,老版本不支持该字段,因此我这里也就先注释了 ? ? ? ? ? ?# imageformat: "2" ? ? ? ? ? ?# 指定镜像特性,老版本不支持该字段,因此我这里就先注释了 ? ? ? ? ? ?# imagefeatures: "layering" ? ? ? ?- name: log ? ? ? ? emptyDir: {} ? ? containers: ? ? ? ?- name: mysql ? ? ? ? ?# image: 10.0.0.101:5000/mysql:5.7 ? ? ? ? image: oldboyedu-mysql:5.7 ? ? ? ? ?# args: ["sh","-x","/start-mysql.sh"] ? ? ? ? command: ["sh","-x","/start-mysql.sh"] ? ? ? ? ports: ? ? ? ? ?- containerPort: 3306 ? ? ? ? volumeMounts: ? ? ? ? ? ?- name: mysql-data ? ? ? ? ? ? mountPath: /var/lib/mysql ? ? ? ? ? ?- name: log ? ? ? ? ? ? mountPath: /var/log ? ? ? ? env: ? ? ? ? ?- name: MYSQL_ROOT_PASSWORD ? ? ? ? ? value: '123456' ROG 温馨提示: 使用"ceph auth ls"指令可以查看身份验证状态的列表创建的资源如下图所示,到时候可以直接参考"/oldboyedu/k8s-ceph"目录的yaml这个软件包会出现一大堆错误,需要我们手动逐个去排查,对学员说是一次不错的历练。上课要演示完整的排查流程 | 数据写入成功 如下图所示,我们成功将数据写入啦 总结 在本教程中,我们通过一些示例学习了如何去部署 Ceph 集群,实现对 Kubernetes 的分布式存储 感谢您的阅读,由于文档整理较费时费力,难免会有疏漏和不妥当地方,敬请谅解 (编辑:成都站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |