注意
本文档适用于 Ceph 开发版本。
块设备和Nomad
与Kubernetes一样,Nomad可以使用Ceph块设备。这是通过ceph-csi实现的,它允许您动态提供RBD镜像或导入
Nomad的每个版本都与ceph-csi兼容,但本文件中生成的程序和指南所使用的Nomad参考版本是Nomad v1.1.2,这是编写本文件时的最新版本。
要在Nomad中使用Ceph块设备,您必须在Nomad环境中安装ceph-csi
。以下图表显示了Nomad/Ceph技术堆栈。
Note
Nomad有许多可能的任务驱动程序,但此示例仅使用Docker容器。
重要
ceph-csi
默认情况下,使用RBD内核模块,这可能不支持所有CephCRUSH 调整参数或Ceph.
Create a Pool
默认情况下,Ceph 块设备使用rbd
池。确保您的Ceph集群正在运行,然后为Nomad持久存储创建一个池:
ceph osd pool create nomad
请参阅Create a Pool关于指定池放置组数量的详细信息,请参阅放置组关于您应该为池设置多少放置组的详细信息。
新创建的池在使用前必须初始化。使用rbd
工具初始化池:
rbd pool init nomad
配置 ceph-csi
Ceph客户端身份验证设置
为Nomad创建一个新用户并ceph-csi。执行以下命令并记录生成的密钥:
$ ceph auth get-or-create client.nomad mon 'profile rbd' osd 'profile rbd pool=nomad' mgr 'profile rbd pool=nomad'
[client.nomad]
key = AQAlh9Rgg2vrDxAARy25T7KHabs6iskSHpAEAQ==
配置Nomad
配置Nomad以允许容器使用特权模式
默认情况下,Nomad不允许容器使用特权模式。我们必须/etc/nomad.d/nomad.hcl:
plugin "docker" {
config {
allow_privileged = true
}
}
加载rbd模块
Nomad必须加载rbd模块。运行以下命令以确认该rbd模块已加载:
$ lsmod | grep rbd
rbd 94208 2
libceph 364544 1 rbd
如果未设置rbd如果模块未加载,请加载它:
sudo modprobe rbd
重启Nomad
重启Nomad:
sudo systemctl restart nomad
创建ceph-csi控制器和插件节点
The ceph-csi插件需要两个组件:
控制器插件: 与提供者的API通信。
节点插件: 在客户端上执行任务。
Note
我们将在这些文件中设置ceph-csi的版本。请参阅ceph-csi发布了解ceph-csi与其他版本的兼容性。
配置控制器插件
控制器插件需要Ceph集群的监控地址。收集两者(1)Ceph集群唯一fsid和(2)监控地址:
$ ceph mon dump
<...>
fsid b9127830-b0cc-4e34-aa47-9d1a2e9949a8
<...>
0: [v2:192.168.1.1:3300/0,v1:192.168.1.1:6789/0] mon.a
1: [v2:192.168.1.2:3300/0,v1:192.168.1.2:6789/0] mon.b
2: [v2:192.168.1.3:3300/0,v1:192.168.1.3:6789/0] mon.c
生成一个ceph-csi-plugin-controller.nomad
类似于以下示例的文件。将fsid替换为“clusterID”,并将监控地址替换为
job "ceph-csi-plugin-controller" {
datacenters = ["dc1"]
group "controller" {
network {
port "metrics" {}
}
task "ceph-controller" {
template {
data = <<EOF
[{
"clusterID": "b9127830-b0cc-4e34-aa47-9d1a2e9949a8",
"monitors": [
"192.168.1.1",
"192.168.1.2",
"192.168.1.3"
]
}]
EOF
destination = "local/config.json"
change_mode = "restart"
}
driver = "docker"
config {
image = "quay.io/cephcsi/cephcsi:v3.3.1"
volumes = [
"./local/config.json:/etc/ceph-csi-config/config.json"
]
mounts = [
{
type = "tmpfs"
target = "/tmp/csi/keys"
readonly = false
tmpfs_options = {
size = 1000000 # size in bytes
}
}
]
args = [
"--type=rbd",
"--controllerserver=true",
"--drivername=rbd.csi.ceph.com",
"--endpoint=unix://csi/csi.sock",
"--nodeid=${node.unique.name}",
"--instanceid=${node.unique.name}-controller",
"--pidlimit=-1",
"--logtostderr=true",
"--v=5",
"--metricsport=$${NOMAD_PORT_metrics}"
]
}
resources {
cpu = 500
memory = 256
}
service {
name = "ceph-csi-controller"
port = "metrics"
tags = [ "prometheus" ]
}
csi_plugin {
id = "ceph-csi"
type = "controller"
mount_dir = "/csi"
}
}
}
}
配置插件节点
生成一个ceph-csi-plugin-nodes.nomad
类似于以下示例的文件。将fsid替换为“clusterID”,并将监控地址替换为
job "ceph-csi-plugin-nodes" {
datacenters = ["dc1"]
type = "system"
group "nodes" {
network {
port "metrics" {}
}
task "ceph-node" {
driver = "docker"
template {
data = <<EOF
[{
"clusterID": "b9127830-b0cc-4e34-aa47-9d1a2e9949a8",
"monitors": [
"192.168.1.1",
"192.168.1.2",
"192.168.1.3"
]
}]
EOF
destination = "local/config.json"
change_mode = "restart"
}
config {
image = "quay.io/cephcsi/cephcsi:v3.3.1"
volumes = [
"./local/config.json:/etc/ceph-csi-config/config.json"
]
mounts = [
{
type = "tmpfs"
target = "/tmp/csi/keys"
readonly = false
tmpfs_options = {
size = 1000000 # size in bytes
}
}
]
args = [
"--type=rbd",
"--drivername=rbd.csi.ceph.com",
"--nodeserver=true",
"--endpoint=unix://csi/csi.sock",
"--nodeid=${node.unique.name}",
"--instanceid=${node.unique.name}-nodes",
"--pidlimit=-1",
"--logtostderr=true",
"--v=5",
"--metricsport=$${NOMAD_PORT_metrics}"
]
privileged = true
}
resources {
cpu = 500
memory = 256
}
service {
name = "ceph-csi-nodes"
port = "metrics"
tags = [ "prometheus" ]
}
csi_plugin {
id = "ceph-csi"
type = "node"
mount_dir = "/csi"
}
}
}
}
启动插件控制器和Nomad节点
要启动插件控制器和Nomad节点,请运行以下命令:
nomad job run ceph-csi-plugin-controller.nomad
nomad job run ceph-csi-plugin-nodes.nomad
The ceph-csi将下载镜像。
几分钟后检查插件状态:
$ nomad plugin status ceph-csi
ID = ceph-csi
Provider = rbd.csi.ceph.com
Version = 3.3.1
Controllers Healthy = 1
Controllers Expected = 1
Nodes Healthy = 1
Nodes Expected = 1
Allocations
ID Node ID Task Group Version Desired Status Created Modified
23b4db0c a61ef171 nodes 4 run running 3h26m ago 3h25m ago
fee74115 a61ef171 controller 6 run running 3h26m ago 3h25m ago
使用 Ceph 块设备
创建rbd镜像
ceph-csi
需要用于与 Ceph 集群通信的 cephx 凭据。生成一个ceph-volume.hcl
类似于以下示例的文件,使用新创建的nomad用户ID和cephx密钥:
id = "ceph-mysql"
name = "ceph-mysql"
type = "csi"
plugin_id = "ceph-csi"
capacity_max = "200G"
capacity_min = "100G"
capability {
access_mode = "single-node-writer"
attachment_mode = "file-system"
}
secrets {
userID = "admin"
userKey = "AQAlh9Rgg2vrDxAARy25T7KHabs6iskSHpAEAQ=="
}
parameters {
clusterID = "b9127830-b0cc-4e34-aa47-9d1a2e9949a8"
pool = "nomad"
imageFeatures = "layering"
mkfsOptions = "-t ext4"
}
在查询每个主机的ceph-volume.hcl
文件已生成,创建卷:
nomad volume create ceph-volume.hcl
使用rbd镜像与容器
作为使用rbd镜像与容器的练习,修改Hashicorpnomad有状态示例。
生成一个mysql.nomad
类似于以下示例的文件:
job "mysql-server" {
datacenters = ["dc1"]
type = "service"
group "mysql-server" {
count = 1
volume "ceph-mysql" {
type = "csi"
attachment_mode = "file-system"
access_mode = "single-node-writer"
read_only = false
source = "ceph-mysql"
}
network {
port "db" {
static = 3306
}
}
restart {
attempts = 10
interval = "5m"
delay = "25s"
mode = "delay"
}
task "mysql-server" {
driver = "docker"
volume_mount {
volume = "ceph-mysql"
destination = "/srv"
read_only = false
}
env {
MYSQL_ROOT_PASSWORD = "password"
}
config {
image = "hashicorp/mysql-portworx-demo:latest"
args = ["--datadir", "/srv/mysql"]
ports = ["db"]
}
resources {
cpu = 500
memory = 1024
}
service {
name = "mysql-server"
port = "db"
check {
type = "tcp"
interval = "10s"
timeout = "2s"
}
}
}
}
}
启动作业:
nomad job run mysql.nomad
检查作业状态:
$ nomad job status mysql-server
...
Status = running
...
Allocations
ID Node ID Task Group Version Desired Status Created Modified
38070da7 9ad01c63 mysql-server 0 run running 6s ago 3s ago
要检查数据是否持久,请修改数据库,清除作业,然后使用相同的文件创建它。将使用相同的RBD镜像(实际上是重复使用)。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.