Skip to content

Commit 3d76cde

Browse files
committed
feat(storage): s3 storage class
Signed-off-by: SkalaNetworks <contact@skala.network>
1 parent 36bc87c commit 3d76cde

40 files changed

Lines changed: 2834 additions & 29 deletions

File tree

docs/installation/deployment-guide/installing-an-az/installing-decoupled.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ See [Deployment topology](../../../architecture/deployment-topology.md) for the
2020

2121
1. Provision a **storage** cluster and one or more **workload** clusters.
2222
2. Register each with a `Cluster` resource (`deploymentTopology: Decoupled`, with `type: Storage` or `type: Virtualization`).
23-
3. [Add storage classes to the workload cluster](../../../operations/add-storage-pools-to-a-cluster.md#adding-a-storage-class).
23+
3. [Add storage classes to the workload cluster](../../../operations/add-storage-pools-to-a-cluster.md#adding-a-block-storage-class).
2424
4. Let the operator sync the Superphenix stack on each cluster.
2525

2626
## Installing a workload and storage cluster
@@ -84,4 +84,4 @@ helm upgrade superphenix-operator \
8484

8585
You can monitor the status of the `Cluster` CR to check how far along the installion is.
8686

87-
You'll then need to [add storage classes to the workload cluster](../../../operations/add-storage-pools-to-a-cluster.md#adding-a-storage-class).
87+
You'll then need to [add storage classes to the workload cluster](../../../operations/add-storage-pools-to-a-cluster.md#adding-a-block-storage-class).

docs/installation/deployment-guide/installing-the-os/automated-os-installation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ The operator reads `Cluster` (and related) resources in the `superphenix-system`
3939
2. Register physical servers (BMC credentials, MAC addresses, desired role) with the talos-operator.
4040
3. Define `Cluster` resources that describe topology, geography, and connection mode.
4141
4. Let the operator provision Talos on the servers, bootstrap Kubernetes, and install the Superphenix stack.
42-
5. Connect decoupled storage and workload clusters as needed. See [Add storage classes to a cluster](../../../operations/add-storage-pools-to-a-cluster.md#adding-a-storage-class).
42+
5. Connect decoupled storage and workload clusters as needed. See [Add storage classes to a cluster](../../../operations/add-storage-pools-to-a-cluster.md#adding-a-block-storage-class).
4343

4444
## Step 1: Install the operator
4545

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Add an object store
2+
3+
*Coming soon.*

docs/operations/add-storage-pools-to-a-cluster.md

Lines changed: 105 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ On each cluster, you define storage classes and expose them to users. The steps
99

1010
In both cases, every storage class is backed by a **storage pool**. The pool defines the physical media and data protection; one pool can serve several classes with different QoS or encryption settings. For example, an NVMe pool with 3-way replication could back two classes. One could be capped at 100 MB/s and another be configured with encryption, while the data lands on the same underlying pool.
1111

12-
The sections below cover creating **storage pools**, then exposing them through **storage classes**.
12+
The sections below cover creating **storage pools**, then exposing them through **storage classes**, whether for block storage, filesystem or object storage purposes.
1313

1414
## Adding a storage pool
1515

@@ -63,7 +63,7 @@ Add the pool under `systemConfiguration` on the `Cluster` resource (or via the `
6363
deviceClass: hdd
6464
# Where replicas are placed. "host" spreads data across servers so
6565
# you can lose a machine. "osd" spreads across disks and may place
66-
# all copies on one server—losing that server can mean permanent
66+
# all copies on one server. Losing that server can mean permanent
6767
# data loss. With size 3 and failureDomain "host", you can lose
6868
# two hosts and still recover.
6969
failureDomain: "host"
@@ -130,17 +130,19 @@ Add the pool under `systemConfiguration` on the `Cluster` resource (or via the `
130130

131131
For advanced pool options, see the [rook-ceph-cluster](https://artifacthub.io/packages/helm/rook/rook-ceph-cluster) Helm chart values.
132132

133-
## Adding a storage class
133+
## Adding a block storage class
134134

135-
A **storage class** is the user-facing catalog entry for storage. It points at a pool and adds policies such as QoS and encryption so tenants can pick the right offering when they create disks or buckets.
135+
This section covers adding a **storage class for block storage**. They're used by end users pick when they create disks and other block volumes.
136+
137+
A **block storage class** is the user-facing catalog entry for block storage. It points at a pool and adds policies such as QoS and encryption so tenants can pick the right offering when they create disks.
136138

137139
### Prerequisites
138140

139-
- At least one **storage pool** already exists on the cluster that hosts the storage. See [Adding a new storage pool](#adding-a-new-storage-pool).
141+
- At least one **storage pool** already exists on the cluster that hosts the storage. See [Adding a storage pool](#adding-a-storage-pool).
140142

141143
### Configuration
142144

143-
Add the storage class under `systemConfiguration` on the `Cluster` resource (or via the `superphenix-operator` Helm chart), using the **`rook-connection`** chart. Choose the example that matches your AZ layout.
145+
Add the block storage class under `systemConfiguration` on the `Cluster` resource (or via the `superphenix-operator` Helm chart), using the **`rook-connection`** chart. Choose the example that matches your AZ layout.
144146

145147
!!! info "Where to apply this configuration"
146148
Configure the storage class on the cluster that **consumes** the storage:
@@ -150,7 +152,7 @@ Add the storage class under `systemConfiguration` on the `Cluster` resource (or
150152

151153
=== "Hyperconverged"
152154

153-
On a hyperconverged cluster, storage and workloads share the same Kubernetes cluster. You only need to reference the local pool and define storage classes—no remote Ceph connection fields.
155+
On a hyperconverged cluster, storage and workloads share the same Superphenix cluster. You only need to reference the local pool and define storage classes. No remote Ceph connection fields are necessary.
154156

155157
```yaml
156158
systemConfiguration:
@@ -239,3 +241,99 @@ Add the storage class under `systemConfiguration` on the `Cluster` resource (or
239241
# Encryption passphrase, can be a random string of characters.
240242
passphrase: ""
241243
```
244+
245+
For advanced storage class and connection options, see the [spx-rook-connection](https://github.com/super-phenix/superphenix/tree/main/components/dependencies/spx-rook-connection) chart values.
246+
247+
## Adding an object storage class
248+
249+
This section covers adding a **storage class for object (S3) storage**. They're used by end users when they create buckets and consume S3-compatible storage.
250+
251+
An **object storage class** is the user-facing catalog entry for S3 object storage. It exposes an object store so tenants can create and use buckets with the media, protection, and policies you define.
252+
253+
### Prerequisites
254+
255+
- At least one **object store** already exists on the cluster that hosts the storage. See [Add an object store](add-an-object-store.md).
256+
257+
### Configuration
258+
259+
Add the object storage class under `systemConfiguration` on the `Cluster` resource (or via the `superphenix-operator` Helm chart), using the **`rook-connection`** chart. Choose the example that matches your AZ layout.
260+
261+
!!! info "Where to apply this configuration"
262+
Configure the storage class on the cluster that **consumes** the storage:
263+
264+
- **Hyperconverged**: the same cluster that hosts the object store.
265+
- **Decoupled**: the **workload** cluster. Remote connection fields point at the storage cluster.
266+
267+
=== "Hyperconverged"
268+
269+
On a hyperconverged cluster, storage and workloads share the same Superphenix cluster. You only need to reference the local object store and define the object storage class. No remote RGW endpoint or Ceph connection fields are necessary.
270+
271+
```yaml
272+
systemConfiguration:
273+
rook-connection:
274+
helm:
275+
values:
276+
clusters:
277+
- name: "[cluster-name]" # Can be the name of your hyperconverged cluster
278+
objectStores:
279+
- name: "[object-store-name]" # CephObjectStore CR name
280+
storageClasses:
281+
- name: "[storage-class-name]"
282+
# StorageClass name will be "<cluster>.<name>" unless fullName is set.
283+
# Name must be unique across every storage class in the cluster.
284+
# fullName: ""
285+
```
286+
287+
=== "Decoupled"
288+
289+
On a decoupled AZ, create the object storage class on the **workload** cluster and connect it to an object store on the **storage** cluster. That requires Ceph connection details, the remote RGW endpoints, and the object store storage class definitions.
290+
291+
```yaml
292+
systemConfiguration:
293+
rook-connection:
294+
helm:
295+
values:
296+
clusters:
297+
- name: "[storage-cluster-name]" # The name of the remote storage cluster
298+
# Ceph cluster ID (FSID), e.g. e2a62ea1-6428-496e-a5bf-366936a8c833
299+
clusterID: ""
300+
username: "[csi-user]"
301+
token: ""
302+
# Initial MON used to retrieve the full MON list
303+
bootstrapMon:
304+
# MON ID (must be a single letter)
305+
id: ""
306+
# IP of the MON
307+
ip: ""
308+
# Port of the MON
309+
port: "6789"
310+
# Protocol of the IP (IPv4 or IPv6)
311+
protocol: IPv6
312+
# Used by Rook to check remote cluster health and refresh the MON list
313+
healthCheck:
314+
username: "client.csi-health"
315+
token: ""
316+
objectStores:
317+
- name: "[object-store-name]" # CephObjectStore CR name (also used to derive the TLS secret name)
318+
# External RGW endpoints. Each entry accepts either `ip` or `hostname`.
319+
endpoints:
320+
- ip: ""
321+
# hostname: ""
322+
# Gateway HTTP port
323+
port: 80
324+
# Gateway HTTPS port (only set when TLS is enabled)
325+
# securePort: 443
326+
# TLS configuration for the remote RGW
327+
# tls:
328+
# enabled: false
329+
# # PEM-encoded certificate the operator will trust when talking to the RGW
330+
# cert: ""
331+
storageClasses:
332+
- name: "[storage-class-name]"
333+
# StorageClass name will be "<cluster>.<name>" unless fullName is set.
334+
# Name must be unique across every storage class in the cluster.
335+
# fullName: ""
336+
reclaimPolicy: Delete
337+
```
338+
339+
For advanced storage class and connection options, see the [spx-rook-connection](https://github.com/super-phenix/superphenix/tree/main/components/dependencies/spx-rook-connection) chart values.

site/404.html

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,6 +1387,33 @@
13871387

13881388

13891389

1390+
<li class="md-nav__item">
1391+
<a href="/operations/add-an-object-store/" class="md-nav__link">
1392+
1393+
1394+
1395+
<span class="md-ellipsis">
1396+
1397+
1398+
Add an object store
1399+
1400+
1401+
</span>
1402+
1403+
1404+
1405+
</a>
1406+
</li>
1407+
1408+
1409+
1410+
1411+
1412+
1413+
1414+
1415+
1416+
13901417
<li class="md-nav__item">
13911418
<a href="/operations/testing/" class="md-nav__link">
13921419

site/architecture/deployment-requirements/index.html

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,6 +1543,33 @@
15431543

15441544

15451545

1546+
<li class="md-nav__item">
1547+
<a href="../../operations/add-an-object-store/" class="md-nav__link">
1548+
1549+
1550+
1551+
<span class="md-ellipsis">
1552+
1553+
1554+
Add an object store
1555+
1556+
1557+
</span>
1558+
1559+
1560+
1561+
</a>
1562+
</li>
1563+
1564+
1565+
1566+
1567+
1568+
1569+
1570+
1571+
1572+
15461573
<li class="md-nav__item">
15471574
<a href="../../operations/testing/" class="md-nav__link">
15481575

site/architecture/deployment-topology/index.html

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,6 +1571,33 @@
15711571

15721572

15731573

1574+
<li class="md-nav__item">
1575+
<a href="../../operations/add-an-object-store/" class="md-nav__link">
1576+
1577+
1578+
1579+
<span class="md-ellipsis">
1580+
1581+
1582+
Add an object store
1583+
1584+
1585+
</span>
1586+
1587+
1588+
1589+
</a>
1590+
</li>
1591+
1592+
1593+
1594+
1595+
1596+
1597+
1598+
1599+
1600+
15741601
<li class="md-nav__item">
15751602
<a href="../../operations/testing/" class="md-nav__link">
15761603

site/architecture/index.html

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1509,6 +1509,33 @@
15091509

15101510

15111511

1512+
<li class="md-nav__item">
1513+
<a href="../operations/add-an-object-store/" class="md-nav__link">
1514+
1515+
1516+
1517+
<span class="md-ellipsis">
1518+
1519+
1520+
Add an object store
1521+
1522+
1523+
</span>
1524+
1525+
1526+
1527+
</a>
1528+
</li>
1529+
1530+
1531+
1532+
1533+
1534+
1535+
1536+
1537+
1538+
15121539
<li class="md-nav__item">
15131540
<a href="../operations/testing/" class="md-nav__link">
15141541

site/architecture/network-requirements/index.html

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,6 +1598,33 @@
15981598

15991599

16001600

1601+
<li class="md-nav__item">
1602+
<a href="../../operations/add-an-object-store/" class="md-nav__link">
1603+
1604+
1605+
1606+
<span class="md-ellipsis">
1607+
1608+
1609+
Add an object store
1610+
1611+
1612+
</span>
1613+
1614+
1615+
1616+
</a>
1617+
</li>
1618+
1619+
1620+
1621+
1622+
1623+
1624+
1625+
1626+
1627+
16011628
<li class="md-nav__item">
16021629
<a href="../../operations/testing/" class="md-nav__link">
16031630

site/contributing/index.html

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,6 +1394,33 @@
13941394

13951395

13961396

1397+
<li class="md-nav__item">
1398+
<a href="../operations/add-an-object-store/" class="md-nav__link">
1399+
1400+
1401+
1402+
<span class="md-ellipsis">
1403+
1404+
1405+
Add an object store
1406+
1407+
1408+
</span>
1409+
1410+
1411+
1412+
</a>
1413+
</li>
1414+
1415+
1416+
1417+
1418+
1419+
1420+
1421+
1422+
1423+
13971424
<li class="md-nav__item">
13981425
<a href="../operations/testing/" class="md-nav__link">
13991426

0 commit comments

Comments
 (0)