注意

本文档适用于 Ceph 的开发版本。

在 Kubernetes 中使用 Rook 破解 Ceph

警告

不是用于在 Kubernetes 中设置生产 Ceph 集群的官方用户文档。它面向希望在 Kubernetes 中破解 Ceph 的开发人员。

本指南面向刚开始在 Kubernetes 环境中运行的 Ceph 开发人员。它假定您可能正在破解 Rook、Ceph 或两者兼而有之,因此所有内容都从源代码构建。

破解 MGR 模块的 TL;DR

对 Python 代码库进行更改,然后从 Ceph 的 build 目录运行

../src/script/kubejacker/kubejacker.sh '192.168.122.1:5000'

其中 '192.168.122.1:5000' 是一个本地 docker 注册表,Rook 的 CephCluster CR 使用 image: 192.168.122.1:5000/ceph/ceph:latest

1. 构建 kubernetes 集群

在安装 Ceph/Rook 之前,请确保您有一个正常工作的 kubernetes 集群并添加了一些节点(即 kubectl get nodes 向您显示一些内容)。本指南的其余部分假设您的开发工作站可以网络访问您的 kubernetes 集群,因此 kubectl 可以从您的工作站运行。

有很多方法可以构建 kubernetes 集群:在这里,我们提供了一些有关从哪里开始的提示/指针。

kubic-terraform-kvm 也可能是一个选项。

或者使用 kubeadm 托管您自己的

一些提示

以下是一些使您更顺利地使用

kubeadm:

  • 如果您以前为 kubernetes 包添加了任何 yum/deb 存储库,请在尝试使用 packages.cloud.google.com 存储库之前禁用它们。如果您不禁用,您将遇到非常令人困惑的冲突。

  • 即使您的发行版已经有 docker,也要确保您正在安装来自 docker.com 的版本,该版本在 kubeadm 安装说明中提到的范围内。特别要注意的是,CentOS 7、8 中的 docker 将不起作用

minikube:

  • 通过传递本地 docker 注册表地址启动 minikube:minikube start --driver=docker --insecure-registry='192.168.122.1:5000'

托管在其他地方

如果您手头没有服务器,您可以尝试纯容器提供商,例如 Google Compute Engine。当涉及到您的 kubernetes 集群可见的存储设备类型时,您的体验可能会有所不同。

在启动大型集群之前,请务必检查它要花费您多少钱!

2. 运行 docker 注册表

在工作站和 kubernetes 集群都可以访问的地方运行此程序(即 docker push/pull 在任何地方都可以正常工作)。这很可能是您用作 kubernetes master 的同一主机。

  1. 安装 docker-distribution 包。

  2. 如果要配置端口,请编辑 /etc/docker-distribution/registry/config.yml

  3. 启用注册表服务

systemctl enable docker-distribution
systemctl start docker-distribution

您可能需要将注册表标记为不安全

3. 构建 Rook

注意

不需要构建 Rook 来更改 Ceph。

如果您还没有 Go,请安装它。

下载 Rook 源代码

go get github.com/rook/rook

# Ignore this warning, as Rook is not a conventional go package
can't load package: package github.com/rook/rook: no Go files in /home/jspray/go/src/github.com/rook/rook

您现在将在 ~/go/src/github.com/rook/rook 中有一个 Rook 源代码树——您可能想将其克隆到其他地方,但如果您将其保留在 GOPATH 中,您的生活会更轻松。

在 Rook 树的根目录中运行 make 来构建其二进制文件和容器

make
...
=== saving image build-9204c79b/ceph-amd64
=== docker build build-9204c79b/ceph-toolbox-base-amd64
sha256:653bb4f8d26d6178570f146fe637278957e9371014ea9fce79d8935d108f1eaa
=== docker build build-9204c79b/ceph-toolbox-amd64
sha256:445d97b71e6f8de68ca1c40793058db0b7dd1ebb5d05789694307fd567e13863
=== caching image build-9204c79b/ceph-toolbox-base-amd64

您可以使用 docker image ls 查看生成的镜像。您关心的镜像是标签以“ceph-amd64”结尾的镜像(用于 Rook operator 和 Ceph daemons)和“ceph-toolbox-amd64”(用于运行 CLI 的“toolbox”容器)。

4. 构建 Ceph

注意

不需要构建 Ceph 来更改用 Python 编写的 MGR 模块。

Rook 容器和 Ceph 容器现在是独立的。请注意,Rook 的 Ceph 客户端库需要与 Ceph 集群通信,因此需要兼容的主要版本。

您可以使用如下命令运行具有访问您的 Ceph 源代码树权限的 Registry docker 容器

docker run -i -v /my/ceph/src:/my/ceph/src -p 192.168.122.1:5000:5000 -t --name registry registry:2

构建 Ceph 后,您可以使用 kubejacker.sh 脚本将生成的二进制文件注入 Rook 容器镜像中(从您的构建目录运行,但从您的构建容器外部运行)。

5. 运行 Kubejacker

kubejacker 需要访问您的 docker 注册表。执行脚本以构建包含您最新 Ceph 二进制文件的 docker 镜像

build$ ../src/script/kubejacker/kubejacker.sh "<host>:<port>"

现在您已将新构建的 Rook 和新构建的 Ceph 放入一个容器镜像中,准备运行。下次更改 Ceph 中的内容时,您可以重新运行此操作以更新镜像并重新启动 kubernetes 容器。如果更改了 Rook 中的内容,则重新运行 Rook 构建和 Ceph 构建。

5. 运行 Rook 集群

请参阅 Rook 的文档以设置 Rook operator、Ceph 集群和工具箱。

Rook 源代码树包含 cluster/examples/kubernetes/ceph/ 中的示例 .yaml 文件。将这些复制到工作目录中,并根据需要进行编辑以配置您想要的设置

  • 确保 spec.cephVersion.image 指向您的 docker 注册表

    spec:
      cephVersion:
        allowUnsupported: true
        image: 192.168.122.1:5000/ceph/ceph:latest
    

然后,使用 kubectl 将配置加载到 kubernetes API 中

kubectl apply -f ./cluster-test.yaml

使用 kubectl -n rook-ceph get pods 检查 operator pod、Ceph daemons 和工具箱是否正在启动。

一旦一切启动并运行,您应该能够在工具箱容器中打开 shell 并运行 ceph status

如果您的 mon 服务启动了但其余的没有启动,可能是因为它们无法形成仲裁,这是由于 Kubernetes 网络问题:检查您的 Kubernetes 集群中的容器是否可以 ping 其他节点上的容器。

备忘单

在工具箱容器中打开 shell

kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath="{.items[0].metadata.name}") -- bash

检查 Rook operator 容器的日志

kubectl -n rook-ceph logs -l app=rook-ceph-operator

检查 ceph-mgr 容器的日志

kubectl -n rook-ceph logs -l app=rook-ceph-mgr

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入