Connect to and manage a shared Ceph cluster¶
TechPreview Available since 2.22.0
Caution
For MOSK-based deployments, the feature is not supported yet.
A shared Ceph cluster allows connecting of a consumer
cluster to a producer cluster. The consumer cluster uses the Ceph
cluster deployed on the producer to store the necessary data. In other words,
the producer cluster contains the Ceph cluster with mon
, mgr
, osd
,
and mds
daemons. And the consumer cluster contains clients that require
access to the Ceph storage.
For example, an NGINX application that runs in a cluster without storage requires a persistent volume to store data. In this case, such a cluster can connect to a Ceph cluster and use it as a block or file storage.
Limitations
Connection to a shared Ceph cluster is possible only through the
client.admin
user.The producer and consumer clusters must be located in the same region and management cluster.
The
LCM
network of the producer cluster must be available in the consumer cluster.
Connect the producer to the consumer¶
Enable the
ceph-controller
Helm release in the consumer managed cluster:Open the
Cluster
object for editing:kubectl -n <consumerClusterProjectName> edit cluster <consumerClusterName>
In the
spec
section, add theceph-controller
Helm release:spec: providerSpec: value: helmReleases: - name: ceph-controller values: {}
Obtain
namespace/name
of the consumer managed cluster:kubectl -n <consumerClusterProjectName> get cluster -o jsonpath='{range .items[*]}{@.metadata.namespace}{"/"}{@.metadata.name}{"\n"}{end}'
Example output:
managed-ns/managed-cluster
Connect to the producer cluster and generate
connectionString
in theceph-controller
Pod:kubectl -n ceph-lcm-mirantis exec -it $(kubectl -n ceph-lcm-mirantis get pod -l "app=ceph-controller" -o name | head -1) -c ceph-controller -- ceph-cluster-connector --cluster-id <clusterNamespacedName>
Substitute
<clusterNamespacedName>
with the corresponding value from the previous step.Example of a positive system response:
I1221 14:20:29.921024 139 main.go:17] Connector code version: 1.0.0-mcc-dev-ebcd6677 I1221 14:20:29.921085 139 main.go:18] Go Version: go1.18.8 I1221 14:20:29.921097 139 main.go:19] Go OS/Arch: linux/amd64 I1221 14:20:30.801832 139 connector.go:71] Your connection string is: d0e64654d0551e7c3a940b8f460838261248193365a7115e54a3424aa2ad122e9a85bd12ec453ca5a092c37f6238e81142cf839fd15a4cd6aafa1238358cb50133d21b1656641541bd6c3bbcad220e8a959512ef11461d14fb11fd0c6110a54ed7e9a5f61eb677771cd5c8e6a6275eb7185e0b3e49e934c0ee08c6c2f37a669fc1754570cfdf893d0918fa91d802c2d36045dfc898803e423639994c2f21b03880202dfb9ed6e784f058ccf172d1bee78d7b20674652132886a80b0a8c806e23d9f69e9d0c7473d8caf24aaf014625727cbe08146e744bf0cf8f37825521d038
Create the consumer
KaaSCephCluster
object file, for example,consumer-kcc.yaml
with the following content:apiVersion: kaas.mirantis.com/v1alpha1 kind: KaaSCephCluster metadata: name: <consumerClusterProjectName> namespace: <clusterName> spec: cephClusterSpec: external: enable: true connectionString: <generatedConnectionString> network: clusterNet: <clusterNetCIDR> publicNet: <publicNetCIDR> nodes: {} k8sCluster: name: <clusterName> namespace: <consumerClusterProjectName>
Specify the following values:
<consumerClusterProjectName>
is the project name of the consumer managed cluster on the management cluster.<clusterName>
is the consumer managed cluster name.<generatedConnectionString>
is the connection string generated in the previous step.<clusterNetCIDR>
and<publicNetCIDR>
are values that must match the same values in the producerKaaSCephCluster
object.
Note
The
spec.cephClusterSpec.network
andspec.cephClusterSpec.nodes
parameters are mandatory.The
connectionString
parameter is specified in thespec.cephClusterSpec.external
section of theKaaSCephCluster
CR. The parameter contains an encrypted string with all the configurations needed to connect the consumer cluster to the shared Ceph cluster.Apply
consumer-kcc.yaml
on the management cluster:kubectl apply -f consumer-kcc.yaml
Once the Ceph cluster is specified in the KaaSCephCluster
CR of the
consumer cluster, Ceph Controller validates it and requests Rook to connect
the consumer and producer.
Consume pools from the Ceph cluster¶
Open the
KaasCephCluster
CR of the consumer cluster for editing:kubectl -n <managedClusterProjectName> edit kaascephcluster
Substitute
<managedClusterProjectName>
with the corresponding value.In the
spec.cephClusterSpec.pools
, specify pools from the producer cluster to be used by the consumer cluster. For example:Caution
Each
name
in thepools
section must match the corresponding full poolname
of the producer cluster. You can find full poolnames
in theKaaSCephCluster
CR by the following path:status.fullClusterInfo.blockStorageStatus.poolsStatus
.spec: cephClusterSpec: pools: - default: true deviceClass: ssd useAsFullName: true name: kubernetes-ssd role: kubernetes-ssd - default: false deviceClass: hdd useAsFullName: true name: volumes-hdd role: volumes
After specifying pools in the consumer KaaSCephCluster
CR, Ceph Controller
creates a corresponding StorageClass
for each specified pool, which can be
used for creating ReadWriteOnce
persistent volumes (PVs) in the consumer
cluster.
Enable CephFS on a consumer Ceph cluster¶
In the sharedFilesystem
section of the consumer cluster, specify
the dataPools
to share.
Note
Sharing CephFS
also requires specifying the metadataPool
and
metadataServer
sections similarly to the corresponding sections of the
producer cluster. For details, see CephFS specification.
For example:
spec:
cephClusterSpec:
sharedFilesystem:
cephFS:
- name: cephfs-store
dataPools:
- name: cephfs-pool-1
replicated:
size: 3
failureDomain: host
metadataPool:
replicated:
size: 3
failureDomain: host
metadataServer:
activeCount: 1
activeStandby: false
After specifying CephFS in the KaaSCephCluster
CR of the consumer
cluster, Ceph Controller creates a corresponding StorageClass
that allows
creating ReadWriteMany
(RWX) PVs in the consumer cluster.