mkdocs uses a markdown renderer that is hardcoded to 4 spaces per tab
for detecting indentation levels, including ordered- and
unordered-lists. Since we cannot easily change the renderer, begin using
a markdown linter in CI that will fail if official docs do not adhere to
the spacing rules.
As a starting point, the markdownlint config does not begin with the
default set of checks, which might overwhelm attempts to fix them.
Instead, focus on list-tab-spacing rules and a few other highly useful
checks.
markdownlint also has some gaps in its abilities that allow common Rook
doc issues to pass acceptance. However, it allows creating custom
linting plugins. Create 2 such linting plugins to check 2 things:
- all doc lines (except code blocks) must be aligned to a 4-space
boundary, without exception. This ensures that markdown will render
correctly with mkdocs. This unfortunately makes it possible to create
lists that are internally aligned strangely.
- admonitions must all follow the same format of
```
!!! header
body
```
For the strange lists, this is allowed and renders correctly, but it
looks strange:
```md
- first bullet
- second bullet
still second bullet
- third bullet
has a paragraph
of text inside
- last bullet
Signed-off-by: Blaine Gardner <blaine.gardner@ibm.com>
(cherry picked from commit c9d99e01a0)
60 lines
2.1 KiB
Markdown
60 lines
2.1 KiB
Markdown
---
|
|
title: Stretch Storage Cluster
|
|
---
|
|
|
|
For environments that only have two failure domains available where data can be replicated, consider
|
|
the case where one failure domain is down and the data is still fully available in the
|
|
remaining failure domain. To support this scenario, Ceph has integrated support for "stretch" clusters.
|
|
|
|
Rook requires three zones. Two zones (A and B) will each run all types of Rook pods, which we call the "data" zones.
|
|
Two mons run in each of the two data zones, while two replicas of the data are in each zone for a total of four data replicas.
|
|
The third zone (arbiter) runs a single mon. No other Rook or Ceph daemons need to be run in the arbiter zone.
|
|
|
|
For this example, we assume the desired failure domain is a zone. Another failure domain can also be specified with a
|
|
known [topology node label](../../CRDs/Cluster/ceph-cluster-crd.md#osd-topology) which is already being used for OSD failure domains.
|
|
|
|
```yaml
|
|
apiVersion: ceph.rook.io/v1
|
|
kind: CephCluster
|
|
metadata:
|
|
name: rook-ceph
|
|
namespace: rook-ceph
|
|
spec:
|
|
dataDirHostPath: /var/lib/rook
|
|
mon:
|
|
# Five mons must be created for stretch mode
|
|
count: 5
|
|
allowMultiplePerNode: false
|
|
stretchCluster:
|
|
failureDomainLabel: topology.kubernetes.io/zone
|
|
subFailureDomain: host
|
|
zones:
|
|
- name: a
|
|
arbiter: true
|
|
- name: b
|
|
- name: c
|
|
cephVersion:
|
|
image: quay.io/ceph/ceph:v18.2.2
|
|
allowUnsupported: true
|
|
# Either storageClassDeviceSets or the storage section can be specified for creating OSDs.
|
|
# This example uses all devices for simplicity.
|
|
storage:
|
|
useAllNodes: true
|
|
useAllDevices: true
|
|
deviceFilter: ""
|
|
# OSD placement is expected to include the non-arbiter zones
|
|
placement:
|
|
osd:
|
|
nodeAffinity:
|
|
requiredDuringSchedulingIgnoredDuringExecution:
|
|
nodeSelectorTerms:
|
|
- matchExpressions:
|
|
- key: topology.kubernetes.io/zone
|
|
operator: In
|
|
values:
|
|
- b
|
|
- c
|
|
```
|
|
|
|
For more details, see the [Stretch Cluster design doc](https://github.com/rook/rook/blob/master/design/ceph/ceph-stretch-cluster.md).
|