diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 6a46e52499..eabbe13fea 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -4,6 +4,10 @@ on: push: branches: - master + schedule: + # rebuild once a day at 04:17 UTC to refresh the live stats (scripts/fetch-stats.py) + - cron: "17 4 * * *" + workflow_dispatch: defaults: run: @@ -13,6 +17,10 @@ defaults: permissions: contents: read +concurrency: + group: publish-website + cancel-in-progress: false + jobs: build-and-publish-website: # Depending on default permission settings for your org (contents being read-only or read-write for workloads), you will have to add permissions @@ -31,6 +39,12 @@ jobs: git config user.name "$GITHUB_ACTOR" git config user.email "$GITHUB_ACTOR@users.noreply.github.com" + - name: Fetch live stats + run: | + python3 scripts/fetch-stats.py + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Build and publish website run: | make publish diff --git a/.gitignore b/.gitignore index 8d64d7f0ac..0015113d2d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ .bundle .jekyll-metadata .sass-cache +/_data/live_stats.json diff --git a/404.html b/404.html index 0583272d70..1943245e11 100644 --- a/404.html +++ b/404.html @@ -1,18 +1,20 @@ --- layout: default +title: "Page not found" permalink: /404.html -stylesheet: error-code --- -
-
-
-

Oops

-

Something went wrong.

-

Error code: 404
We can't seem to find the page you're looking for. Please check the URL to make sure the path is correct.

- Retreat to Home -
-
- -
+{% include values.inc %} +
+
+
+
+

Page not found

+

Check the URL, or start from the home page or the docs.

+ +
+
+ {% include themed-img.html src="/images/404.svg" dark="/images/dark/404.svg" alt="" %} +
-
\ No newline at end of file +
+ diff --git a/500.html b/500.html index 75d19c4f65..0a50fab9ab 100644 --- a/500.html +++ b/500.html @@ -1,18 +1,20 @@ --- layout: default +title: "Whoops" permalink: /500.html -stylesheet: error-code --- -
-
-
-

Whoops

-

Something went wrong.

-

Error code: 500 Internal Server Error
We're working towards building something better. Try again soon.

- Retreat to Home -
-
- -
+
+
+
+
+

Whoops

+

Something went wrong.

+

Error code: 500 Internal Server Error
Something went wrong on our side. Try again in a minute.

+ +
+
+ {% include themed-img.html src="/images/500.svg" dark="/images/dark/500.svg" alt="" %} +
-
\ No newline at end of file +
+ diff --git a/Gemfile.lock b/Gemfile.lock index 9507aa2d7c..e2f6967f2b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -265,4 +265,4 @@ DEPENDENCIES webrick (~> 1.8) BUNDLED WITH - 2.3.25 + 2.3.27 diff --git a/Makefile b/Makefile index de0b264980..9b26ba8fde 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,13 @@ .PHONY: help run build publish # https://pages.github.com/versions/ -JEKYLL_DOCKER_IMAGE ?= docker.io/jekyll/jekyll:4.2.2 +JEKYLL_DOCKER_IMAGE ?= docker.io/library/ruby:3.1 + +# Gems go to vendor/bundle (gitignored, excluded from the site). Runs as the calling user so files stay theirs. +JEKYLL_DOCKER_RUN = docker run --rm -i \ + --user "$(shell id -u):$(shell id -g)" -e HOME=/tmp \ + -e BUNDLE_PATH=/srv/jekyll/vendor/bundle -e PAGES_REPO_NWO=rook/rook.github.io \ + --volume="$(PWD):/srv/jekyll" --workdir /srv/jekyll CURRENT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD) @@ -14,21 +20,14 @@ help: ## Show this help menu. run: ## run jekyll in development mode run: - docker run --rm -i \ - -p 4000:4000 -p 4001:4001 \ - --volume="$(PWD)/vendor/bundle:/usr/local/bundle" \ - --volume="$(PWD):/srv/jekyll" \ - $(JEKYLL_DOCKER_IMAGE) -- \ - jekyll serve --livereload --livereload-port 4001 + $(JEKYLL_DOCKER_RUN) -p 4000:4000 -p 4001:4001 $(JEKYLL_DOCKER_IMAGE) \ + bash -c 'bundle install && bundle exec jekyll serve --host 0.0.0.0 --livereload --livereload-port 4001' build: ## build output is in _site build: mkdir -p _site/ - docker run --rm -i \ - --volume="$(PWD)/vendor/bundle:/usr/local/bundle" \ - --volume="$(PWD):/srv/jekyll" \ - $(JEKYLL_DOCKER_IMAGE) -- \ - jekyll build + $(JEKYLL_DOCKER_RUN) $(JEKYLL_DOCKER_IMAGE) \ + bash -c 'bundle install && bundle exec jekyll build' # Correct permissions when running in CI if test "$$CI" = "true"; then sudo chown -R "$(shell id -u):$(shell id -g)" _site/; fi # Copy the "no jekyll build" file so Github pages does not build the gh-pages branch @@ -37,11 +36,8 @@ build: bundle_update: ## Update Gemfile.lock (via bundler) bundle_update: - docker run --rm -i \ - --volume="$(PWD)/vendor/bundle:/usr/local/bundle" \ - --volume="$(PWD):/srv/jekyll" \ - jekyll/jekyll -- \ - bundle update + $(JEKYLL_DOCKER_RUN) $(JEKYLL_DOCKER_IMAGE) \ + bash -c 'bundle update' publish: ## push changed files to the live site through the gh-pages branch publish: build diff --git a/_config.yml b/_config.yml index 719c438512..f198703067 100644 --- a/_config.yml +++ b/_config.yml @@ -20,6 +20,7 @@ exclude: - Gemfile.lock - Makefile - README.md + - scripts - vendor defaults: diff --git a/_data/contributors.yml b/_data/contributors.yml new file mode 100644 index 0000000000..0613dbb603 --- /dev/null +++ b/_data/contributors.yml @@ -0,0 +1,75 @@ +# Display order. Avatars are local files in images/contributors/.jpg. +- travisn +- leseb +- BlaineEXE +- subhamkrai +- jbw976 +- bassam +- galexrt +- jhoblitt +- Madhu-1 +- parth-gr +- satoru-takeuchi +- sp98 +- obnoxxx +- thotz +- Rakshith-R +- OdedViner +- rkachach +- arttor +- dangula +- kokhang +- rohan47 +- dotnwat +- aruniiird +- umangachapagain +- rohantmp +- phlogistonjohn +- iPraveenParihar +- humblec +- jmolmo +- alimaredia +- sebastianriese +- anmolsachan +- anxkhn +- nixpanic +- avanthakkar +- y1r +- ahmadnurus +- jtlayton +- nizamial09 +- jshen28 +- taraasrita10 +- arm64b +- varshar16 +- binoue +- ideepika +- davidvossel +- degorenko +- Javlopez +- microyahoo +- ashishranjan738 +- sebastian-philipp +- synarete +- yati1998 +- invidian +- TomHellier +- consideRatio +- Sheetalpamecha +- mvollman +- thephred +- AnikaYadav1 +- iamniting +- patrostkowski +- giovanism +- anthonyeleven +- NymanRobin +- takirala +- sathieu +- mazarmi +- zhucan +- samkulkarni20 +- black-dragon74 +- elias-dbx +- DoubleDensity +- raaizik diff --git a/_data/faq.yml b/_data/faq.yml new file mode 100644 index 0000000000..0b497dc802 --- /dev/null +++ b/_data/faq.yml @@ -0,0 +1,118 @@ +# FAQ. `home: true` items show on the homepage, in this order; /faq/ shows all. +# group: evaluating | running (the two /faq/ sections). home_q / home_a override the question and answer +# on the homepage only; /faq/ keeps the full text. +- id: production-ready + group: evaluating + q: "Is Rook production-ready? Who runs it?" + a: "Yes. The Rook Ceph operator was declared stable in 2018, and Rook is a CNCF graduated project. Organizations run it in production at petabyte scale." + links: + - { label: "Who runs Rook", url: "https://github.com/rook/rook/blob/master/ADOPTERS.md" } + - { label: "Rook docs", url: "https://rook.io/docs/rook/latest-release/" } +- id: operator-down + home: true + group: evaluating + q: "What happens to my data if the Rook operator goes down?" + a: "Your data keeps flowing. Rook is not in the Ceph data path: applications read and write directly to Ceph. Management tasks such as upgrades and configuration changes resume when the operator is back." + links: + - { label: "Storage architecture", url: "https://rook.io/docs/rook/latest-release/Getting-Started/storage-architecture/" } +- id: rook-or-cephadm + home: true + group: evaluating + q: "Rook or cephadm?" + a: "Both are installers recommended by the Ceph documentation. Choose Rook if you run Kubernetes and want storage managed through its APIs. Choose cephadm for Ceph clusters outside Kubernetes." + links: + - { label: "Ceph docs: Installing Ceph", url: "https://docs.ceph.com/en/latest/install/" } +- id: fork + home: true + group: evaluating + q: "Is Rook a fork of Ceph? Does it slow Ceph down?" + a: "No. Rook runs the official upstream Ceph images, and the usual `ceph` tools and the Ceph Dashboard work as before. For the best performance, give Ceph its own networks." + links: + - { label: "Network providers", url: "https://rook.io/docs/rook/latest-release/CRDs/Cluster/network-providers/" } + - { label: "Ceph Dashboard", url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Monitoring/ceph-dashboard/" } +- id: requirements + home: true + group: evaluating + q: "What do I need?" + a: "A Kubernetes cluster on amd64 or arm64 nodes, with local disks or block volumes for Ceph. One VM is enough to try Rook; production starts at three nodes." + links: + - { label: "Prerequisites", url: "https://rook.io/docs/rook/latest-release/Getting-Started/Prerequisites/prerequisites/" } +- id: upgrades + home: true + group: evaluating + q: "How do upgrades work, and how often is Rook released?" + home_q: "How often is Rook released?" + home_a: "A new minor release ships about every four months, and the two most recent are maintained." + a: "Change the Ceph version in your spec and Rook rolls the upgrade out across the daemons, checking Ceph's health as it goes. A new minor release ships about every four months, and the two most recent are maintained." + links: + - { label: "Upgrade guide", url: "https://rook.io/docs/rook/latest-release/Upgrade/ceph-upgrade/" } + - { label: "Supported versions", url: "https://rook.io/docs/rook/latest-release/Getting-Started/maintenance-and-support/" } +- id: security + home: true + group: evaluating + q: "Is it secure?" + a: "Rook can encrypt data at rest and in transit, integrates with external key managers such as HashiCorp Vault, and has a private vulnerability disclosure process through the CNCF. It was audited by Trail of Bits in 2019." + home_a: "Rook has a private vulnerability disclosure process through the CNCF, and an independent firm audited it in 2019." + links: + - { label: "Security policy", url: "https://github.com/rook/rook/blob/master/SECURITY.md" } + - { label: "Encryption docs", url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Advanced/key-management-system/" } +- id: support + home: true + group: evaluating + q: "Can I get commercial support?" + a: "Yes. The companies on our support page offer Rook support and services, and several commercial storage products are built on Rook." + links: + - { label: "Support providers", url: "/support" } +- id: control-plane + group: running + q: "What if the Kubernetes control plane goes down?" + a: "Running Ceph daemons and mounted volumes keep serving data. New pods, volumes and mounts wait until the control plane is back, so plan its availability like any other dependency of your storage." + links: + - { label: "Storage architecture", url: "https://rook.io/docs/rook/latest-release/Getting-Started/storage-architecture/" } +- id: lose-cluster + group: running + q: "What if I lose the whole Kubernetes cluster?" + a: "Your data is on the Ceph disks, not in Kubernetes. The disaster recovery guide shows how to bring an existing Rook Ceph cluster up in a new Kubernetes cluster." + links: + - { label: "Disaster recovery guide", url: "https://rook.io/docs/rook/latest-release/Troubleshooting/disaster-recovery/" } +- id: existing-cluster + group: running + q: "Can I use an existing Ceph cluster?" + a: "Yes. In external mode, Rook connects your Kubernetes workloads to a Ceph cluster you already run, for example one managed by cephadm." + links: + - { label: "External cluster", url: "https://rook.io/docs/rook/latest-release/CRDs/Cluster/external-cluster/external-cluster/" } +- id: cloud-airgapped + group: running + q: "Can I run it in the cloud or air-gapped?" + a: "Yes. In the cloud, Rook builds Ceph on block volumes from your provider's storage class. For air-gapped sites, mirror the images to your own registry." + links: + - { label: "PVC-based clusters", url: "https://rook.io/docs/rook/latest-release/CRDs/Cluster/pvc-cluster/" } + - { label: "Private registries", url: "https://rook.io/docs/rook/latest-release/Getting-Started/Prerequisites/authenticated-registry/" } +- id: maintainers + group: running + q: "Who maintains Rook? Is it controlled by one vendor?" + a: "Maintainers come from several companies and research organizations, and more than 580 organizations have contributed. Governance rules bar any single company from holding a majority on the steering committee." + links: + - { label: "Maintainers", url: "https://github.com/rook/rook/blob/master/OWNERS.md" } + - { label: "Governance", url: "https://github.com/rook/rook/blob/master/GOVERNANCE.md" } +- id: only-s3 + group: running + q: "Can I use Rook only for S3, or only for block volumes?" + a: "Yes. Each storage type is a separate resource, so you deploy only what you need: an object store, block pools, a filesystem, or any mix." + links: + - { label: "Object storage", url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Object-Storage-RGW/object-storage/" } + - { label: "Block storage", url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Block-Storage-RBD/block-storage/" } +- id: license + group: running + q: "What is the license?" + a: "Rook is Apache 2.0. Ceph is LGPL (2.1 or 3.0)." + links: + - { label: "Rook license", url: "https://github.com/rook/rook/blob/master/LICENSE" } + - { label: "Ceph license", url: "https://github.com/ceph/ceph/blob/main/COPYING" } +- id: help + group: running + q: "Where do I get help?" + a: "Ask in the Rook Slack or GitHub Discussions, and join the monthly community meeting." + links: + - { label: "Slack", url: "https://slack.rook.io" } + - { label: "Community meeting", url: "https://github.com/rook/rook#community-meeting" } diff --git a/_data/guides.yml b/_data/guides.yml new file mode 100644 index 0000000000..11641003d9 --- /dev/null +++ b/_data/guides.yml @@ -0,0 +1,36 @@ +- title: "Self-service S3 for your teams" + text: "Teams claim buckets and get credentials as a Secret." + url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Object-Storage-RGW/ceph-object-bucket-claim/" + icon: object +- title: "Shared filesystem for many pods" + text: "RWX volumes from CephFS." + url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Shared-Filesystem-CephFS/filesystem-storage/" + icon: filesystem +- title: "Increase usable capacity with erasure coding" + text: "Same protection as three copies, twice the usable capacity." + url: "https://rook.io/docs/rook/latest-release/CRDs/Block-Storage/ceph-block-pool-crd/#erasure-coding" + icon: disk +- title: "Encrypt with keys in your KMS" + text: "Vault, KMIP and cloud key services." + url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Advanced/key-management-system/" + icon: key +- title: "Monitor with Grafana and the Ceph Dashboard" + text: "Prometheus metrics, alerts and dashboards." + url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Monitoring/ceph-monitoring/" + icon: monitor +- title: "Use the Ceph CSI drivers" + text: "Static, ephemeral and expandable volumes, with RBD QoS." + url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Ceph-CSI/ceph-csi-drivers/" + icon: csi +- title: "Replace a failed disk" + text: "Keep the OSD ID, so Ceph refills only that disk." + url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Advanced/ceph-osd-mgmt/#replace-an-osd" + icon: disk +- title: "Run on cloud block volumes" + text: "OSDs on your provider's storage class." + url: "https://rook.io/docs/rook/latest-release/CRDs/Cluster/pvc-cluster/" + icon: disk +- title: "Metadata on NVMe, data on HDD" + text: "Speed up HDD clusters with a fast metadata device." + url: "https://rook.io/docs/rook/latest-release/CRDs/Cluster/host-cluster/" + icon: disk diff --git a/_data/stats.yml b/_data/stats.yml new file mode 100644 index 0000000000..78362a7499 --- /dev/null +++ b/_data/stats.yml @@ -0,0 +1,29 @@ +# Homepage stats strip, release ribbon and contributor label: the committed fallbacks. When scripts/fetch-stats.py +# has written _data/live_stats.json (CI runs it before every build, plus a daily scheduled build), its labels win: +# the same top-level keys, and for a cell the key named by `live`. Refresh these now and then so builds without the +# live file stay close. The contributors and organizations figures are static (CNCF devstats). +latest_minor: "1.21" +release_url: "https://github.com/rook/rook/releases/tag/v1.21.0" +organizations: "580+" +cells: + - image: "/images/brand/cncf-graduated-color.svg" + image_dark: "/images/brand/cncf-graduated-white.svg" + alt: "CNCF Graduated project" + label: "since 2020" + url: "https://www.cncf.io/announcements/2020/10/07/cloud-native-computing-foundation-announces-rook-graduation/" + - number: "240+" + live: releases + label: "releases since 2016" + url: "https://github.com/rook/rook/releases" + # "Contributors" row (Last decade, bots excluded): https://rook.devstats.cncf.io/d/18/overall-project-statistics-table?orgId=1 + - number: "3,800+" + label: "contributors" + url: "https://rook.devstats.cncf.io" + - number: "330M+" + live: pulls + label: "image pulls" + url: "https://hub.docker.com/r/rook/ceph" + - number: "13.7k" + live: stars + label: "GitHub stars" + url: "https://github.com/rook/rook" diff --git a/_data/storage_interfaces.yml b/_data/storage_interfaces.yml new file mode 100644 index 0000000000..cbbd866128 --- /dev/null +++ b/_data/storage_interfaces.yml @@ -0,0 +1,35 @@ +# client_html: the same text with [tux] markers for the small Tux logo (images/brand/tux.svg, by Larry Ewing and The GIMP). +# Columns: interface (name, Ceph component, optional one-line description) | Kubernetes | outside Kubernetes | docs links. +- id: object + name: S3 object storage + tech: RGW + desc: "S3 compatible: versioning, lifecycle, replication, notifications, IAM." + k8s: "Buckets and credentials through an ObjectBucketClaim, or COSI" + client: "Any S3-compatible client or SDK" + docs: + - { label: "Object storage docs", url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Object-Storage-RGW/object-storage/" } +- id: block + name: Block + tech: RBD + desc: "Durable volumes for databases and VMs." + k8s: "RWO volumes through a PVC, via Ceph CSI" + client: "Linux kernel client or librbd (for example QEMU/KVM); NVMe-oF for other hosts" + client_html: "[tux]Linux kernel client or librbd (for example QEMU/KVM); NVMe-oF for other hosts" + docs: + - { label: "Block docs", url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Block-Storage-RBD/block-storage/" } + - { label: "NVMe-oF docs", url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Block-Storage-RBD/nvme-of/" } +- id: filesystem + name: Shared filesystem + tech: CephFS + desc: "POSIX filesystem shared by many readers and writers." + k8s: "RWX volumes that many pods mount at once, via Ceph CSI" + client: "Mount as a POSIX filesystem from any Linux client" + client_html: "Mount as a POSIX filesystem from any [tux]Linux client" + docs: + - { label: "Filesystem docs", url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/Shared-Filesystem-CephFS/filesystem-storage/" } +- id: nfs + name: NFS + k8s: "PVCs through the NFS CSI driver" + client: "Any NFS client" + docs: + - { label: "NFS docs", url: "https://rook.io/docs/rook/latest-release/Storage-Configuration/NFS/nfs/" } diff --git a/_includes/community.html b/_includes/community.html new file mode 100644 index 0000000000..f3bb31e193 --- /dev/null +++ b/_includes/community.html @@ -0,0 +1,22 @@ +
+
+
{% include icon.html name="slack" %}

Slack

+

Ask questions and share configs with maintainers and other users.

+ slack.rook.io{% include icon.html name="arrow" %} +
+
+
{% include icon.html name="calendar" %}

Community meeting

+

Second Tuesday of every month, 9:00 AM Pacific. Agenda and recordings are public.

+ Meeting calendar{% include icon.html name="arrow" %} +
+
+
{% include icon.html name="pr" %}

Contribute

+

Start with a good first issue.

+ Find a first issue{% include icon.html name="arrow" %} +
+
+
{% include icon.html name="github" %}

GitHub

+

Discussions, releases and source.

+ github.com/rook/rook{% include icon.html name="arrow" %} +
+
diff --git a/_includes/contributors-wall.html b/_includes/contributors-wall.html new file mode 100644 index 0000000000..dcc8ae5ca1 --- /dev/null +++ b/_includes/contributors-wall.html @@ -0,0 +1,18 @@ +{%- comment -%} Live list from _data/live_stats.json when present, else _data/contributors.yml with local avatars. Params: limit. {%- endcomment -%} +
+
+

Contributors from {{ site.data.stats.organizations }} organizations

+ See who runs Rook in production{% include icon.html name="arrow" %} +
+
+ {%- if site.data.live_stats.contributors.size > 0 %} + {%- for p in site.data.live_stats.contributors limit: include.limit %} + {{ p.login }} + {%- endfor %} + {%- else %} + {%- for login in site.data.contributors limit: include.limit %} + {{ login }} + {%- endfor %} + {%- endif %} +
+
diff --git a/_includes/dr-sites.html b/_includes/dr-sites.html new file mode 100644 index 0000000000..65da619f90 --- /dev/null +++ b/_includes/dr-sites.html @@ -0,0 +1,3 @@ +{%- comment -%} Generated SVG. css/site.scss recolours fills and strokes for the dark theme by attribute value, so keep the colour values in sync. {%- endcomment -%} +Asynchronous replication to a peer cluster in another siteA primary site runs Ceph cluster A and a peer site runs Ceph cluster B, each with three nodes running OSDs and a monitor. Replication between the sites is asynchronous: block volumes with RBD mirroring, filesystems with CephFS mirroring, and object storage with RGW multisite, which replicates in both directions.PRIMARY SITECeph cluster Anode-1OSD ×3MONnode-2OSD ×3MONnode-3OSD ×3MONPEER SITECeph cluster Bnode-1OSD ×3MONnode-2OSD ×3MONnode-3OSD ×3MONasynchronous replicationRBD mirroringCephFS mirroringRGW multisite +Asynchronous replication to a peer cluster in another siteA primary site runs Ceph cluster A and a peer site runs Ceph cluster B, each with three nodes running OSDs and a monitor. Replication between the sites is asynchronous: block volumes with RBD mirroring, filesystems with CephFS mirroring, and object storage with RGW multisite, which replicates in both directions.PRIMARY SITECeph cluster Anode-1OSD ×3MONnode-2OSD ×3MONnode-3OSD ×3MONPEER SITECeph cluster Bnode-1OSD ×3MONnode-2OSD ×3MONnode-3OSD ×3MONRBD mirroringCephFS mirroringRGW multisiteasynchronous replication diff --git a/_includes/dr-zones.html b/_includes/dr-zones.html new file mode 100644 index 0000000000..f7b56e057e --- /dev/null +++ b/_includes/dr-zones.html @@ -0,0 +1,3 @@ +{%- comment -%} Generated SVG. css/site.scss recolours fills and strokes for the dark theme by attribute value, so keep the colour values in sync. {%- endcomment -%} +Stretch cluster across two zones and an arbiterOne Ceph cluster spans Zone A and Zone B, each with two nodes running OSDs and monitors. A small arbiter zone runs one monitor. Writes are replicated synchronously between the zones.ARBITER ZONEMONZONE AZONE BOne Ceph cluster (stretch mode)node-1OSD ×3MONnode-2OSD ×3MONnode-3OSD ×3MONnode-4OSD ×3MONsynchronous writes +Stretch cluster across two zones and an arbiterOne Ceph cluster spans Zone A and Zone B, each with two nodes running OSDs and monitors. A small arbiter zone runs one monitor. Writes are replicated synchronously between the zones.ARBITER ZONEMONOne Ceph cluster (stretch mode)ZONE AZONE Bnode-1OSD ×3MONnode-3OSD ×3MONnode-2OSD ×3MONnode-4OSD ×3MONsynchronous writes diff --git a/_includes/faq-list.html b/_includes/faq-list.html new file mode 100644 index 0000000000..01022d3182 --- /dev/null +++ b/_includes/faq-list.html @@ -0,0 +1,19 @@ +{%- comment -%} Params: items (from _data/faq.yml), open (count open by default), home (use home_q / home_a). {%- endcomment -%} +{%- assign openN = include.open | default: 0 -%} +
+ {%- for f in include.items %} + {%- assign q = f.q %}{% assign a = f.a %}{% assign links = f.links %} + {%- if include.home %}{% if f.home_q %}{% assign q = f.home_q %}{% endif %}{% if f.home_a %}{% assign a = f.home_a %}{% endif %}{% endif %} +
+ {{ q }}{% include icon.html name="chevron" %} +
+
{{ a | markdownify }}
+ +
+
+ {%- endfor %} +
diff --git a/_includes/footer.html b/_includes/footer.html index ae54892a79..f59e3e1122 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,85 +1,59 @@ -