From 307227ca543caff50400d83b65e7521fa368a3e3 Mon Sep 17 00:00:00 2001 From: David Young Date: Mon, 17 Jul 2017 22:39:48 +1200 Subject: [PATCH] Added to persistent storage docs --- docs/ha-docker-swarm/docker-swarm-mode.md | 0 ...ared-storage-replicated-gluster-volume.png | Bin 0 -> 44077 bytes docs/ha-docker-swarm/keepalived.md | 1 + docs/ha-docker-swarm/maintenance.md | 3 + docs/ha-docker-swarm/persistent-storage.md | 70 ++++++++++++++++++ docs/ha-docker-swarm/s3-storage.md | 0 docs/ha-docker-swarm/traefik.md | 0 examples/cloud-config.txt | 16 ++++ mkdocs.yml | 14 ++-- 9 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 docs/ha-docker-swarm/docker-swarm-mode.md create mode 100644 docs/ha-docker-swarm/images/shared-storage-replicated-gluster-volume.png create mode 100644 docs/ha-docker-swarm/keepalived.md create mode 100644 docs/ha-docker-swarm/maintenance.md create mode 100644 docs/ha-docker-swarm/persistent-storage.md create mode 100644 docs/ha-docker-swarm/s3-storage.md create mode 100644 docs/ha-docker-swarm/traefik.md create mode 100644 examples/cloud-config.txt diff --git a/docs/ha-docker-swarm/docker-swarm-mode.md b/docs/ha-docker-swarm/docker-swarm-mode.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/ha-docker-swarm/images/shared-storage-replicated-gluster-volume.png b/docs/ha-docker-swarm/images/shared-storage-replicated-gluster-volume.png new file mode 100644 index 0000000000000000000000000000000000000000..135a63f345ad997101d34e72ca63b889d8289686 GIT binary patch literal 44077 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

;YdWD3_p=D2U zH^P_gUl&kjT6^1-J%BJ9V!it(V8lS>RS+Zk@i#0g8&kkZEv#%rVVsa&zN?b@efkT; zWQJo-jMHxT1ga<5ME*}93Fz_|&czBnB%s>C{ine~h|`{SMi_c{?|;7mqYAAW2TA?B zQ=;i#?ou)x0Aj3-mI@30mB~2JL%5(@7+`J1l{Ycfck0SHmT; ze}3P4FTmBSkqy>Z2W5sZ4zbKxy^$S<9m=o<0j0p%`&O z8vS8hSQhoZhwxRAf>?-W@ioSC(dOB3ij-l5?*V3{YNT3ZCz{>&Qqg2YcJ26@#R(Ua zy<;K7O&-t8<${Zu5x{x;?d&Y5X|knD*`R_RO*1HVj+SCMMT9c1C58W!Yy73{#*V6L5=tUgt0y&M8Z3Kyp0Cf&A-z?SjqY&R8m&l>PL)~$@jPrrh zhqq^KgUg2UN~M@2AE_^takSrwA53HgaM(4mC{O7Iu5UdAhy^2g9xv!49JPYunO`G@ z3~!;3w~uddw5|~(hFUh}@8b3;euC5AOgojxn%^*-qPZelw6=iM(F?OHI}l|Q9uQ%_ z$pO`U+KmizU6;8t)ut|$@DX;fK0XS^9ruZAI;9J zgCf5){=^$gcd2lk_c@NL1s;7CScJqZ6wROmjgRF(_HhkAwB$h6TO>EMI%`n z8_>4#R#vO^O=O4cTU)5LpV_CR^*^7I)?~8_>AXQUJx>|Tt^uVjj^>7BFxt61Z`0XH z{eCIGjLWAx-|8&~|9YFcw@bp?`LmCTq5fB34u#C&p{a~wUB?i*i)Tl9z)pSv_NAqV4+{c=qT z`}!Z#_)-v^CWI37)gI$BM!lrExs@w%$0ZPNvBAK=c@bu=V@@2N)0pfq(%tcfX+PYU|}| o>0yK6>+8$s;Ns+IZRuvi=jvgXwkJ&sdsYU4j0LP8~djJ3c literal 0 HcmV?d00001 diff --git a/docs/ha-docker-swarm/keepalived.md b/docs/ha-docker-swarm/keepalived.md new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/docs/ha-docker-swarm/keepalived.md @@ -0,0 +1 @@ +test diff --git a/docs/ha-docker-swarm/maintenance.md b/docs/ha-docker-swarm/maintenance.md new file mode 100644 index 0000000..825f58c --- /dev/null +++ b/docs/ha-docker-swarm/maintenance.md @@ -0,0 +1,3 @@ +# Introduction + +## Adding a host diff --git a/docs/ha-docker-swarm/persistent-storage.md b/docs/ha-docker-swarm/persistent-storage.md new file mode 100644 index 0000000..1f77850 --- /dev/null +++ b/docs/ha-docker-swarm/persistent-storage.md @@ -0,0 +1,70 @@ +# Introduction + +While Docker Swarm is great for keeping containers running (and restarting those that fail), it does nothing for persistent storage. This means if you actually want your containers to keep any data persistent across restarts, you need to think about storage. + +## Ingredients + +!!! summary "Ingredients" + 3 x Virtual Machines (configured earlier), each with: + + * [X] CentOS/Fedora Atomic + * [X] At least 1GB RAM + * [X] At least 20GB disk space (_but it'll be tight_) + * [X] Connectivity to each other within the same subnet, and on a low-latency link (_i.e., no WAN links_) + * [ ] A second disk, or adequate space on the primary disk for a dedicated data partition + +## Preparation + +### Create Gluster "bricks" + +To build our Gluster volume, we need each of the 3 VMs to provide one "brick". The bricks will be used to create the replicated volume. + +On each host, run the following to create your bricks, adjusted for the path to your disk. + +``` +mkfs.xfs -i size=512 /dev/vdb1 +mkdir -p /data/glusterfs/docker-persistent/brick1 +echo '/dev/vdb1 /data/glusterfs/docker-persistent/brick1/ xfs defaults 1 2' >> /etc/fstab +mount -a && mount +``` + +!!! warning "Don't provision all your LVM space" + Atomic uses LVM to store docker data, and **automatically grows** Docker's volumes as requried. If you commit all your free LVM space to your brick, you'll quickly find (as I did) that docker will start to fail with error messages about insufficient space. If you're going to slice off a portion of your LVM space in /dev/atomicos, make sure you leave enough space for Docker storage, where "enough" depends on how much you plan to pull images, make volumes, etc. I ate through 20GB very quickly doing development, so I ended up provisioning 50GB for atomic alone, with a separate volume for the brick. + +### Create glusterfs container + +Atomic doesn't include the Gluster server components. This means we'll have to run glusterd from within a container, with privileged access to the host. Although convoluted, I actually prefer this design since it once again makes the OS "disposable", moving all the config into containers and code. + +Run the following on each host: +```` +docker run \ + -h glusterfs-server \ + -v /etc/glusterfs:/etc/glusterfs:z \ + -v /var/lib/glusterd:/var/lib/glusterd:z \ + -v /var/log/glusterfs:/var/log/glusterfs:z \ + -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ + -v /data/glusterfs/gv0/brick1:/data/glusterfs/gv0/brick1 \ + -d --privileged=true --net=host \ + --restart=always \ + --name="glusterfs-server" \ + gluster/gluster-centos +```` + +### Create gluster volume + +Now we create a *replicated volume* out of our individual "bricks". On a single node (doesn't matter which), run ```docker exec -it glusterfs-server bash``` to launch a shell inside the container. + +Create the gluster volume by running +```gluster volume create gv0 replica 2 server1:/data/glusterfs/gv0/brick1 server2:/data/glusterfs/gv0/brick1 server3:/data/glusterfs/gv0/brick1``` + +Start the volume by running ```gluster volume start gv0``` + +The volume is only present on the host you're shelled into though. To add the other hosts to the volume, run ```gluster peer probe ```. Don't probe host from itself. + +From one other host, run ```docker exec -it glusterfs-server bash``` to shell into the gluster-server container, and run ```gluster peer probe ``` to update the name of the host which started the volume. + +### Mount gluster volume + +On the host (i.e., outside of the container - type ```exit``` if you're still shelled in), create a mountpoint for the data, by running ```mkdir /srv/data``` + +Add an entry to fstab to ensure the volume is auto-mounted on boot: diff --git a/docs/ha-docker-swarm/s3-storage.md b/docs/ha-docker-swarm/s3-storage.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/ha-docker-swarm/traefik.md b/docs/ha-docker-swarm/traefik.md new file mode 100644 index 0000000..e69de29 diff --git a/examples/cloud-config.txt b/examples/cloud-config.txt new file mode 100644 index 0000000..660d6ee --- /dev/null +++ b/examples/cloud-config.txt @@ -0,0 +1,16 @@ +#cloud-config +ssh_authorized_keys: + - ssh-rsa ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFkmE2zK7uE9q75nzQxa9tQPHiCgaEUkIDj9xdoPL911 davidy@funkypenguin.co.nz +write_files: + - path: /etc/docker-latest/daemon.json + content: | + { + "log-driver": "journald", + "signature-verification": false, + "experimental": true + } +runcmd: + - systemctl disable docker --now + - systemctl enable docker-latest --now + - sed -i '/DOCKERBINARY/s/^#//g' /etc/sysconfig/docker + - /bin/atomic host upgrade diff --git a/mkdocs.yml b/mkdocs.yml index 8c62895..fbdc6a8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -4,8 +4,8 @@ site_author: 'David Young' site_url: 'https://geeks-cookbook.funkypenguin.co.nz' # Repository -repo_name: 'funkypenguin/geek-cookbook' -repo_url: 'https://gitlab.funkypenguin.co.nz/funkypenguin/geeks-cookbook' +# repo_name: 'funkypenguin/geek-cookbook' +# repo_url: 'https://gitlab.funkypenguin.co.nz/funkypenguin/geeks-cookbook' # Copyright copyright: 'Copyright © 2016 - 2017 David Young' @@ -20,11 +20,11 @@ pages: - HA Docker Swarm: - Design: ha-docker-swarm/design.md - VMs: ha-docker-swarm/vms.md - - Persistent Storage: beginner/beginner.md - - Keepalived: advanced/keepalived.md - - Docker Swarm Mode: advanced/keepalived.md - - Traefik: advanced/keepalived.md - - S3-like Storage: advanced/keepalived.md + - Persistent Storage: ha-docker-swarm/persistent-storage.md + - Keepalived: ha-docker-swarm/keepalived.md + - Docker Swarm Mode: ha-docker-swarm/docker-swarm-mode.md + - Traefik: ha-docker-swarm/traefik.md + - S3-like Storage: ha-docker-swarm/s3-storage.md - Tiny Tiny RSS: - Basic: advanced/tiny-tiny-rss.md - Plugins: advanced/tiny-tiny-rss.md