From d88c39c8bc7a2ca3fb25f508f041cd90298ddf28 Mon Sep 17 00:00:00 2001 From: Jared Watts Date: Tue, 21 Feb 2017 16:10:27 -0800 Subject: [PATCH] Refactor readme into individual platform guides. Incorporate @travisn design write-ups --- .gitignore | 2 +- Documentation/media/kubernetes.png | Bin 0 -> 101836 bytes .../media/{cluster.png => standalone.png} | Bin README.md | 302 ++---------------- demo/client/README.md | 115 +++++++ demo/kubernetes/README.md | 152 +++++++-- demo/kubernetes/pre-reqs.md | 41 +++ demo/standalone/README.md | 80 +++++ demo/{vagrant => standalone}/Vagrantfile | 0 .../cloud-config.yml.in | 0 demo/{vagrant => standalone}/util.rb | 0 11 files changed, 377 insertions(+), 315 deletions(-) create mode 100644 Documentation/media/kubernetes.png rename Documentation/media/{cluster.png => standalone.png} (100%) create mode 100644 demo/client/README.md create mode 100644 demo/kubernetes/pre-reqs.md create mode 100644 demo/standalone/README.md rename demo/{vagrant => standalone}/Vagrantfile (100%) rename demo/{vagrant => standalone}/cloud-config.yml.in (100%) rename demo/{vagrant => standalone}/util.rb (100%) diff --git a/.gitignore b/.gitignore index 1e829f088..d6ab0cf68 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ coverage.html debug.test .vagrant/ -demo/vagrant/cloud-config.yml +demo/standalone/cloud-config.yml .virtualbox/ diff --git a/Documentation/media/kubernetes.png b/Documentation/media/kubernetes.png new file mode 100644 index 0000000000000000000000000000000000000000..2c3a1666535fdeac3f5e355c820f1c8bdf40fa4b GIT binary patch literal 101836 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%0Db<^Vcx~d&*(-V1ZOxdjC_UqpqW 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

#j?DtkThtUHj34z1n5B z+C>AdFPHzxDVxS$V%&O>-Q-x{g8eMc%c5THdY0T4wl%Op#4d1QiNoTB&W|Q)IH+`< z+w`&_=*406MX~EcuCG2*uy^gQdlx&dYrnpJn@4)WzK(?A%YwVhQ+K5o+@CuAi`V7sulv4z z`M7Jbt!-0%LzTn)=`@dFv5&mXrW@`4~-L%JS)h)^Q_b0A- zDf;=;fiKhA7MIA~yV=LEyyrTjVE)FaV!bKhzk~iREaQ`9xu?L)>Z~f8u%-6x%DFH7 zGQZ#5A7^N^R&j6H{lw2-pTD~GSM9F+|Jt)JwzNIavb|m|{?@O&v+RDY|KxOs`Bzex zdb_NjuXFeEJM)+Se!P@EwzQP%=90PZtO6O-U%IcCpZ@KN`ZgJZ`Uu(F{GNlg{^s|0 z*5%xKefIu^ly}kBr+kz7o;sE1&;K1&TYejV`Fn4x@3TNwfkg*0EDPfI)uh}Cet&7R z-R8BHZ!O=QHg20XdW(fEmr+HP5<(|E5DwqE@q$2KPPzRw=1{B-vwPzi3)f$>*LaA(_V^ZuK#}j z(cLzO+4oD-_dDKRu&46Xg_7knZqK_Xd6TnlHk04_*;DGWr`A^{xu>YVvo+Sr>8;gb z33Q3k*QyENUZ*c-YVq`?E>}Wo@m~KkE6p~y@%vQTHd)?`d2cMv>o2`wb?^a|*{}aT zR^6&LSNTz?`>BPS<16l7oM#tTzGb=l2mSTdO;zU^A9?0aY8j@Nv1EWOko^SBm2 zYI2dhvwr%{5}%c|f~iLv4?T!kUf$6WI8oDBV9&h&Z?NRb2bvRjSv}@o$O)szh4LvmTr{#`wM;6Xp zU+#C7!B{WpSx?YopMrUtI(6L_b3V8z_`?0N>MEv12Rb-%TlJ+(Po!w*W$X@BvkESg zooc>A<7vv<LsDhS#1hjv+H&HuzMVT|XVtb;{=4vnpq!5APMG=A{+yJt!$QtNQN5 zJTr;i_p^5y8#p!y9%Mr z3)L^AhDPNDm~JS)^)&3{cim_AU89A=&$NI0{tau9|6-kp$Naum>-?X7#GzoJ$Opd| ze%Xls5!h-R+sRD#I$zIx{A&KG-~$+NL3_}H|IGX>C)Iw)oKbP0l+XkK DoiLKz literal 0 HcmV?d00001 diff --git a/Documentation/media/cluster.png b/Documentation/media/standalone.png similarity index 100% rename from Documentation/media/cluster.png rename to Documentation/media/standalone.png diff --git a/README.md b/README.md index 50abc03af..f839d05ad 100644 --- a/README.md +++ b/README.md @@ -6,27 +6,23 @@ - [What is Rook?](#what-is-rook) - [Status](#status) -- [Kubernetes](#kubernetes) -- [Rook Standalone Service](#rook-standalone-service) -- [Block, File and Object Storage](#block-file-and-object-storage) +- [Quickstart Guides](#quickstart-guides) - [Building](#building) -- [Design](#design) - [Contributing](#contributing) - [Contact](#contact) - [Licensing](#licensing) ## What is Rook? -Rook is a distributed storage system designed for cloud native applications. It aims to be the storage solution for container-native app developers. -Just like your container apps, Rook is designed to take advantage of the resource management and orchestration of the Kubernetes platform. -This allows Rook to share cluster resources with your apps, allowing it to dynamically scale as your apps scale and save the effort to manage storage infrastructure separately. -Rook provides persistent storage for your Kubernetes apps - which is one of the largest barriers for developers to fully containerize their apps. -Rook exposes file, block, and object storage on top of shared resource pools. Rook has minimal -dependencies and can be deployed in dedicated storage clusters or converged clusters. It's -self-managing, self-protecting, self-healing, and is designed to just work without teams of -engineers managing it. It scales from a single node, to multi-PB clusters spread geographically. -It's based on the [Ceph](http://ceph.com) project with over 10 years of production deployments in some of the -largest storage clusters in the world. +Rook is a distributed storage system designed for cloud native applications. It exposes file, block, and object storage on top of shared resource pools. +Rook has minimal dependencies and can be deployed in dedicated storage clusters or converged clusters. +It's self-managing, self-protecting, self-healing, and is designed to just work without teams of engineers managing it. +It scales from a single node, to multi-PB clusters spread geographically. + +It is based on the [Ceph](http://ceph.com) project that has over 10 years of production deployments in some of the largest storage clusters in the world. + +Rook integrates deeply into popular container environments like Kubernetes and leverages facilities for lifecycle management, resource management, scale-out and upgrades. +Rook also integrates into the Kubernetes API to expose a uniform surface area for management. ## Status @@ -35,283 +31,21 @@ and other user-facing objects are subject to change. Backward-compability is not release. See our [Roadmap](https://github.com/rook/rook/wiki/Roadmap) and [Issues](https://github.com/rook/rook/issues). Please help us by [Contributing](CONTRIBUTING.md) to the project. -## Quickstart +## Quickstart Guides -Here's the quickest way to get going with Rook. +There are a few different options for running a Rook cluster for your storage needs. Kubernetes is the recommended way because of the rich orchestration and scheduling that Kubernetes provides via the Rook operator. -### Kubernetes +1. [Kubernetes](/demo/kubernetes/README.md) (recommended) +2. [Standalone](/demo/standalone/README.md) -This example shows how to build a simple, multi-tier web application on Kubernetes using persistent volumes enabled by Rook. - -#### Prerequisites - -This example requires a running Kubernetes cluster. To make sure you have a Kubernetes cluster that is ready for `rook`, you can [follow these quick instructions](demo/kubernetes/README.md). - -Note that we are striving for even more smooth integration with Kubernetes in the future such that `rook` will work out of the box with any Kubernetes cluster. - -#### Deploy Rook - -With your Kubernetes cluster running, Rook can be setup and deployed by simply deploying the [rook-operator](demo/kubernetes/rook-operator.yaml) deployment manifest. -You will find this manifest and all our example manifest files in the [demo/kubernetes](demo/kubernetes) folder. - -``` -cd demo/kubernetes -kubectl create namespace rook -kubectl create -f rook-operator.yaml -``` - -Use `kubectl` to list pods in the rook namespace. You should be able to see the following: - -``` -$ kubectl -n rook get pod -NAME READY STATUS RESTARTS AGE -mon0 1/1 Running 0 1m -mon1 1/1 Running 0 1m -mon2 1/1 Running 0 1m -osd-n1sm3 1/1 Running 0 1m -osd-pb0sh 1/1 Running 0 1m -osd-rth3q 1/1 Running 0 1m -rgw-1785797224-9xb4r 1/1 Running 0 1m -rgw-1785797224-vbg8d 1/1 Running 0 1m -rook-api-4184191414-l0wmw 1/1 Running 0 1m -rook-operator-349747813-c3dmm 1/1 Running 0 1m -``` -**NOTE:** RGW (object storage gateway) is currently deployed by default but in the future will be done only when needed (see [#413](https://github.com/rook/rook/issues/413)) - -#### Provision Storage -Before Rook can start provisioning storage, a StorageClass needs to be created. This is used to specify information needed for Kubernetes to interoperate with Rook for provisioning persistent volumes. Rook already creates a default admin and demo user, whose secrets are already specified in the sample [rook-storageclass.yaml](demo/kubernetes/rook-storageclass.yaml). - -Now we just need to specify the Ceph monitor endpoints (requires `jq`): - -``` -export MONS=$(kubectl -n rook get pod mon0 mon1 mon2 -o json|jq ".items[].status.podIP"|tr -d "\""|sed -e 's/$/:6790/'|paste -s -d, -) -sed 's#INSERT_HERE#'$MONS'#' rook-storageclass.yaml | kubectl create -f - -``` -**NOTE:** In the v0.4 release we plan to expose monitors via DNS/service names instead of IP address (see [#355](https://github.com/rook/rook/issues/355)), which will streamline the experience and remove the need for this step. - -#### Consume the storage - -Now that rook is running and integrated with Kubernetes, we can create a sample app to consume the block storage provisioned by rook. We will create the classic wordpress and mysql apps. -Both these apps will make use of block volumes provisioned by rook. - -Start mysql and wordpress: - -``` -kubectl create -f mysql.yaml -kubectl create -f wordpress.yaml -``` - -Both of these apps create a block volume and mount it to their respective pod. You can see the Kubernetes volume claims by running the following: - -``` -$ kubectl get pvc -NAME STATUS VOLUME CAPACITY ACCESSMODES AGE -mysql-pv-claim Bound pvc-95402dbc-efc0-11e6-bc9a-0cc47a3459ee 20Gi RWO 1m -wp-pv-claim Bound pvc-39e43169-efc1-11e6-bc9a-0cc47a3459ee 20Gi RWO 1m -``` - -Once the wordpress and mysql pods are in the `Running` state, get the cluster IP of the wordpress app and enter it in your brower: - -``` -$ kubectl get svc wordpress -NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE -wordpress 10.3.0.155 80:30841/TCP 2m -``` - -You should see the wordpress app running. - -**NOTE:** When running in a vagrant environment, there will be no external IP address to reach wordpress with. You will only be able to reach wordpress via the `CLUSTER-IP` from inside the Kubernetes cluster. - -#### Rook Client -You also have the option to use the `rook` client tool directly by running it in a pod that can be started in the cluster with: -``` -kubectl create -f rook-client/rook-client.yml -``` - -Starting the rook-client pod will take a bit of time to download the container, so you can check to see when it's ready with (it should be in the `Running` state): -``` -kubectl -n rook get pod rook-client -``` - -Connect to the rook-client pod and verify the `rook` client can talk to the cluster: -``` -kubectl -n rook exec rook-client -it bash -rook node ls -``` - -At this point (optional), you can follow the steps in the [Block, File and Object Storage section](#block-file-and-object-storage) to create and use those types of storage. - -## Rook Standalone Service - -Rook can also be deployed as a standalone service on any modern Linux host by running the following: - -### Linux -1. Download the latest binaries - - ```bash - $ wget https://github.com/rook/rook/releases/download/v0.2.2/rook-v0.2.2-linux-amd64.tar.gz - $ tar xvf rook-v0.2.2-linux-amd64.tar.gz - ``` - -2. Start a one node Rook cluster - - ```bash - $ ./rookd --data-dir /tmp/rook-test - ``` - -### Vagrant - -Rook is also easy to run with `vagrant` on CoreOS via `rkt`. - -``` -cd demo/vagrant -vagrant up -``` - -## Block, File and Object Storage - -### Block Storage -1. Create a new volume image (10MB) - - ```bash - $ rook block create --name test --size 10485760 - ``` - -2. Mount the block volume and format it - - ```bash - sudo rook block mount --name test --path /tmp/rook-volume - sudo chown $USER:$USER /tmp/rook-volume - ``` - -3. Write and read a file - - ```bash - echo "Hello Rook!" > /tmp/rook-volume/hello - cat /tmp/rook-volume/hello - ``` - -4. Cleanup - - ```bash - sudo rook block unmount --path /tmp/rook-volume - ``` - -## Shared File System -1. Create a shared file system - - ```bash - rook filesystem create --name testFS - ``` - -2. Verify the shared file system was created - - ```bash - rook filesystem ls - ``` - -3. Mount the shared file system from the cluster to your local machine - - ```bash - rook filesystem mount --name testFS --path /tmp/rookFS - sudo chown $USER:$USER /tmp/rookFS - ``` - -4. Write and read a file to the shared file system - - ```bash - echo "Hello Rook!" > /tmp/rookFS/hello - cat /tmp/rookFS/hello - ``` - -5. Unmount the shared file system (this does **not** delete the data from the cluster) - - ```bash - rook filesystem unmount --path /tmp/rookFS - ``` - -6. Cleanup the shared file system from the cluster (this **does** delete the data from the cluster) - - ``` - rook filesystem delete --name testFS - ``` - -### Object Storage -1. Create an object storage instance in the cluster - - ```bash - rook object create - ``` - -2. Create an object storage user - - ```bash - rook object user create rook-user "A rook rgw User" - ``` - -3. Get the connection information for accessing object storage - - ```bash - eval $(rook object connection rook-user --format env-var) - ``` - -4. Use an S3 compatible client to create a bucket in the object store - - ```bash - s3cmd mb --no-ssl --host=${AWS_ENDPOINT} --host-bucket= s3://rookbucket - ``` - -5. List all buckets in the object store - - ```bash - s3cmd ls --no-ssl --host=${AWS_ENDPOINT} --host-bucket= - ``` - -6. Upload a file to the newly created bucket - - ```bash - echo "Hello Rook!" > /tmp/rookObj - s3cmd put /tmp/rookObj --no-ssl --host=${AWS_ENDPOINT} --host-bucket= s3://rookbucket - ``` - -7. Download and verify the file from the bucket - - ```bash - s3cmd get s3://rookbucket/rookObj /tmp/rookObj-download --no-ssl --host=${AWS_ENDPOINT} --host-bucket= - cat /tmp/rookObj-download - ``` +### Using Rook +Once you have a Rook cluster running, you can use the `rook` tool to create and manage storage as shown in the following guide: +- [Using Rook Guide](/demo/client/README.md) ## Building See [Building](https://github.com/rook/rook/wiki/Building) in the wiki for more details. -## Design - -A rook cluster is made up of one or more nodes each running the Rook daemon `rookd`. Containers and Pods can -mount block devices and filesystems exposed by the cluster, or can use S3/Swift API for object storage. There is -also a REST API exposed by `rookd` as well as a command line tool called `rook`. - -![Overview](Documentation/media/cluster.png) - -The Rook daemon `rookd` is a single binary that is self-contained and has all that is needed to bootstrap, scale -and manage a storage cluster. `rookd` is typically compiled into a single static binary (just like most golang -binaries) or a dynamic binary that takes a dependency on mostly libc. It can run in minimal containers, alongside a -hypervisor, or directly on the host on most Linux distributions. - -`rookd` uses an embedded version of Ceph for storing all data -- there are no changes to the data path. An embedded version -of Ceph was created specifically for Rook scenarios and has been pushed upstream. Rook does not attempt to maintain full fidelity -with Ceph, for example, most of the Ceph concepts like OSDs, MONs, placement groups, etc. are hidden. Instead Rook creates -a much simplified UX for admins that is in terms of physical resources, pools, volumes, filesystems, and buckets. - -`rookd` embeds Etcd to store configuration and coordinate cluster-wide management operations. `rookd` will automatically -bootstrap Etcd, manage it, and scale it as the cluster grows. It's also possible to use an external Etcd instead of the embedded one -if needed. - -Rook and etcd are implemented in golang. Ceph is implemented in C++ where the data path is highly optimized. We believe -this combination offers the best of both worlds. - -See [Design](https://github.com/rook/rook/wiki/Design) wiki for more details. - ## Contributing We welcome contributions. See [Contributing](CONTRIBUTING.md) to get started. @@ -330,6 +64,6 @@ Please use the following to reach members of the community: ## Licensing -Rook and Etcd are under the Apache 2.0 license. Ceph is mostly under the LGPL 2.0 license. Some portions +Rook and Etcd are under the Apache 2.0 license. [Ceph](https://github.com/rook/ceph/blob/master/COPYING) is mostly under the LGPL 2.0 license. Some portions of the code are under different licenses. The appropriate license information can be found in the headers of the source files. diff --git a/demo/client/README.md b/demo/client/README.md new file mode 100644 index 000000000..76f662b1d --- /dev/null +++ b/demo/client/README.md @@ -0,0 +1,115 @@ +# Using Rook +The `rook` client tool can be used to manage your Rook cluster once it is running as well as manage block, file and object storage. See the sections below for details on how to configure each type of storage. + +If you don't yet have a Rook cluster running, refer to our [Quickstart Guides](../../README.md#quickstart-guides). + +## Block Storage +1. Create a new volume image (10MB) + + ```bash + $ rook block create --name test --size 10485760 + ``` + +2. Mount the block volume and format it + + ```bash + sudo rook block mount --name test --path /tmp/rook-volume + sudo chown $USER:$USER /tmp/rook-volume + ``` + +3. Write and read a file + + ```bash + echo "Hello Rook!" > /tmp/rook-volume/hello + cat /tmp/rook-volume/hello + ``` + +4. Cleanup + + ```bash + sudo rook block unmount --path /tmp/rook-volume + ``` + +## Shared File System +1. Create a shared file system + + ```bash + rook filesystem create --name testFS + ``` + +2. Verify the shared file system was created + + ```bash + rook filesystem ls + ``` + +3. Mount the shared file system from the cluster to your local machine + + ```bash + rook filesystem mount --name testFS --path /tmp/rookFS + sudo chown $USER:$USER /tmp/rookFS + ``` + +4. Write and read a file to the shared file system + + ```bash + echo "Hello Rook!" > /tmp/rookFS/hello + cat /tmp/rookFS/hello + ``` + +5. Unmount the shared file system (this does **not** delete the data from the cluster) + + ```bash + rook filesystem unmount --path /tmp/rookFS + ``` + +6. Cleanup the shared file system from the cluster (this **does** delete the data from the cluster) + + ``` + rook filesystem delete --name testFS + ``` + +## Object Storage +1. Create an object storage instance in the cluster + + ```bash + rook object create + ``` + +2. Create an object storage user + + ```bash + rook object user create rook-user "A rook rgw User" + ``` + +3. Get the connection information for accessing object storage + + ```bash + eval $(rook object connection rook-user --format env-var) + ``` + +4. Use an S3 compatible client to create a bucket in the object store + + ```bash + s3cmd mb --no-ssl --host=${AWS_ENDPOINT} --host-bucket= s3://rookbucket + ``` + +5. List all buckets in the object store + + ```bash + s3cmd ls --no-ssl --host=${AWS_ENDPOINT} --host-bucket= + ``` + +6. Upload a file to the newly created bucket + + ```bash + echo "Hello Rook!" > /tmp/rookObj + s3cmd put /tmp/rookObj --no-ssl --host=${AWS_ENDPOINT} --host-bucket= s3://rookbucket + ``` + +7. Download and verify the file from the bucket + + ```bash + s3cmd get s3://rookbucket/rookObj /tmp/rookObj-download --no-ssl --host=${AWS_ENDPOINT} --host-bucket= + cat /tmp/rookObj-download + ``` diff --git a/demo/kubernetes/README.md b/demo/kubernetes/README.md index f0a7ffa6c..7cd43e87e 100644 --- a/demo/kubernetes/README.md +++ b/demo/kubernetes/README.md @@ -1,41 +1,133 @@ -## Existing Kubernetes Cluster -If you already have a running Kubernetes cluster, you will also need to modify the kubelet service to bind mount `/sbin/modprobe` to allow access to `modprobe`. Access to modprobe is necessary for using the rbd volume plugin (). -If using RKT, you can allow modprobe by following this [doc](https://github.com/coreos/coreos-kubernetes/blob/master/Documentation/kubelet-wrapper.md#allow-pods-to-use-rbd-volumes). +# Rook on Kubernetes +- [Quickstart](#quickstart) +- [Design](#design) -Instructions also copied here for convenience: -Pods using the [rbd volume plugin](https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/rbd) to consume data from ceph must ensure that the kubelet has access to modprobe. Add the following options to the `RKT_OPTS` env before launching the kubelet via kubelet-wrapper: +## Quickstart +This example shows how to build a simple, multi-tier web application on Kubernetes using persistent volumes enabled by Rook. -```ini -[Service] -Environment=KUBELET_VERSION=v1.5.3_coreos.0 -Environment="RKT_OPTS=--volume modprobe,kind=host,source=/usr/sbin/modprobe \ - --mount volume=modprobe,target=/usr/sbin/modprobe \ - --volume lib-modules,kind=host,source=/lib/modules \ - --mount volume=lib-modules,target=/lib/modules \ - --uuid-file-save=/var/run/kubelet-pod.uuid" -... -``` +### Prerequisites -Note that the kubelet also requires access to the userspace `rbd` tool that is included only in hyperkube images tagged `v1.3.6_coreos.0` or later. +This example requires a running Kubernetes cluster with access to `modprobe` by the kubelet. To make sure you have a Kubernetes cluster that is ready for `rook`, you can [follow these quick instructions](pre-reqs.md). -## New Local Kubernetes Cluster -Alternatively, for a quick start with a new local cluster, use the Rook fork of [coreos-kubernetes](https://github.com/rook/coreos-kubernetes). This will bring up a multi-node Kubernetes cluster with `vagrant` and CoreOS virtual machines ready to use `rook` immediately. -``` -git clone https://github.com/rook/coreos-kubernetes.git -cd coreos-kubernetes/multi-node/vagrant -vagrant up -export KUBECONFIG="$(pwd)/kubeconfig" -kubectl config use-context vagrant-multi -``` +Note that we are striving for even more smooth integration with Kubernetes in the future such that `rook` will work out of the box with any Kubernetes cluster. -Then wait for the cluster to come up and verify that kubernetes is done initializing (be patient, it takes a bit): +### Deploy Rook + +With your Kubernetes cluster running, Rook can be setup and deployed by simply deploying the [rook-operator](rook-operator.yaml) deployment manifest. ``` -kubectl cluster-info +cd demo/kubernetes +kubectl create namespace rook +kubectl create -f rook-operator.yaml ``` -If you see a url response, your cluster is ready to go. +Use `kubectl` to list pods in the rook namespace. You should be able to see the following: -## Using Rook in Kubernetes -Now that you have a Kubernetes cluster running, you can start using `rook` with [these steps](../../README.md#kubernetes) \ No newline at end of file +``` +$ kubectl -n rook get pod +NAME READY STATUS RESTARTS AGE +mon0 1/1 Running 0 1m +mon1 1/1 Running 0 1m +mon2 1/1 Running 0 1m +osd-n1sm3 1/1 Running 0 1m +osd-pb0sh 1/1 Running 0 1m +osd-rth3q 1/1 Running 0 1m +rgw-1785797224-9xb4r 1/1 Running 0 1m +rgw-1785797224-vbg8d 1/1 Running 0 1m +rook-api-4184191414-l0wmw 1/1 Running 0 1m +rook-operator-349747813-c3dmm 1/1 Running 0 1m +``` +**NOTE:** RGW (object storage gateway) is currently deployed by default but in the future will be done only when needed (see [#413](https://github.com/rook/rook/issues/413)) + +### Provision Storage +Before Rook can start provisioning storage, a StorageClass needs to be created. This is used to specify information needed for Kubernetes to interoperate with Rook for provisioning persistent volumes. Rook already creates a default admin and demo user, whose secrets are already specified in the sample [rook-storageclass.yaml](rook-storageclass.yaml). + +Now we just need to specify the Ceph monitor endpoints (requires `jq`): + +``` +export MONS=$(kubectl -n rook get pod mon0 mon1 mon2 -o json|jq ".items[].status.podIP"|tr -d "\""|sed -e 's/$/:6790/'|paste -s -d, -) +sed 's#INSERT_HERE#'$MONS'#' rook-storageclass.yaml | kubectl create -f - +``` +**NOTE:** In the v0.4 release we plan to expose monitors via DNS/service names instead of IP address (see [#355](https://github.com/rook/rook/issues/355)), which will streamline the experience and remove the need for this step. + +### Consume the storage + +Now that rook is running and integrated with Kubernetes, we can create a sample app to consume the block storage provisioned by rook. We will create the classic wordpress and mysql apps. +Both these apps will make use of block volumes provisioned by rook. + +Start mysql and wordpress: + +``` +kubectl create -f mysql.yaml +kubectl create -f wordpress.yaml +``` + +Both of these apps create a block volume and mount it to their respective pod. You can see the Kubernetes volume claims by running the following: + +``` +$ kubectl get pvc +NAME STATUS VOLUME CAPACITY ACCESSMODES AGE +mysql-pv-claim Bound pvc-95402dbc-efc0-11e6-bc9a-0cc47a3459ee 20Gi RWO 1m +wp-pv-claim Bound pvc-39e43169-efc1-11e6-bc9a-0cc47a3459ee 20Gi RWO 1m +``` + +Once the wordpress and mysql pods are in the `Running` state, get the cluster IP of the wordpress app and enter it in your brower: + +``` +$ kubectl get svc wordpress +NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE +wordpress 10.3.0.155 80:30841/TCP 2m +``` + +You should see the wordpress app running. + +**NOTE:** When running in a vagrant environment, there will be no external IP address to reach wordpress with. You will only be able to reach wordpress via the `CLUSTER-IP` from inside the Kubernetes cluster. + +### Rook Client +You also have the option to use the `rook` client tool directly by running it in a pod that can be started in the cluster with: +``` +kubectl create -f rook-client/rook-client.yml +``` + +Starting the rook-client pod will take a bit of time to download the container, so you can check to see when it's ready with (it should be in the `Running` state): +``` +kubectl -n rook get pod rook-client +``` + +Connect to the rook-client pod and verify the `rook` client can talk to the cluster: +``` +kubectl -n rook exec rook-client -it bash +rook node ls +``` + +At this point, you can use the `rook` tool along with some [simple steps to create and manage block, file and object storage](../client/README.md). + +## Design + +With Rook running in the Kubernetes cluster, Kubernetes applications can +mount block devices and filesystems managed by Rook, or can use the S3/Swift API for object storage. The Rook operator +automates configuration of the Ceph storage components and monitors the cluster to ensure the storage remains available +and healthy. There is also a REST API service for configuring the Rook storage and a command line tool called `rook`. + +![Rook Architecture on Kubernetes](/Documentation/media/kubernetes.png) + +The Rook operator is a simple container containing the `rook-operator` binary that has all that is needed to bootstrap +and monitor the storage cluster. The operator will start and monitor ceph monitor pods and a daemonset for the OSDs to +which provides basic RADOS storage, as well as a deployment for a RESTful API service. When requested through the api service, +object storage (S3/Swift) is enabled by starting a deployment for RGW, while a shared file system is enabled with a deployment for MDS. + +The operator will monitor the storage daemons to ensure the cluster is healthy, to start more ceph mons when necessary, to +failover mons, make adjustments as the cluster grows or shrinks, etc. The operator will also watch for desired state changes +requested by the api service and apply the changes. + +The Rook daemons (Mons, OSDs, RGW, and MDS) are compiled to a single binary `rookd`, and included in a minimal container. +`rookd` uses an embedded version of Ceph for storing all data -- there are no changes to the data path. +Rook does not attempt to maintain full fidelity with Ceph. Many of the Ceph concepts like placement groups and crush maps +are hidden so you don't have to worry about them. Instead Rook creates a much simplified UX for admins that is in terms +of physical resources, pools, volumes, filesystems, and buckets. + +Rook is implemented in golang. Ceph is implemented in C++ where the data path is highly optimized. We believe +this combination offers the best of both worlds. + +See [Design](https://github.com/rook/rook/wiki/Design) wiki for more details. \ No newline at end of file diff --git a/demo/kubernetes/pre-reqs.md b/demo/kubernetes/pre-reqs.md new file mode 100644 index 000000000..5a7abbd85 --- /dev/null +++ b/demo/kubernetes/pre-reqs.md @@ -0,0 +1,41 @@ + +## New Local Kubernetes Cluster +For a quick start with a new local cluster, use the Rook fork of [coreos-kubernetes](https://github.com/rook/coreos-kubernetes). This will bring up a multi-node Kubernetes cluster with `vagrant` and CoreOS virtual machines ready to use `rook` immediately. +``` +git clone https://github.com/rook/coreos-kubernetes.git +cd coreos-kubernetes/multi-node/vagrant +vagrant up +export KUBECONFIG="$(pwd)/kubeconfig" +kubectl config use-context vagrant-multi +``` + +Then wait for the cluster to come up and verify that kubernetes is done initializing (be patient, it takes a bit): + +``` +kubectl cluster-info +``` + +Once you see a url response, your cluster is [ready for use by Rook](README.md#deploy-rook). + +## Existing Kubernetes Cluster +Alternatively, if you already have a running Kubernetes cluster, you can deploy Rook to it with a small update to modify the kubelet service to bind mount `/sbin/modprobe`, which allows access to `modprobe`. +Access to modprobe is necessary for using the rbd volume plugin, which is being tracked in the Kubernetes code base with [#23924](https://github.com/kubernetes/kubernetes/issues/23924). + +If using RKT, you can enable `modprobe` by following this [guide](https://github.com/coreos/coreos-kubernetes/blob/master/Documentation/kubelet-wrapper.md#allow-pods-to-use-rbd-volumes). Instructions have been directly copied below for your convenience: + +Add the following options to the `RKT_OPTS` env before launching the kubelet via kubelet-wrapper: +```ini +[Service] +Environment=KUBELET_VERSION=v1.5.3_coreos.0 +Environment="RKT_OPTS=--volume modprobe,kind=host,source=/usr/sbin/modprobe \ + --mount volume=modprobe,target=/usr/sbin/modprobe \ + --volume lib-modules,kind=host,source=/lib/modules \ + --mount volume=lib-modules,target=/lib/modules \ + --uuid-file-save=/var/run/kubelet-pod.uuid" +... +``` + +Note that the kubelet also requires access to the userspace `rbd` tool that is included only in hyperkube images tagged `v1.3.6_coreos.0` or later. + +## Using Rook in Kubernetes +Now that you have a Kubernetes cluster running, you can start using `rook` with [these steps](README.md#deploy-rook). \ No newline at end of file diff --git a/demo/standalone/README.md b/demo/standalone/README.md new file mode 100644 index 000000000..d4d30bcdd --- /dev/null +++ b/demo/standalone/README.md @@ -0,0 +1,80 @@ + +# Rook Standalone + +- [Directly on Linux Host](#directly-on-linux-host) +- [Vagrant](#vagrant) +- [Design](#design) + +## Directly on Linux Host + +Rook can be deployed as a standalone service directly on any modern Linux host by running the following: + +1. Download the latest client and server binaries + +```bash +wget https://github.com/rook/rook/releases/download/v0.2.2/rook-v0.2.2-linux-amd64.tar.gz +tar xvf rook-v0.2.2-linux-amd64.tar.gz +``` + +2. Start a one node Rook cluster +```bash +./rookd --data-dir /tmp/rook-test +``` + +3. In another console (but in the same path), verify the Rook cluster is ready +```bash +./rook status +``` + +At this point, you can use the `rook` tool along with some [simple steps to create and manage block, file and object storage](../client/README.md). + + +## Vagrant + +Rook is also easy to run in virutal machines with `vagrant` using the provided [Vagrantfile](Vagrantfile) in this directory. When instructed, `vagrant` will start up CoreOS virtual machines and launch `rook` via `rkt`. Note that you can make configuration changes as desired in the provided [cloud config file](cloud-config.yml.in). + +``` +vagrant up +``` + +### Rook Client Tool +Once the Rook cluster in Vagrant is running and initialized, you can use the `rook` client tool to manage the cluster and consume the storage. First, either use a locally built `rook` tool or download the latest release from github: +``` +wget https://github.com/rook/rook/releases/download/v0.2.2/rook-v0.2.2-linux-amd64.tar.gz +tar xvf rook-v0.2.2-linux-amd64.tar.gz +``` + +Verify the cluster is up and running: +``` +export ROOK_API_SERVER_ENDPOINT="172.20.20.10:8124" +./rook status +``` + +At this point, you can use the `rook` tool along with some [simple steps to create and manage block, file and object storage](../client/README.md). + +### Clean up + +When you are all done with your Rook cluster in Vagrant, you can clean everything up by destroying the VMs with: +``` +vagrant destroy -f +rm -f .discovery-token +``` + +## Design + +Rook supports an environment where there is no orchestration platform. Rook comes with its own basic orchestration +engine based on Etcd that is activated when not running in Kubernetes. + +![Standalone Rook Architecture](/Documentation/media/standalone.png) + +The Rook daemon, `rookd`, is a single binary that is self-contained and has all that is needed to bootstrap, scale +and manage a storage cluster. `rookd` is typically compiled into a single static binary (just like most golang +binaries) or a dynamic binary that takes a dependency on mostly libc. It can run in minimal containers, alongside a +hypervisor, or directly on the host on most Linux distributions. Each machine in the cluster must run the Rook daemon. + +`rookd` embeds Etcd to store configuration and coordinate cluster-wide management operations. `rookd` will automatically +bootstrap Etcd, manage it, and scale it as the cluster grows. It's also possible to use an external Etcd instead of the embedded one +if needed. + +Standalone Rook still requires some key orchestration features such as resource management, health monitoring, failover, and upgrades. +If this scenario is interesting to you, contributions are welcome! \ No newline at end of file diff --git a/demo/vagrant/Vagrantfile b/demo/standalone/Vagrantfile similarity index 100% rename from demo/vagrant/Vagrantfile rename to demo/standalone/Vagrantfile diff --git a/demo/vagrant/cloud-config.yml.in b/demo/standalone/cloud-config.yml.in similarity index 100% rename from demo/vagrant/cloud-config.yml.in rename to demo/standalone/cloud-config.yml.in diff --git a/demo/vagrant/util.rb b/demo/standalone/util.rb similarity index 100% rename from demo/vagrant/util.rb rename to demo/standalone/util.rb