使用Rook搭建基于Ceph的对象存储服务

1,817 阅读3分钟

测试环境

  1. Ubuntu 21.10 (kernel 5.13.0-37-generic)
  2. Docker 20.10.14
  3. kubectl 1.23.5
  4. minikube 1.25.2
  5. Rook 1.8.7

准备工作

下载系统镜像

本次安装采用Ubuntu-server版本。下载镜像可以直接去国内镜像站获取,例如Ubuntu 21.10版本代码为impish,则可以去 mirrors.tuna.tsinghua.edu.cn/ubuntu-cdim… 找到对应版本,选择iso文件下载。

准备良好的网络环境

由于Kubernetes需要去k8s.gcr.io仓库拉取镜像,采用标签替换的方式目前没有找到良好的自动化方案,因此准备一个网络代理更加方便省事。

虚拟机软件

Rook官方建议在虚拟机环境下进行搭建测试。实测操作不当可能导致设备的文件系统被覆写!

安装系统

Ubuntu配置如下:

  1. CPU: 2 cores (minikube最低要求2核心)
  2. 内存: 4G (minikube最低要求2G内存)
  3. 硬盘: 50G (用于安装系统,可自定义)
  4. 新增加三块虚拟硬盘,用于创建osd,方便起见都设置为10G

虚拟机网络将采用NAT模式,安装时选择安装Openssh server,不在此时安装Docker(否则会使用snap安装docker,下一步配置时与教程不一致)

安装Docker

安装完毕系统,可以选择先执行 sudo apt update && sudo apt upgrade更新系统及软件。

根据docker官方的教程,执行命令安装需要的部件,不过Ubuntu21.10已经安装完毕所以不需要执行这一步。

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

下载Docker官方GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

添加至本地配置文件中

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装Docker

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

将本机用户添加至docker组方便使用docker命令,并在设置好后登出一次shell

sudo usermod -aG docker $USER && newgrp docker

配置网络

首先配置Docker的网络设置

sudo mkdir -p /etc/systemd/system/docker.service.d

创建 /etc/systemd/system/docker.service.d/http-proxy.conf 并写入如下内容

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80"
Environment="HTTPS_PROXY=https://proxy.example.com:443"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.49.0/24,<虚拟机NAT IP段>/24"

比如虚拟机的IP为192.168.104.x则输入192.168.104.0/24

并且保存一份shell的设置供Kubernetes使用

export HTTP_PROXY=http://proxy.example.com:80
export HTTPS_PROXY=https://proxy.example.com:443
export NO_PROXY=localhost,127.0.0.1,192.168.49.0/24,<虚拟机NAT IP段>/24

由于拉取镜像通常是基于HTTPS传输的,所以网络有建议去掉HTTP_PROXY的说法

安装kubectl

这步操作无需代理

在 Linux 系统中安装并设置 kubectl | Kubernetes

建议安装补全插件提高效率

安装minikube

minikube官方安装教程

需要注意的是在minikube start之后就需要配置好代理

安装Rook

先配置好代理,然后执行minikube start打开kubernetes。

克隆rook仓库

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

创建rook-ceph-operator

cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f operator.yaml

# 确保rook-ceph-operator在`Running`状态下再创建集群
kubectl -n rook-ceph get pod

由于使用了Minikube,所以选择rook/deploy/examples/cluster-test.yaml文件进行集群创建

cluster-test.yaml中的deviceFilter一项注释去掉

虚拟机的硬盘分别为/dev/sda,/dev/sdb,/dev/sdc,/dev/sdd, 其中sda为系统的文件系统, 所以需要在deviceFilter处填上sd[^a], 以忽略创建位于sda上的osd。

运行

kubectl create -f cluster-test.yaml

创建集群后,保证pods包含rook-ceph-monrook-ceph-mgr, 三个rook-ceph-osd后,创建rook-ceph-toolbox检测ceph状态。

此时ceph的状态应该为HEALTH_OK。

部署对象存储

由于erasureCoded chunk需要至少三个osd,所以需要3块硬盘或者3个未格式化的分区,考虑到集群只有一个节点,所以需要把failureDomain设置为osd而不是host

运行

kubectl create -f object.yaml

创建rgw此时部署也就完成了。