如何使用 Rook 在 Kubernetes 中建立 Ceph 集群

作者选择了 Mozilla 基金会作为 写给捐赠计划的一部分接受捐赠。

介绍

Kubernetes容器是 stateless 作为一个核心原则,但数据仍然必须被管理,保留,并使其他服务可用。Stateless 意味着容器处于孤立运行中,没有任何过去交易的知识,这使得更换,删除或分发容器很容易。

Rook是一个存储管制工具,为多元化的存储提供商提供云原生开源解决方案。

Ceph是一个高度可扩展的分布式存储解决方案,提供对象、区块和文件存储。Ceph集群旨在使用所谓的[CRUSH算法(控制复制在可扩展的哈希)的任何硬件上运行。

这种部署的一个主要好处是,您可以获得Ceph的高度可扩展的存储解决方案,而无需使用Ceph命令行手动配置它,因为Rook会自动处理它。

在本教程中,您将使用 Rook 设置一个 Ceph 集群,并将其用于为 MongoDB 数据库提供持续数据。

如果您正在寻找一个管理的Kubernetes托管服务,请查看我们的简单的,用于增长的管理的Kubernetes服务(https://www.digitalocean.com/products/kubernetes)。

<$>[注] **注:**本指南应该作为Rook Ceph的介绍,不打算是大量机器的生产部署。

前提条件

在您开始本指南之前,您将需要以下内容:

  • 一个包含至少三个节点的 DigitalOcean Kubernetes 集群,每个节点都有 2 个 vCPU 和 4 GB 内存。 要在 DigitalOcean 上创建一个集群并连接到它,请参阅 Kubernetes Quickstart
  • 安装在开发服务器上的 kubectl 命令行工具,并配置为连接到您的集群。 您可以在其 [官方文档]中阅读有关安装 kubectl 的更多信息(https://kubernetes.io/docs/tasks/tools/install-kubectl/)。
  • A DigitalOcean 区块存储 每个节点至少包含 100 GB 的卷,例如,如果您有三个节点,您需要三个卷。 ** 选择手动格式,而不是自动,然后将您的卷

步骤 1 - 设置Rook

完成前提后,您拥有一个功能齐全的 Kubernetes 集群,包括三个节点和三个卷,您现在已经准备好设置 Rook。

在本节中,您将克隆Rook存储库,在您的Kubernetes集群上部署您的第一个Rook operator,并验证所提供的部署状态。

在您开始部署所需的Rook资源之前,您首先需要在所有节点上安装LVM包作为Ceph的先决条件,为此,您将创建一个KubernetesDaemonSet,使用apt在节点上安装LVM包。

首先,您将创建一个YAML文件:

1nano lvm.yaml

DaemonSet将定义将在每个节点上执行的容器. 在这里,您将定义一个DaemonSet以运行debian的容器,该容器使用apt命令安装lvm2,然后使用volumeMounts将安装文件复制到节点:

 1[label lvm.yaml]
 2apiVersion: apps/v1
 3kind: DaemonSet
 4metadata:
 5 name: lvm
 6 namespace: kube-system
 7spec:
 8 revisionHistoryLimit: 10
 9 selector:
10   matchLabels:
11     name: lvm
12 template:
13   metadata:
14     labels:
15       name: lvm
16   spec:
17     containers:
18     - args:
19       - apt -y update; apt -y install lvm2
20       command:
21       - /bin/sh
22       - -c
23       image: debian:10
24       imagePullPolicy: IfNotPresent
25       name: lvm
26       securityContext:
27         privileged: true
28       volumeMounts:
29       - mountPath: /etc
30         name: etc
31       - mountPath: /sbin
32         name: sbin
33       - mountPath: /usr
34         name: usr
35       - mountPath: /lib
36         name: lib
37     dnsPolicy: ClusterFirst
38     restartPolicy: Always
39     schedulerName: default-scheduler
40     securityContext:
41     volumes:
42     - hostPath:
43         path: /etc
44         type: Directory
45       name: etc
46     - hostPath:
47         path: /sbin
48         type: Directory
49       name: sbin
50     - hostPath:
51         path: /usr
52         type: Directory
53       name: usr
54     - hostPath:
55         path: /lib
56         type: Directory
57       name: lib

现在DaemonSet已正确配置,是时候使用以下命令应用它了:

1kubectl apply -f lvm.yaml

现在,所有前提都满足了,你将克隆Rook存储库,所以你有所有必要的资源来开始设置Rook集群:

1git clone --single-branch --branch release-1.3 https://github.com/rook/rook.git

此命令将从 GitHub 克隆 Rook 存储库,并在您的目录中创建一个名为rook的文件夹。

1cd rook/cluster/examples/kubernetes/ceph

接下来,您将继续创建您需要的Rook部署的常见资源,您可以通过部署默认情况下在目录中可用的Kubernetes config文件来完成此操作:

1kubectl create -f common.yaml

您创建的资源主要是 CustomResourceDefinitions (CRDs),并定义操作员以后会使用的新资源,这些资源包含 ServiceAccount、Role、RoleBinding、ClusterRole 和 ClusterRoleBinding 等资源。

<$>[注] 注: 此标准文件假定您将部署 Rook 操作员和所有 Ceph 戴蒙在相同的命名空间中。

共同资源创建后,下一步是创建Rook操作员。

在部署operator.yaml文件之前,您需要更改CSI_RBD_GRPC_METRICS_PORT变量,因为您的DigitalOcean Kubernetes集群已默认使用标准端口。

1nano operator.yaml

然后搜索CSI_RBD_GRPC_METRICS_PORT变量,删除#并将该值从端口9090更改为9093:

 1[label operator.yaml]
 2kind: ConfigMap
 3apiVersion: v1
 4metadata:
 5  name: rook-ceph-operator-config
 6  namespace: rook-ceph
 7data:
 8  ROOK_CSI_ENABLE_CEPHFS: "true"
 9  ROOK_CSI_ENABLE_RBD: "true"
10  ROOK_CSI_ENABLE_GRPC_METRICS: "true"
11  CSI_ENABLE_SNAPSHOTTER: "true"
12  CSI_FORCE_CEPHFS_KERNEL_CLIENT: "true"
13  ROOK_CSI_ALLOW_UNSUPPORTED_VERSION: "false"
14  # Configure CSI CSI Ceph FS grpc and liveness metrics port
15  # CSI_CEPHFS_GRPC_METRICS_PORT: "9091"
16  # CSI_CEPHFS_LIVENESS_METRICS_PORT: "9081"
17  # Configure CSI RBD grpc and liveness metrics port
18  CSI_RBD_GRPC_METRICS_PORT: "9093"
19  # CSI_RBD_LIVENESS_METRICS_PORT: "9080"

一旦完成,保存并退出文件。

接下来,您可以使用以下命令部署操作员:

1kubectl create -f operator.yaml

命令将输出如下:

1[secondary_label Output]
2configmap/rook-ceph-operator-config created
3deployment.apps/rook-ceph-operator created

再次,您正在使用创建kubectl命令与f旗帜来分配您要应用的文件. 操作员运行需要几秒钟左右。

1kubectl get pod -n rook-ceph

您使用n旗获取特定 Kubernetes 名称空间的 pods(本示例中的rook-ceph)。

一旦操作员部署完成,它将触发创建负责在群集的每个工人节点上创建rook-discovery代理的DeamonSets。

1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3rook-ceph-operator-599765ff49-fhbz9 1/1 Running 0 92s
4rook-discover-6fhlb 1/1 Running 0 55s
5rook-discover-97kmz 1/1 Running 0 55s
6rook-discover-z5k2z 1/1 Running 0 55s

您已成功安装 Rook 并部署了您的第一个操作员,接下来,您将创建一个 Ceph 集群并验证它是否在工作。

步骤 2 – 创建一个Ceph集群

现在,您已经在 Kubernetes 集群上成功设置了 Rook,您将继续在 Kubernetes 集群中创建一个 Ceph 集群并验证其功能性。

首先,让我们来看看最重要的Ceph组件及其功能:

  • Ceph Monitors,也被称为 MONs,负责维护需要让 Ceph Daemon 相互协调的群集地图。 应该总是有多个 MON 运行,以增加您的存储服务的可靠性和可用性。
  • Ceph Managers,也被称为 MGRs,是负责跟踪运行时间指标和您的 Ceph 群集的当前状态的运行时的 Daemons。 它们应该与您的监控 Daemons (MON) 一起运行,以提供额外的监控和外部监控和管理系统的接口。
  • Ceph Object Store Devices,也被称为 OSDs,负责在本地文件系统中存储对象并通过网络提供访问。 这些通常与您的群集的一个物理磁盘相关。

为了与 Ceph 存储中的数据进行交互,客户端首先会与 Ceph 监视器(MONs)联系以获取 cluster map 的当前版本。

Rook 允许 Ceph 存储在您的 Kubernetes 集群上运行。所有这些组件都在您的 Rook 集群中运行,并将直接与 Rook 代理商进行交互。这为管理您的 Ceph 集群提供了更简化的体验,通过隐藏 Ceph 组件,如定位组和存储地图,同时还提供高级配置的选项。

现在你对Ceph是什么以及它如何在Rook中使用有了更好的了解,你将通过设置Ceph集群来继续。

您可以通过运行 Rook 项目的示例目录中的示例配置来完成设置,或者通过写下自己的配置来完成设置。

现在你将开始创建一个Ceph集群的过程 Kubernetes Object

首先,你需要创建一个YAML文件:

1nano cephcluster.yaml

该配置定义了如何部署 Ceph 集群. 在本示例中,您将部署三个 Ceph 监视器(MON)并启用 Ceph 仪表板. Ceph 仪表板不适用于本教程,但您可以在稍后的个人项目中使用它来可视化 Ceph 集群的当前状态。

添加以下内容来定义apiVersionKubernetes Object类型,以及对象应该部署的名称名称空间:

1[label cephcluster.yaml]
2apiVersion: ceph.rook.io/v1
3kind: CephCluster
4metadata:
5  name: rook-ceph
6  namespace: rook-ceph

然后,添加spec键,定义了Kubernetes将使用的模型来创建您的Ceph集群,您将首先定义您想要使用的图像版本,以及是否允许不受支持的Ceph版本:

1[label cephcluster.yaml]
2spec:
3  cephVersion:
4    image: ceph/ceph:v14.2.8
5    allowUnsupported: false

然后设置数据目录,其中配置文件将继续使用dataDirHostPath键:

1[label cephcluster.yaml]
2  dataDirHostPath: /var/lib/rook

接下来,您可以使用以下参数定义是否要跳过升级检查以及何时要升级集群:

1[label cephcluster.yaml]
2  skipUpgradeChecks: false
3  continueUpgradeAfterChecksEvenIfNotHealthy: false

您使用mon键配置 Ceph 监视器(MON)的数量,您还允许每个节点部署多个 MON:

1[label cephcluster.yaml]
2  mon:
3    count: 3
4    allowMultiplePerNode: false

Ceph 仪表板的选项在仪表板键下定义,这为您提供了启用仪表板、自定义端口并在使用逆向代理时预先定义的选项:

1[label cephcluster.yaml]
2  dashboard:
3    enabled: true
4    # serve the dashboard under a subpath (useful when you are accessing the dashboard via a reverse proxy)
5    # urlPrefix: /ceph-dashboard
6    # serve the dashboard at the given port.
7    # port: 8443
8    # serve the dashboard using SSL
9    ssl: false

您还可以使用监控键启用集群监控(监控需要 Prometheus 要预安装):

1[label cephcluster.yaml]
2  monitoring:
3    enabled: false
4    rulesNamespace: rook-ceph

RDB是RADOS(Reliable Autonomic Distributed Object Store)区块设备的缩写,它们是薄型和可调整的Ceph区块设备,可以在多个节点上存储数据。

RBD 图像可以通过启用rbdMirroring在两个 Ceph 集群之间无同步共享。由于我们在本教程中正在使用一个集群,这并不必要。

1[label cephcluster.yaml]
2  rbdMirroring:
3    workers: 0

您可以启用Ceph Daemons的碰撞收集器:

1[label cephcluster.yaml]
2  crashCollector:
3    disable: false

清理策略只有在您想要删除集群时才重要,这就是为什么该选项必须保持空的原因:

1[label cephcluster.yaml]
2  cleanupPolicy:
3    deleteDataDirOnHosts: ""
4  removeOSDsIfOutAndSafeToRemove: false

存储键允许您定义群集级存储选项;例如,使用哪个节点和设备,数据库大小以及每个设备要创建多少OSD:

1[label cephcluster.yaml]
2  storage:
3    useAllNodes: true
4    useAllDevices: true
5    config:
6      # metadataDevice: "md0" # specify a non-rotational storage so ceph-volume will use it as block db device of bluestore.
7      # databaseSizeMB: "1024" # uncomment if the disks are smaller than 100 GB
8      # journalSizeMB: "1024"  # uncomment if the disks are 20 GB or smaller

您可以使用disruptionManagement键来管理升级或围栏期间的 DAEMON 干扰:

1[label cephcluster.yaml]
2  disruptionManagement:
3    managePodBudgets: false
4    osdMaintenanceTimeout: 30
5    manageMachineDisruptionBudgets: false
6    machineDisruptionBudgetNamespace: openshift-machine-api

这些配置块将导致最终的下列文件:

 1[label cephcluster.yaml]
 2apiVersion: ceph.rook.io/v1
 3kind: CephCluster
 4metadata:
 5  name: rook-ceph
 6  namespace: rook-ceph
 7spec:
 8  cephVersion:
 9    image: ceph/ceph:v14.2.8
10    allowUnsupported: false
11  dataDirHostPath: /var/lib/rook
12  skipUpgradeChecks: false
13  continueUpgradeAfterChecksEvenIfNotHealthy: false
14  mon:
15    count: 3
16    allowMultiplePerNode: false
17  dashboard:
18    enabled: true
19    # serve the dashboard under a subpath (useful when you are accessing the dashboard via a reverse proxy)
20    # urlPrefix: /ceph-dashboard
21    # serve the dashboard at the given port.
22    # port: 8443
23    # serve the dashboard using SSL
24    ssl: false
25  monitoring:
26    enabled: false
27    rulesNamespace: rook-ceph
28  rbdMirroring:
29    workers: 0
30  crashCollector:
31    disable: false
32  cleanupPolicy:
33    deleteDataDirOnHosts: ""
34  removeOSDsIfOutAndSafeToRemove: false
35  storage:
36    useAllNodes: true
37    useAllDevices: true
38    config:
39      # metadataDevice: "md0" # specify a non-rotational storage so ceph-volume will use it as block db device of bluestore.
40      # databaseSizeMB: "1024" # uncomment if the disks are smaller than 100 GB
41      # journalSizeMB: "1024"  # uncomment if the disks are 20 GB or smaller
42  disruptionManagement:
43    managePodBudgets: false
44    osdMaintenanceTimeout: 30
45    manageMachineDisruptionBudgets: false
46    machineDisruptionBudgetNamespace: openshift-machine-api

一旦完成,保存并退出您的文件。

您还可以自定义部署,例如更改数据库大小或为仪表板定义自定义端口。

接下来,在您的 Kubernetes 集群中应用此宣言:

1kubectl apply -f cephcluster.yaml

现在检查一下,这些子是否在运行:

1kubectl get pod -n rook-ceph

这通常需要几分钟,所以只需刷新,直到您的输出反映出如下:

 1[secondary_label Output]
 2NAME READY STATUS RESTARTS AGE
 3csi-cephfsplugin-lz6dn 3/3 Running 0 3m54s
 4csi-cephfsplugin-provisioner-674847b584-4j9jw 5/5 Running 0 3m54s
 5csi-cephfsplugin-provisioner-674847b584-h2cgl 5/5 Running 0 3m54s
 6csi-cephfsplugin-qbpnq 3/3 Running 0 3m54s
 7csi-cephfsplugin-qzsvr 3/3 Running 0 3m54s
 8csi-rbdplugin-kk9sw 3/3 Running 0 3m55s
 9csi-rbdplugin-l95f8 3/3 Running 0 3m55s
10csi-rbdplugin-provisioner-64ccb796cf-8gjwv 6/6 Running 0 3m55s
11csi-rbdplugin-provisioner-64ccb796cf-dhpwt 6/6 Running 0 3m55s
12csi-rbdplugin-v4hk6 3/3 Running 0 3m55s
13rook-ceph-crashcollector-pool-33zy7-68cdfb6bcf-9cfkn 1/1 Running 0 109s
14rook-ceph-crashcollector-pool-33zyc-565559f7-7r6rt 1/1 Running 0 53s
15rook-ceph-crashcollector-pool-33zym-749dcdc9df-w4xzl 1/1 Running 0 78s
16rook-ceph-mgr-a-7fdf77cf8d-ppkwl 1/1 Running 0 53s
17rook-ceph-mon-a-97d9767c6-5ftfm 1/1 Running 0 109s
18rook-ceph-mon-b-9cb7bdb54-lhfkj 1/1 Running 0 96s
19rook-ceph-mon-c-786b9f7f4b-jdls4 1/1 Running 0 78s
20rook-ceph-operator-599765ff49-fhbz9 1/1 Running 0 6m58s
21rook-ceph-osd-prepare-pool-33zy7-c2hww 1/1 Running 0 21s
22rook-ceph-osd-prepare-pool-33zyc-szwsc 1/1 Running 0 21s
23rook-ceph-osd-prepare-pool-33zym-2p68b 1/1 Running 0 21s
24rook-discover-6fhlb 1/1 Running 0 6m21s
25rook-discover-97kmz 1/1 Running 0 6m21s
26rook-discover-z5k2z 1/1 Running 0 6m21s

您现在已经成功设置了 Ceph 集群,并可以通过创建您的第一个存储块来继续。

步骤3 - 添加区块存储

区块存储允许单个Pod来安装存储空间. 在本节中,您将创建一个存储区块,您可以在以后的应用程序中使用。

在 Ceph 能够为您的集群提供存储空间之前,您首先需要创建一个存储类和一个cephblockpool

1kubectl apply -f ./csi/rbd/storageclass.yaml

命令将输出如下:

1[secondary_label Output]
2cephblockpool.ceph.rook.io/replicapool created
3storageclass.storage.k8s.io/rook-ceph-block created

<$>[注] 注: 如果您已在rook-ceph以外的名称空间部署了Rook操作员,则需要更改提供器中的前缀以匹配您使用的名称空间。

在成功部署storageclasscephblockpool后,您将继续为您的应用程序定义 PersistentVolumeClaim (PVC)

要做到这一点,您首先需要创建一个YAML文件:

1nano pvc-rook-ceph-block.yaml

添加以下内容为您的 PersistentVolumeClaim:

 1[label pvc-rook-ceph-block.yaml]
 2apiVersion: v1
 3kind: PersistentVolumeClaim
 4metadata:
 5  name: mongo-pvc
 6spec:
 7  storageClassName: rook-ceph-block
 8  accessModes:
 9  - ReadWriteOnce
10  resources:
11    requests:
12      storage: 5Gi

首先,您需要设置一个apiVersion(v1是当前的稳定版本)。

spec键定义了 Kubernetes 将使用的模型来创建您的 PersistentVolumeClaim. 在这里,您需要选择您之前创建的存储类别: rook-ceph-block. 然后您可以定义访问模式,并限制索赔的资源。

现在你已经定义了 PersistentVolumeClaim,是时候使用以下命令部署它了:

1kubectl apply -f pvc-rook-ceph-block.yaml

您将获得以下输出:

1[secondary_label Output]
2persistentvolumeclaim/mongo-pvc created

您现在可以检查您的PVC的状态:

1kubectl get pvc

当PVC被绑定时,你准备好了:

1[secondary_label Output]
2NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
3mongo-pvc Bound pvc-ec1ca7d1-d069-4d2a-9281-3d22c10b6570 5Gi RWO rook-ceph-block 16s

您现在已经成功创建了一个存储类,并使用它创建一个PersistenVolumeClaim,将其安装到应用程序中,以便在下一节中保持数据。

步骤 4 — 使用 rook-ceph 块创建 MongoDB 部署

现在你已经成功创建了一个存储区块和一个持久的体积,你将通过在MongoDB应用程序中实现它。

配置将包含几个内容:

  • 基于mongo图像的最新版本的单个容器部署。 一个持久的体积来保存MongoDB数据库的数据。
  • 一个服务来暴露每个节点的31017端口上的MongoDB端口,以便您可以稍后与它进行交互。

首先打开配置文件:

1nano mongo.yaml

使用部署资源启动宣言:

 1[label mongo.yaml]
 2apiVersion: apps/v1
 3kind: Deployment
 4metadata:
 5  name: mongo
 6spec:
 7  selector:
 8    matchLabels:
 9      app: mongo
10  template:
11    metadata:
12      labels:
13        app: mongo
14    spec:
15      containers:
16      - image: mongo:latest
17        name: mongo
18        ports:
19        - containerPort: 27017
20          name: mongo
21        volumeMounts:
22        - name: mongo-persistent-storage
23          mountPath: /data/db
24      volumes:
25      - name: mongo-persistent-storage
26        persistentVolumeClaim:
27          claimName: mongo-pvc
28
29...

对于明示中的每个资源,您需要设置一个apiVersion。 对于部署和服务,请使用apiVersion: apps/v1,这是一个稳定版本。 然后,请告诉 Kubernetes 使用品种键定义哪个资源。

spec部分告诉Kubernetes你最终部署状态的预期状态是什么。

标签是关键值对,可帮助您组织和交叉引用您的 Kubernetes 资源,您可以使用 metadata.labels' 来定义它们,然后使用 selector.matchLabels' 来搜索它们。

spec.template键定义了Kubernetes将使用的模型来创建您的每个pod. 在这里,您将定义您的pod的部署的规格,如图像名称,容器端口和应该安装的卷。

在这里,您将使用您之前创建的 PersistentVolumeClaim 来保持 pods 的 `/data/db 目录中的数据,您还可以指定其他信息,例如环境变量,以帮助您进一步定制部署。

接下来,将下列代码添加到文件中,以定义一个Kubernetes服务,它暴露了群集中的每个节点的MongoDB端口31017:

 1[label mongo.yaml]
 2...
 3
 4---
 5apiVersion: v1
 6kind: Service
 7metadata:
 8  name: mongo
 9  labels:
10    app: mongo
11spec:
12  selector:
13    app: mongo
14  type: NodePort
15  ports:
16    - port: 27017
17      nodePort: 31017

在这里,您还定义了apiVersion,但而不是使用部署类型,您定义了服务。服务将在端口31017上接收连接,并将其转发到pods端口27017,然后您可以访问应用程序。

该服务使用NodePort作为服务类型,在3000032767之间的静态端口(在这种情况下31017)上曝光服务

现在你已经定义了部署,是时候部署了:

1kubectl apply -f mongo.yaml

您将看到以下结果:

1[secondary_label Output]
2deployment.apps/mongo created
3service/mongo created

您可以查看部署和服务的状态:

1kubectl get svc,deployments

输出将是这样的东西:

1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)           AGE
3service/kubernetes ClusterIP 10.245.0.1       <none>        443/TCP 33m
4service/mongo NodePort 10.245.124.118   <none>        27017:31017/TCP 4m50s
5
6NAME READY UP-TO-DATE AVAILABLE AGE
7deployment.apps/mongo 1/1 1 1 4m50s

部署完成后,您可以开始将数据保存到您的数据库中。最简单的方法是使用MongoDB壳,它包含在您刚刚开始的MongoDB pod中。

为此,您将需要pod的名称,您可以使用以下命令获取:

1kubectl get pods

结果将类似于此:

1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3mongo-7654889675-mjcks 1/1 Running 0 13m

现在复制名称并在exec命令中使用它:

1kubectl exec -it your_pod_name mongo

现在你在 MongoDB 壳中,让我们继续创建一个数据库:

1use test

使用命令在数据库之间切换或创建数据库,如果数据库不存在。

1[secondary_label Output]
2switched to db test

然后将一些数据插入你的新测试数据库. 您使用insertOne()方法将新文档插入创建的数据库:

1db.test.insertOne( {name: "test", number: 10  })
1[secondary_label Output]
2{
3    "acknowledged" : true,
4    "insertedId" : ObjectId("5f22dd521ba9331d1a145a58")
5}

下一步是检索数据,以确保它被保存,这可以通过收集中的查找命令来完成:

1db.getCollection("test").find()

结果将类似于此:

1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3{ "_id" : ObjectId("5f1b18e34e69b9726c984c51"), "name" : "test", "number" : 10 }

现在你已经将一些数据保存到数据库中,它将继续存在于底层的Ceph体积结构中。这种部署的一个大优势是体积的动态配置。动态配置意味着应用程序只需要要求存储,并且它将由Ceph自动提供,而不是开发人员通过向其存储提供商发送请求来手动创建存储。

让我们通过重新启动pod来验证此功能,并检查数据是否仍然存在,您可以通过删除pod来做到这一点,因为它将重新启动以满足部署中定义的状态:

1kubectl delete pod -l app=mongo

现在让我们通过连接到MongoDB壳并打印数据来验证数据是否仍然存在,因此您需要先获取pod的名称,然后使用exec命令来打开MongoDB壳:

1kubectl get pods

结果将类似于此:

1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3mongo-7654889675-mjcks 1/1 Running 0 13m

现在复制名称并在exec命令中使用它:

1kubectl exec -it your_pod_name mongo

之后,您可以通过连接到数据库并打印整个集合来获取数据:

1use test
2db.getCollection("test").find()

结果将看起来像这样:

1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3{ "_id" : ObjectId("5f1b18e34e69b9726c984c51"), "name" : "test", "number" : 10 }

现在你已经成功设置了Rook和Ceph,并使用它们来维持你的部署数据,让我们审查Rook工具箱和你可以用它做什么。

第5步:运行Rook工具箱

Rook Toolbox是一个工具,可以帮助您了解Ceph部署的当前状态,并在出现问题时解决问题,还允许您更改Ceph配置,例如启用某些模块,创建用户或池。

在本节中,您将安装Rook Toolbox,并使用它执行基本命令,例如获取当前Ceph状态。

工具箱可以通过部署在examples/kubernetes/ceph目录中的toolbox.yaml文件来启动:

1kubectl apply -f toolbox.yaml

您将获得以下输出:

1[secondary_label Output]
2deployment.apps/rook-ceph-tools created

现在检查Pod是否在运行:

1kubectl -n rook-ceph get pod -l "app=rook-ceph-tools"

您的输出将类似于此:

1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3rook-ceph-tools-7c5bf67444-bmpxc 1/1 Running 0 9s

一旦pod运行,您可以使用kubectl exec命令连接到它:

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

让我们把这个命令打破,以便更好地理解:

1.kubectl exec命令允许您在一个pod中执行命令;例如设置环境变量或启动服务。在这里,您使用它来在pod中打开BASH终端。您想要执行的命令在命令的末尾定义。 2 您使用-n旗号来指定运行在pod的Kubernetes名空间。 4. `$() 允许您在命令中定义一个表达式。这意味着表达式将在命令名称之前进行评估(执行)并将结果值传递给主要命令参数。在这里,我们将用另一个命令来定义Kubernet,然后使用我们的命令pod。

<$>[注] 注: 正如已经提到的那样,这个命令将在pod中打开一个终端,所以你的提示将改变以反映这一点。

现在你已连接到pod,你可以执行Ceph命令来检查当前状态或故障排除错误消息,例如ceph status命令将为你提供Ceph配置的当前健康状态,以及更多信息,如运行MON,当前运行数据池,可用和使用的存储,以及当前的I/O操作:

1ceph status

以下是命令的输出:

 1[secondary_label Output]
 2  cluster:
 3    id:     71522dde-064d-4cf8-baec-2f19b6ae89bf
 4    health: HEALTH_OK
 5
 6  services:
 7    mon: 3 daemons, quorum a,b,c (age 23h)
 8    mgr: a(active, since 23h)
 9    osd: 3 osds: 3 up (since 23h), 3 in (since 23h)
10
11  data:
12    pools:   1 pools, 32 pgs
13    objects: 61 objects, 157 MiB
14    usage:   3.4 GiB used, 297 GiB / 300 GiB avail
15    pgs:     32 active+clean
16
17  io:
18    client:   5.3 KiB/s wr, 0 op/s rd, 0 op/s wr

您还可以使用以下命令查询特定项目的状态,例如您的 OSD:

1ceph osd status

这将打印有关您的OSD的信息,例如使用和可用的存储空间以及OSD的当前状态:

1[secondary_label Output]
2+----+------------+-------+-------+--------+---------+--------+---------+-----------+
3| id |    host    |  used | avail | wr ops | wr data | rd ops | rd data |   state   |
4+----+------------+-------+-------+--------+---------+--------+---------+-----------+
5| 0  | node-3jis6 | 1165M | 98.8G |    0   |     0   |    0   |     0   | exists,up |
6| 1  | node-3jisa | 1165M | 98.8G |    0   |  5734   |    0   |     0   | exists,up |
7| 2  | node-3jise | 1165M | 98.8G |    0   |     0   |    0   |     0   | exists,up |
8+----+------------+-------+-------+--------+---------+--------+---------+-----------+

有关可用的命令以及如何使用它们来调试 Ceph 部署的更多信息可以在 官方文档中找到。

您现在已经成功地在Kubernetes上设置了一个完整的Rook Ceph集群,这有助于您保持部署的数据,并在不同的Pod之间共享它们的状态,而无需手动使用某种外部存储或配置存储。

结论

在本文中,您在Kubernetes上配置了自己的Rook Ceph集群,并使用它为MongoDB应用提供存储空间,您提取了有用的术语,并熟悉Rook的基本概念,以便您可以定制部署。

如果您有兴趣了解更多信息,请考虑查看官方 Rook 文档和库中提供的示例配置,以获取更多配置选项和参数。

您还可以尝试 Ceph 提供的其他类型的存储,例如 共享文件系统,如果您想同时将相同的音量安装到多个 pods。

Published At
Categories with 技术
comments powered by Disqus