注意
本文档适用于 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 的同一主机。
安装
docker-distribution包。如果要配置端口,请编辑
/etc/docker-distribution/registry/config.yml启用注册表服务
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