Skip to main content

使用 librados 访问 Ceph 集群

如果使用 Ceph 作为 JuiceFS 的底层存储,既可以使用标准的 S3 RESTful API 来访问 Ceph Object Gateway(RGW),也可以使用效率更高的 librados 访问 Ceph 存储。

JuiceFS CSI 驱动支持「为 Mount Pod 额外添加文件」。利用这种机制,可以将主机 /etc/ceph 路径下的 Ceph Client 配置文件导入 Mount Pod。

使用 Ceph 存储创建 JuiceFS volume

假设我们有一个 Ceph 集群,在任意一台节点上,查看 /etc/ceph 路径下的文件:

/etc/ceph/
├── ceph.client.admin.keyring
├── ceph.conf
├── ...
└── ...

通过 ceph.confceph.client.admin.keyring 就可以用 librados 访问 Ceph 集群。

在这个节点上创建一个 JuiceFS volume ceph-volume

juicefs format --storage=ceph \
--bucket=ceph://ceph-test \
--access-key=ceph \
--secret-key=client.admin \
redis://juicefs-redis.example.com/2 \
ceph-volume
注意

这里我们假设 Redis URL 为 redis://juicefs-redis.example.com/2,需要将其换成您自己环境中的参数。关于 Ceph RADOS --access-key--secret-key 的更多细节,可以参考 JuiceFS 支持的对象存储和设置指南

查看 Ceph 存储状态:

$ ceph osd pool ls
ceph-test

根据 Ceph 配置文件创建 Secret

以下命令会在 Ceph 所在节点创建一个名为 ceph-conf.yaml 的 YAML 文件,请将 CEPH_CLUSTER_NAME 替换成实际的名称:

$ cat > ceph-conf.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
name: ceph-conf
namespace: kube-system
type: Opaque
data:
<CEPH_CLUSTER_NAME>.conf: $(base64 -w 0 /etc/ceph/ceph.conf)
<CEPH_CLUSTER_NAME>.client.admin.keyring: $(base64 -w 0 /etc/ceph/ceph.client.admin.keyring)
EOF
注意

行首的 $ 是 shell 提示符。base64 命令是必需的,如果不存在,请尝试使用您的操作系统包管理器安装 coreutils 包,例如 apt-getyum

将生成出来的 ceph-conf.yaml 文件应用到 Kubernetes 集群中:

$ kubectl apply -f ceph-conf.yaml

$ kubectl -n kube-system describe secret ceph-conf
Name: ceph-conf
Namespace: kube-system
Labels: <none>
Annotations: <none>

Type: Opaque

Data
====
ceph.client.admin.keyring: 63 bytes
ceph.conf: 257 bytes

创建 JuiceFS CSI Driver 需要的 Secret

参考以下命令创建 Secret 配置文件:

$ cat > juicefs-secret.yaml <<EOF
apiVersion: v1
metadata:
name: juicefs-secret
namespace: kube-system
kind: Secret
type: Opaque
data:
bucket: $(echo -n ceph://ceph-test | base64 -w 0)
metaurl: $(echo -n redis://juicefs-redis.example.com/2 | base64 -w 0)
name: $(echo -n ceph-volume | base64 -w 0)
storage: $(echo -n ceph | base64 -w 0)
access-key: $(echo -n ceph | base64 -w 0)
secret-key: $(echo -n client.admin | base64 -w 0)
configs: $(echo -n '{"ceph-conf": "/etc/ceph"}' | base64 -w 0)
EOF

应用配置:

$ kubectl apply -f juicefs-secret.yaml
secret/juicefs-secret created

查看配置是否生效:

$ kubectl -n kube-system describe secret juicefs-secret
Name: juicefs-secret
Namespace: kube-system
Labels: <none>
Annotations: <none>

Type: Opaque

Data
====
access-key: 4 bytes
bucket: 16 bytes
configs: 26 bytes
metaurl: 35 bytes
name: 11 bytes
secret-key: 12 bytes
storage: 4 bytes

我们希望之前创建的 ceph-conf Secret 被挂载到 /etc/ceph 下,因此这里构造了一个 Key 为 configs 的 JSON 字符串 {"ceph-conf": "/etc/ceph"}

在 Kubernetes pod 中访问 JuiceFS volume

动态挂载

如何使用 StorageClass 访问 JuiceFS,请参考「动态配置」$(SECRET_NAME) 替换为 juicefs-secret,将 $(SECRET_NAMESPACE) 替换为 kube-system

静态挂载

如何使用 Persistent Volume 访问 JuiceFS,请参考「静态配置」nodePublishSecretRefnamenamespace 替换为 juicefs-sceretkube-system

其他 Ceph 版本

JuiceFS 目前支持到 Ceph 12,如果你使用的 Ceph 版本高于 12,请参考以下方法构建镜像。

如何构建镜像

使用官方的 ceph/ceph 作为基础镜像,根据 Ceph Nautilus 构建 JuiceFS CSI Driver 镜像,例如:

docker build --build-arg BASE_IMAGE=ceph/ceph:v14 --build-arg JUICEFS_REPO_TAG=v0.16.2 -f docker/ceph.Dockerfile -t juicefs-csi-driver:ceph-nautilus .

ceph/ceph:v14 镜像是 Ceph Nautilus 的官方 Ceph 镜像,对于其他 Ceph 发布基础镜像,请参考 Ceph 镜像仓库