转载自:https://mp.weixin.qq.com/s/CdLioTzU4oWI688lqYKXUQ

1 环境准备

1.1 基础环境

  • 3台配置一致的虚拟机
  • 虚拟机配置:4c 8g
  • 虚拟机操作系统:centos7
  • 硬盘:vda:40G vdb:20G
  • Kubernete 版本:1.20.0
  • Docker版本:20.10.7

默认k8s 已安装完成,采用kubeadm 容器化安装

1.2 所安装rook/ceph版本:

ceph:v15.2.11

rook:1.6.3

1.3 前提

  • 正常运行的多节点k8s集群,两个子节点及以上
  • rook的版本大于1.3,无法使用目录创建集群,要使用单独的裸盘进行创建,也就是创建一个新的磁盘,挂载到宿主机,不进行格式化,直接使用即可。检查步骤:
  1. lsblk -f
  2. NAME FSTYPE LABEL UUID MOUNTPOINT
  3. vda
  4. └─vda1 xfs 6f15c206-f516-4ee8-a4b7-89ad880647db /
  5. vdb
  • FSTYPE为空的磁盘为可用磁盘,该磁盘需要清除数据(不能格式化)。
  • 做这个实验需要高配置,每个子节点配置不能低于2核4G,主节点不低于4核8G

2 搭建流程

2.1Rook是什么

  • Rook本身并不是一个分布式存储系统,而是利用 Kubernetes 平台的强大功能,通过 Kubernetes Operator 为每个存储提供商提供服务。它是一个存储“编排器”,可以使用不同的后端(例如 Ceph、EdgeFS 等)执行繁重的管理存储工作,从而抽象出很多复杂性。
  • Rook 将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它自动执行存储管理员的任务:部署、引导、配置、供应、扩展、升级、迁移、灾难恢复、监控和资源管理
  • Rook 编排了多个存储解决方案,每个解决方案都有一个专门的 Kubernetes Operator 来实现自动化管理。目前支持Ceph、Cassandra、NFS。
  • 目前主流使用的后端是Ceph ,Ceph 提供的不仅仅是块存储;它还提供与 S3/Swift 兼容的对象存储和分布式文件系统。Ceph 可以将一个卷的数据分布在多个磁盘上,因此可以让一个卷实际使用比单个磁盘更多的磁盘空间,这很方便。当向集群添加更多磁盘时,它会自动在磁盘之间重新平衡/重新分配数据。

2.2 ceph-rook 与k8s集成方式

  • Rook 是一个开源的cloud-native storage编排, 提供平台和框架;为各种存储解决方案提供平台、框架和支持,以便与云原生环境本地集成。
  • Rook 将存储软件转变为自我管理、自我扩展和自我修复的存储服务,它通过自动化部署、引导、配置、置备、扩展、升级、迁移、灾难恢复、监控和资源管理来实现此目的。
  • Rook 使用底层云本机容器管理、调度和编排平台提供的工具来实现它自身的功能。
  • Rook 目前支持Ceph、NFS、Minio Object Store和CockroachDB。
  • Rook使用Kubernetes原语使Ceph存储系统能够在Kubernetes上运行

3 安装部署

3.1 安装前准备

  1. #确认安装lvm2
  2. yum install lvm2 -y
  3. #启用rbd模块
  4. modprobe rbd
  5. cat > /etc/rc.sysinit << EOF
  6. #!/bin/bash
  7. for file in /etc/sysconfig/modules/*.modules
  8. do
  9. [ -x \$file ] && \$file
  10. done
  11. EOF
  12. cat > /etc/sysconfig/modules/rbd.modules << EOF
  13. modprobe rbd
  14. EOF
  15. chmod 755 /etc/sysconfig/modules/rbd.modules
  16. lsmod |grep rbd

3.2 下载Rook安装文件

  1. git clone --single-branch --branch v1.6.3 https://github.com/rook/rook.git

更改配置

  1. cd rook/cluster/examples/kubernetes/ceph

修改Rook CSI镜像地址,原本的地址可能是gcr的镜像,但是gcr的镜像无法被国内访问,所以需要同步gcr的镜像到阿里云镜像仓库,本文档已经为大家完成同步,可以直接修改如下:

  1. vim operator.yaml



改为:

  1. ROOK_CSI_REGISTRAR_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-node-driver-registrar:v2.0.1"
  2. ROOK_CSI_RESIZER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-resizer:v1.0.1"
  3. ROOK_CSI_PROVISIONER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-provisioner:v2.0.4"
  4. ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-snapshotter:v4.0.0"
  5. ROOK_CSI_ATTACHER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-attacher:v3.0.2"

还是operator文件,新版本rook默认关闭了自动发现容器的部署,可以找到ROOK_ENABLE_DISCOVERY_DAEMON改成true即可:

3.4 部署ROOK

  1. cd cluster/examples/kubernetes/ceph
  2. kubectl create -f crds.yaml -f common.yaml -f operator.yaml

等待容器启动,只有都running才能进行下一步

  1. [root@k8s-master01 ceph]# kubectl -n rook-ceph get pod
  2. NAME READY STATUS RESTARTS AGE
  3. rook-ceph-operator-675f59664d-b9nch 1/1 Running 0 32m
  4. rook-discover-4m68r 1/1 Running 0 40m
  5. rook-discover-chscc 1/1 Running 0 40m
  6. rook-discover-mmk69 1/1 Running 0 40m

3.5 创建ceph集群

  1. kubectl create -f cluster.yaml

创建完成后,可以查看pod的状态:

  1. [root@k8s-master01 ceph]# kubectl -n rook-ceph get pod
  2. NAME READY STATUS RESTARTS AGE
  3. csi-cephfsplugin-8d6zn 3/3 Running 0 39m
  4. csi-cephfsplugin-dr6wd 3/3 Running 0 39m
  5. csi-cephfsplugin-gblpg 3/3 Running 0 39m
  6. csi-cephfsplugin-provisioner-846ffc6cb4-qjv7s 6/6 Running 0 39m
  7. csi-cephfsplugin-provisioner-846ffc6cb4-wbjzg 6/6 Running 0 39m
  8. csi-rbdplugin-6bd9t 3/3 Running 0 39m
  9. csi-rbdplugin-9b6gt 3/3 Running 0 39m
  10. csi-rbdplugin-9vtpp 3/3 Running 0 39m
  11. csi-rbdplugin-provisioner-75fd5c779f-9989z 6/6 Running 0 39m
  12. csi-rbdplugin-provisioner-75fd5c779f-zx49t 6/6 Running 0 39m
  13. rook-ceph-crashcollector-k8s-master01-75bb6c6dd9-lnncg 1/1 Running 0 38m
  14. rook-ceph-crashcollector-k8s-node-90-84b555c8c8-5vt72 1/1 Running 0 38m
  15. rook-ceph-crashcollector-k8s-node-94-798667dd4b-dzvbw 1/1 Running 0 31m
  16. rook-ceph-mgr-a-86d4459f5b-8bk49 1/1 Running 0 38m
  17. rook-ceph-mon-a-847d986b98-tff45 1/1 Running 0 39m
  18. rook-ceph-mon-b-566894d545-nbw2t 1/1 Running 0 39m
  19. rook-ceph-mon-c-58c5789c6-xz5l7 1/1 Running 0 38m
  20. rook-ceph-operator-675f59664d-b9nch 1/1 Running 0 32m
  21. rook-ceph-osd-0-76db9d477d-dz9kf 1/1 Running 0 38m
  22. rook-ceph-osd-1-768487dbc8-g7zq9 1/1 Running 0 31m
  23. rook-ceph-osd-2-5d9f8d6fb-bfwtk 1/1 Running 0 31m
  24. rook-ceph-osd-prepare-k8s-master01-4b4mp 0/1 Completed 0 31m
  25. rook-ceph-osd-prepare-k8s-node-90-7jg4n 0/1 Completed 0 31m
  26. rook-ceph-osd-prepare-k8s-node-94-4mb7g 0/1 Completed 0 31m
  27. rook-discover-4m68r 1/1 Running 0 40m
  28. rook-discover-chscc 1/1 Running 0 40m
  29. rook-discover-mmk69 1/1 Running 0 40m

其中osd-0、osd-1、osd-2容器必须是存在且正常的,如果上述pod均正常运行成功,则视为集群安装成功。

3.6 安装ceph 客户端工具

这个文件的路径还是在ceph文件夹下

  1. kubectl create -f toolbox.yaml -n rook-ceph

待容器Running后,即可执行相关命令:

  1. [root@k8s-master01 ~]# kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
  2. [root@rook-ceph-tools-fc5f9586c-m2wf5 /]# ceph status
  3. cluster:
  4. id: 9016340d-7f90-4634-9877-aadc927c4e81
  5. health: HEALTH_WARN
  6. mons are allowing insecure global_id reclaim
  7. clock skew detected on mon.b
  8. services:
  9. mon: 3 daemons, quorum a,b,c (age 3m)
  10. mgr: a(active, since 44m)
  11. osd: 3 osds: 3 up (since 38m), 3 in (since 38m)
  12. data:
  13. pools: 1 pools, 1 pgs
  14. objects: 0 objects, 0 B
  15. usage: 3.0 GiB used, 57 GiB / 60 GiB avail
  16. pgs: 1 active+clean

常用命令:

  1. ceph status
  2. ceph osd status
  3. ceph df
  4. rados df

3.7 配置ceph dashboard

默认的ceph 已经安装的ceph-dashboard,但是其svc地址为service clusterIP,并不能被外部访问

  1. kubectl apply -f dashboard-external-https.yaml

创建NodePort类型就可以被外部访问了

  1. [root@k8s-master01 ~]# kubectl get svc -n rook-ceph|grep dashboard
  2. rook-ceph-mgr-dashboard ClusterIP 192.168.204.219 <none> 8443/TCP 49m
  3. rook-ceph-mgr-dashboard-external-https NodePort 192.168.34.227 <none> 8443:32529/TCP 49m

浏览器访问(master01-ip换成自己的集群ip):

https://master01-ip:32529/#/login?returnUrl=%2Fdashboard

用户名默认是admin,至于密码可以通过以下代码获取:

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

4 删除集群并清除数据

4.1 删除Cephcluster CRD

  1. kubectl -n rook-ceph delete cephcluster rook-ceph

确认上一步删除之后,查询一下

  1. kubectl -n rook-ceph get cephcluster

4.2 删除Operator 和相关的资源

  1. kubectl delete -f operator.yaml
  2. kubectl delete -f common.yaml
  3. kubectl delete -f crds.yaml

4.3 删除主机上的数据

rook创建cluster的时候会把部分数据写在本机的/var/lib/rook(dataDirHostPath指定的目录)中,如果不删除会影响下次集群部署,rook据说下个版本会增加k8s 本地存储调用的功能,就不会直接存在硬盘上了

  1. rm -rf /var/lib/rook

4.4 擦除硬盘上的数据

创建osd时被写入了数据,需要擦除,否则无法再次创建ceph集群,脚本中有各种硬盘的擦除命令,不需要全部执行成功,根据当前机器的硬盘情况确定。

  1. vim clean-ceph.sh
  2. #!/usr/bin/env bash
  3. DISK="/dev/vdb"
  4. sgdisk --zap-all $DISK
  5. dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync
  6. blkdiscard $DISK
  7. ls /dev/mapper/ceph-* | xargs -I% -- dmsetup remove %
  8. rm -rf /dev/ceph-*
  9. rm -rf /dev/mapper/ceph--*

5 FAQ

5.1 卸载删除ceph-rook,kubectl get ns ,rook-ceph 显示未Terminating,无法删除

  1. NAMESPACE=rook-ceph
  2. kubectl proxy &
  3. kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json
  4. curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize

5.2 卸载osd 或者卸载集群另外一个后遗症,rook-ceph 名称空间删除了,但是 cephcluster无法删除

  1. #查看名称空间,已经删除
  2. [root@k8s-master01 ~]# kubectl get ns
  3. NAME STATUS AGE
  4. default Active 22h
  5. kube-node-lease Active 22h
  6. kube-public Active 22h
  7. kube-system Active 22h
  8. #查看集群依然存在
  9. [root@k8s-master01 ~]# kubectl -n rook-ceph get cephcluster
  10. NAME DATADIRHOSTPATH MONCOUNT AGE PHASE MESSAGE HEALTH
  11. rook-ceph /var/lib/rook 3 20h Progressing Configuring Ceph Mons
  12. [root@k8s-master01 ~]# kubectl api-resources --namespaced=true -o name|xargs -n 1 kubectl get --show-kind --ignore-not-found -n rook-ceph
  13. Error from server (MethodNotAllowed): the server does not allow this method on the requested resource
  14. NAME TYPE DATA AGE
  15. secret/default-token-lz6wh kubernetes.io/service-account-token 3 8m34s
  16. NAME SECRETS AGE
  17. serviceaccount/default 1 8m34s
  18. Error from server (MethodNotAllowed): the server does not allow this method on the requested resource
  19. NAME DATADIRHOSTPATH MONCOUNT AGE PHASE MESSAGE HEALTH
  20. cephcluster.ceph.rook.io/rook-ceph /var/lib/rook 3 20h Progressing Configuring Ceph Mons
  21. #解决办法:
  22. kubectl edit cephcluster.ceph.rook.io -n rook-ceph
  23. finalizers的值删掉,cephcluster.ceph.rook.io便会自己删除

5.3 打开dashboard显示HEALTH_WARN警告

进入 ceph-tools 执行以下命令:

  1. ceph config set mon auth_allow_insecure_global_id_reclaim false

其他常见警告解决链接:

https://docs.ceph.com/en/octopus/rados/operations/health-checks/

K8s 上的分布式存储集群搭建(Rook/ceph)的更多相关文章

  1. ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建

    在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...

  2. k8s上安装elasticsearch集群

    官方文档地址:https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-quickstart.html yaml文件地址:https://dow ...

  3. K8S之集群搭建

    转自声明 ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建 1.K8S环境搭建的几种方式 搭建K8S环境有几种常见的方式如下: (1)Minikube Minikube是一 ...

  4. 2-20 MySQL集群搭建实现高可用

    MySQL集群概述和安装环境 MySQL Cluster是MySQL适合于分布式计算环境的高实用.高冗余版本.Cluster的汉语是"集群"的意思.它采用了NDB Cluster ...

  5. .net core i上 K8S(一)集群搭建

    1.前言 以前搭建集群都是使用nginx反向代理,但现在我们有了更好的选择——K8S.我不打算一上来就讲K8S的知识点,因为知识点还是比较多,我打算先从搭建K8S集群讲起,我也是在搭建集群的过程中熟悉 ...

  6. .Net Core2.1 秒杀项目一步步实现CI/CD(Centos7.2)系列一:k8s高可用集群搭建总结以及部署API到k8s

    前言:本系列博客又更新了,是博主研究很长时间,亲自动手实践过后的心得,k8s集群是购买了5台阿里云服务器部署的,这个集群差不多搞了一周时间,关于k8s的知识点,我也是刚入门,这方面的知识建议参考博客园 ...

  7. 实现CI/CDk8s高可用集群搭建总结以及部署API到k8s

    实现CI/CD(Centos7.2)系列二:k8s高可用集群搭建总结以及部署API到k8s 前言:本系列博客又更新了,是博主研究很长时间,亲自动手实践过后的心得,k8s集群是购买了5台阿里云服务器部署 ...

  8. kubernetes(K8S)快速安装与配置集群搭建图文教程

    kubernetes(K8S)快速安装与配置集群搭建图文教程 作者: admin 分类: K8S 发布时间: 2018-09-16 12:20 Kubernetes是什么? 首先,它是一个全新的基于容 ...

  9. K8S集群搭建

    K8S集群搭建 摘要 是借鉴网上的几篇文章加上自己的理解整理得到的结果,去掉了一些文章中比较冗余的组件和操作,力争做到部署简单化. K8S组件说明 Kubernetes包含两种节点角色:master节 ...

随机推荐

  1. System类的常用方法和StringBuilder的原理

    System类的常用方法1.currentTimeMillis方法2.arraycopy方法 java.lang.System 类中提供大量的静态方法,可以获取与系统相关的信息或系统级操作,在Syst ...

  2. MySQL语句与正则表达式

    正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较.MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤SELECT检索出的数据. 1.元字符说明 ...

  3. RESTAPI 版本控制策略【eolink 翻译】

    微服务,是现阶段开发建设云原生应用程序的流行趋向.API 版本控制有益于在辨别出所需要的调节时加速迭代更新的速度. 根据微服务架构的关键构件其一,是 API 的设计和规范.针对 API,版本控制是不可 ...

  4. APISpace 号码实时查询API接口 免费好用

    最近公司项目有一个号码实时查询的小功能,想着如果用现成的API就可以大大提高开发效率,所以在网上的API商店搜索了一番,发现了 APISpace,它里面的号码实时查询API非常符合我的开发需求.   ...

  5. RK3568开发笔记(四):在虚拟机上使用SDK编译制作uboot、kernel和buildroot镜像

    前言   上一篇搭建好了ubuntu宿主机开发环境,本篇的目标系统主要是开发linux+qt,所以需要刷上billdroot+Qt创建的系统,为了更好的熟悉原理和整个开发过程,选择从零开始搭建rk35 ...

  6. Linux综合运用

    一. Linux用户和组及其权限管理 请根据以下项目要求,写出操作过程和命令并进行相应的验证测试操作. 项目要求: 某软件开发公司即将开始在Linux系统上进行项目的开发.要实现的环境是:公司有软件开 ...

  7. Neo4j应用

    CQL函数 1. 字符串函数 功能 描述 UPPER 将所有字母改为大写 LOWER 将所有字母改为小写 SUBSTRING 将获取指定范围的子字符串 REPLACE 替换一个字符串的子字符串 mat ...

  8. BufferedInputStream字节缓冲输入流

    package com.yang.Test.BufferedStudy; import java.io.BufferedInputStream; import java.io.FileInputStr ...

  9. 使用.NET简单实现一个Redis的高性能克隆版(二)

    译者注 该原文是Ayende Rahien大佬业余自己在使用C# 和 .NET构建一个简单.高性能兼容Redis协议的数据库的经历. 首先这个"Redis"是非常简单的实现,但是他 ...

  10. Apache DolphinScheduler 是如何诞生的

    作者 | 代立冬,李岗 排版 | 开源之道小助理 Apache DolphinScheduler,简称"DS", 中文名 "小海豚调度"(海豚聪明.人性化,又左 ...