add en pages

This commit is contained in:
Karen Bradshaw
2020-05-30 15:10:23 -04:00
parent 1502e0281d
commit ecc27bbbe7
347 changed files with 2900 additions and 2537 deletions
+8 -7
View File
@@ -2,10 +2,10 @@
title: Tutorials
main_menu: true
weight: 60
content_template: templates/concept
content_type: concept
---
{{% capture overview %}}
<!-- overview -->
This section of the Kubernetes documentation contains tutorials.
A tutorial shows how to accomplish a goal that is larger than a single
@@ -14,9 +14,9 @@ each of which has a sequence of steps.
Before walking through each tutorial, you may want to bookmark the
[Standardized Glossary](/docs/reference/glossary/) page for later references.
{{% /capture %}}
{{% capture body %}}
<!-- body -->
## Basics
@@ -64,12 +64,13 @@ Before walking through each tutorial, you may want to bookmark the
* [Using Source IP](/docs/tutorials/services/source-ip/)
{{% /capture %}}
{{% capture whatsnext %}}
## {{% heading "whatsnext" %}}
If you would like to write a tutorial, see
[Using Page Templates](/docs/home/contribute/page-templates/)
for information about the tutorial page type and the tutorial template.
{{% /capture %}}
+14 -11
View File
@@ -2,10 +2,10 @@
reviewers:
- stclair
title: AppArmor
content_template: templates/tutorial
content_type: tutorial
---
{{% capture overview %}}
<!-- overview -->
{{< feature-state for_k8s_version="v1.4" state="beta" >}}
@@ -24,9 +24,10 @@ that AppArmor is not a silver bullet and can only do so much to protect against
application code. It is important to provide good, restrictive profiles, and harden your
applications and cluster from other angles as well.
{{% /capture %}}
{{% capture objectives %}}
## {{% heading "objectives" %}}
* See an example of how to load a profile on a node
* Learn how to enforce the profile on a Pod
@@ -34,9 +35,10 @@ applications and cluster from other angles as well.
* See what happens when a profile is violated
* See what happens when a profile cannot be loaded
{{% /capture %}}
{{% capture prerequisites %}}
## {{% heading "prerequisites" %}}
Make sure:
@@ -111,9 +113,9 @@ gke-test-default-pool-239f5d02-x1kf: kubelet is posting ready status. AppArmor e
gke-test-default-pool-239f5d02-xwux: kubelet is posting ready status. AppArmor enabled
```
{{% /capture %}}
{{% capture lessoncontent %}}
<!-- lessoncontent -->
## Securing a Pod
@@ -458,13 +460,14 @@ Specifying the list of profiles Pod containers is allowed to specify:
- Although an escaped comma is a legal character in a profile name, it cannot be explicitly
allowed here.
{{% /capture %}}
{{% capture whatsnext %}}
## {{% heading "whatsnext" %}}
Additional resources:
* [Quick guide to the AppArmor profile language](https://gitlab.com/apparmor/apparmor/wikis/QuickProfileLanguage)
* [AppArmor core policy reference](https://gitlab.com/apparmor/apparmor/wikis/Policy_Layout)
{{% /capture %}}
@@ -3,16 +3,17 @@ reviewers:
- eparis
- pmorie
title: Configuring Redis using a ConfigMap
content_template: templates/tutorial
content_type: tutorial
---
{{% capture overview %}}
<!-- overview -->
This page provides a real world example of how to configure Redis using a ConfigMap and builds upon the [Configure Containers Using a ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/) task.
{{% /capture %}}
{{% capture objectives %}}
## {{% heading "objectives" %}}
* Create a `kustomization.yaml` file containing:
* a ConfigMap generator
@@ -20,18 +21,19 @@ This page provides a real world example of how to configure Redis using a Config
* Apply the directory by running `kubectl apply -k ./`
* Verify that the configuration was correctly applied.
{{% /capture %}}
{{% capture prerequisites %}}
## {{% heading "prerequisites" %}}
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
* The example shown on this page works with `kubectl` 1.14 and above.
* Understand [Configure Containers Using a ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/).
{{% /capture %}}
{{% capture lessoncontent %}}
<!-- lessoncontent -->
## Real World Example: Configuring Redis using a ConfigMap
@@ -105,12 +107,13 @@ Delete the created pod:
kubectl delete pod redis
```
{{% /capture %}}
{{% capture whatsnext %}}
## {{% heading "whatsnext" %}}
* Learn more about [ConfigMaps](/docs/tasks/configure-pod-container/configure-pod-configmap/).
{{% /capture %}}
+14 -11
View File
@@ -1,6 +1,6 @@
---
title: Hello Minikube
content_template: templates/tutorial
content_type: tutorial
weight: 5
menu:
main:
@@ -13,7 +13,7 @@ card:
weight: 10
---
{{% capture overview %}}
<!-- overview -->
This tutorial shows you how to run a sample app
on Kubernetes using [Minikube](/docs/setup/learning-environment/minikube) and Katacoda.
@@ -23,23 +23,25 @@ Katacoda provides a free, in-browser Kubernetes environment.
You can also follow this tutorial if you've installed [Minikube locally](/docs/tasks/tools/install-minikube/).
{{< /note >}}
{{% /capture %}}
{{% capture objectives %}}
## {{% heading "objectives" %}}
* Deploy a sample application to Minikube.
* Run the app.
* View application logs.
{{% /capture %}}
{{% capture prerequisites %}}
## {{% heading "prerequisites" %}}
This tutorial provides a container image that uses NGINX to echo back all the requests.
{{% /capture %}}
{{% capture lessoncontent %}}
<!-- lessoncontent -->
## Create a Minikube cluster
@@ -272,12 +274,13 @@ Optionally, delete the Minikube VM:
minikube delete
```
{{% /capture %}}
{{% capture whatsnext %}}
## {{% heading "whatsnext" %}}
* Learn more about [Deployment objects](/docs/concepts/workloads/controllers/deployment/).
* Learn more about [Deploying applications](/docs/tasks/run-application/run-stateless-application-deployment/).
* Learn more about [Service objects](/docs/concepts/services-networking/service/).
{{% /capture %}}
+17 -13
View File
@@ -1,19 +1,20 @@
---
title: Using Source IP
content_template: templates/tutorial
content_type: tutorial
min-kubernetes-server-version: v1.5
---
{{% capture overview %}}
<!-- overview -->
Applications running in a Kubernetes cluster find and communicate with each
other, and the outside world, through the Service abstraction. This document
explains what happens to the source IP of packets sent to different types
of Services, and how you can toggle this behavior according to your needs.
{{% /capture %}}
{{% capture prerequisites %}}
## {{% heading "prerequisites" %}}
### Terminology
@@ -54,18 +55,19 @@ The output is:
deployment.apps/source-ip-app created
```
{{% /capture %}}
{{% capture objectives %}}
## {{% heading "objectives" %}}
* Expose a simple application through various types of Services
* Understand how each Service type handles source IP NAT
* Understand the tradeoffs involved in preserving source IP
{{% /capture %}}
{{% capture lessoncontent %}}
<!-- lessoncontent -->
## Source IP for Services with `Type=ClusterIP`
@@ -423,9 +425,10 @@ Load balancers in the second category can leverage the feature described above
by creating an HTTP health check pointing at the port stored in
the `service.spec.healthCheckNodePort` field on the Service.
{{% /capture %}}
{{% capture cleanup %}}
## {{% heading "cleanup" %}}
Delete the Services:
@@ -439,10 +442,11 @@ Delete the Deployment, ReplicaSet and Pod:
kubectl delete deployment source-ip-app
```
{{% /capture %}}
{{% capture whatsnext %}}
## {{% heading "whatsnext" %}}
* Learn more about [connecting applications via services](/docs/concepts/services-networking/connect-applications-service/)
* Read how to [Create an External Load Balancer](https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/)
{{% /capture %}}
@@ -7,17 +7,18 @@ reviewers:
- kow3ns
- smarterclayton
title: StatefulSet Basics
content_template: templates/tutorial
content_type: tutorial
weight: 10
---
{{% capture overview %}}
<!-- overview -->
This tutorial provides an introduction to managing applications with
[StatefulSets](/docs/concepts/workloads/controllers/statefulset/). It
demonstrates how to create, delete, scale, and update the Pods of StatefulSets.
{{% /capture %}}
{{% capture prerequisites %}}
## {{% heading "prerequisites" %}}
Before you begin this tutorial, you should familiarize yourself with the
following Kubernetes concepts.
@@ -33,9 +34,10 @@ This tutorial assumes that your cluster is configured to dynamically provision
PersistentVolumes. If your cluster is not configured to do so, you
will have to manually provision two 1 GiB volumes prior to starting this
tutorial.
{{% /capture %}}
{{% capture objectives %}}
## {{% heading "objectives" %}}
StatefulSets are intended to be used with stateful applications and distributed
systems. However, the administration of stateful applications and
distributed systems on Kubernetes is a broad, complex topic. In order to
@@ -49,9 +51,9 @@ After this tutorial, you will be familiar with the following.
* How to delete a StatefulSet
* How to scale a StatefulSet
* How to update a StatefulSet's Pods
{{% /capture %}}
{{% capture lessoncontent %}}
<!-- lessoncontent -->
## Creating a StatefulSet
Begin by creating a StatefulSet using the example below. It is similar to the
@@ -1035,13 +1037,14 @@ Service.
```shell
kubectl delete svc nginx
```
{{% /capture %}}
{{% capture cleanup %}}
## {{% heading "cleanup" %}}
You will need to delete the persistent storage media for the PersistentVolumes
used in this tutorial. Follow the necessary steps, based on your environment,
storage configuration, and provisioning method, to ensure that all storage is
reclaimed.
{{% /capture %}}
@@ -2,11 +2,11 @@
title: "Example: Deploying Cassandra with a StatefulSet"
reviewers:
- ahmetb
content_template: templates/tutorial
content_type: tutorial
weight: 30
---
{{% capture overview %}}
<!-- overview -->
This tutorial shows you how to run [Apache Cassandra](http://cassandra.apache.org/) on Kubernetes. Cassandra, a database, needs persistent storage to provide data durability (application _state_). In this example, a custom Cassandra seed provider lets the database discover new Cassandra instances as they join the Cassandra cluster.
*StatefulSets* make it easier to deploy stateful applications into your Kubernetes cluster. For more information on the features used in this tutorial, see [StatefulSet](/docs/concepts/workloads/controllers/statefulset/).
@@ -23,17 +23,19 @@ nodes in the ring.
This tutorial deploys a custom Cassandra seed provider that lets the database discover
new Cassandra Pods as they appear inside your Kubernetes cluster.
{{< /note >}}
{{% /capture %}}
{{% capture objectives %}}
## {{% heading "objectives" %}}
* Create and validate a Cassandra headless {{< glossary_tooltip text="Service" term_id="service" >}}.
* Use a {{< glossary_tooltip term_id="StatefulSet" >}} to create a Cassandra ring.
* Validate the StatefulSet.
* Modify the StatefulSet.
* Delete the StatefulSet and its {{< glossary_tooltip text="Pods" term_id="pod" >}}.
{{% /capture %}}
{{% capture prerequisites %}}
## {{% heading "prerequisites" %}}
{{< include "task-tutorial-prereqs.md" >}}
To complete this tutorial, you should already have a basic familiarity with {{< glossary_tooltip text="Pods" term_id="pod" >}}, {{< glossary_tooltip text="Services" term_id="service" >}}, and {{< glossary_tooltip text="StatefulSets" term_id="StatefulSet" >}}.
@@ -48,9 +50,9 @@ minikube start --memory 5120 --cpus=4
```
{{< /caution >}}
{{% /capture %}}
{{% capture lessoncontent %}}
<!-- lessoncontent -->
## Creating a headless Service for Cassandra {#creating-a-cassandra-headless-service}
In Kubernetes, a {{< glossary_tooltip text="Service" term_id="service" >}} describes a set of {{< glossary_tooltip text="Pods" term_id="pod" >}} that perform the same task.
@@ -219,9 +221,10 @@ Use `kubectl edit` to modify the size of a Cassandra StatefulSet.
cassandra 4 4 36m
```
{{% /capture %}}
{{% capture cleanup %}}
## {{% heading "cleanup" %}}
Deleting or scaling a StatefulSet down does not delete the volumes associated with the StatefulSet. This setting is for your safety because your data is more valuable than automatically purging all related StatefulSet resources.
{{< warning >}}
@@ -261,12 +264,13 @@ By using environment variables you can change values that are inserted into `cas
| `CASSANDRA_RPC_ADDRESS` | `0.0.0.0` |
{{% /capture %}}
{{% capture whatsnext %}}
## {{% heading "whatsnext" %}}
* Learn how to [Scale a StatefulSet](/docs/tasks/run-application/scale-stateful-set/).
* Learn more about the [*KubernetesSeedProvider*](https://github.com/kubernetes/examples/blob/master/cassandra/java/src/main/java/io/k8s/cassandra/KubernetesSeedProvider.java)
* See more custom [Seed Provider Configurations](https://git.k8s.io/examples/cassandra/java/README.md)
{{% /capture %}}
@@ -2,7 +2,7 @@
title: "Example: Deploying WordPress and MySQL with Persistent Volumes"
reviewers:
- ahmetb
content_template: templates/tutorial
content_type: tutorial
weight: 20
card:
name: tutorials
@@ -10,7 +10,7 @@ card:
title: "Stateful Example: Wordpress with Persistent Volumes"
---
{{% capture overview %}}
<!-- overview -->
This tutorial shows you how to deploy a WordPress site and a MySQL database using Minikube. Both applications use PersistentVolumes and PersistentVolumeClaims to store data.
A [PersistentVolume](/docs/concepts/storage/persistent-volumes/) (PV) is a piece of storage in the cluster that has been manually provisioned by an administrator, or dynamically provisioned by Kubernetes using a [StorageClass](/docs/concepts/storage/storage-classes). A [PersistentVolumeClaim](/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) (PVC) is a request for storage by a user that can be fulfilled by a PV. PersistentVolumes and PersistentVolumeClaims are independent from Pod lifecycles and preserve data through restarting, rescheduling, and even deleting Pods.
@@ -23,9 +23,10 @@ This deployment is not suitable for production use cases, as it uses single inst
The files provided in this tutorial are using GA Deployment APIs and are specific to kubernetes version 1.9 and later. If you wish to use this tutorial with an earlier version of Kubernetes, please update the API version appropriately, or reference earlier versions of this tutorial.
{{< /note >}}
{{% /capture %}}
{{% capture objectives %}}
## {{% heading "objectives" %}}
* Create PersistentVolumeClaims and PersistentVolumes
* Create a `kustomization.yaml` with
* a Secret generator
@@ -34,9 +35,10 @@ The files provided in this tutorial are using GA Deployment APIs and are specifi
* Apply the kustomization directory by `kubectl apply -k ./`
* Clean up
{{% /capture %}}
{{% capture prerequisites %}}
## {{% heading "prerequisites" %}}
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
The example shown on this page works with `kubectl` 1.14 and above.
@@ -47,9 +49,9 @@ Download the following configuration files:
1. [wordpress-deployment.yaml](/examples/application/wordpress/wordpress-deployment.yaml)
{{% /capture %}}
{{% capture lessoncontent %}}
<!-- lessoncontent -->
## Create PersistentVolumeClaims and PersistentVolumes
@@ -218,9 +220,10 @@ Now you can verify that all objects exist.
Do not leave your WordPress installation on this page. If another user finds it, they can set up a website on your instance and use it to serve malicious content. <br/><br/>Either install WordPress by creating a username and password or delete your instance.
{{< /warning >}}
{{% /capture %}}
{{% capture cleanup %}}
## {{% heading "cleanup" %}}
1. Run the following command to delete your Secret, Deployments, Services and PersistentVolumeClaims:
@@ -228,14 +231,15 @@ Do not leave your WordPress installation on this page. If another user finds it,
kubectl delete -k ./
```
{{% /capture %}}
{{% capture whatsnext %}}
## {{% heading "whatsnext" %}}
* Learn more about [Introspection and Debugging](/docs/tasks/debug-application-cluster/debug-application-introspection/)
* Learn more about [Jobs](/docs/concepts/workloads/controllers/jobs-run-to-completion/)
* Learn more about [Port Forwarding](/docs/tasks/access-application-cluster/port-forward-access-application-cluster/)
* Learn how to [Get a Shell to a Container](/docs/tasks/debug-application-cluster/get-shell-running-container/)
{{% /capture %}}
@@ -8,18 +8,19 @@ reviewers:
- kow3ns
- smarterclayton
title: Running ZooKeeper, A Distributed System Coordinator
content_template: templates/tutorial
content_type: tutorial
weight: 40
---
{{% capture overview %}}
<!-- overview -->
This tutorial demonstrates running [Apache Zookeeper](https://zookeeper.apache.org) on
Kubernetes using [StatefulSets](/docs/concepts/workloads/controllers/statefulset/),
[PodDisruptionBudgets](/docs/concepts/workloads/pods/disruptions/#specifying-a-poddisruptionbudget),
and [PodAntiAffinity](/docs/user-guide/node-selection/#inter-pod-affinity-and-anti-affinity-beta-feature).
{{% /capture %}}
{{% capture prerequisites %}}
## {{% heading "prerequisites" %}}
Before starting this tutorial, you should be familiar with the following
Kubernetes concepts.
@@ -40,18 +41,19 @@ This tutorial assumes that you have configured your cluster to dynamically provi
PersistentVolumes. If your cluster is not configured to do so, you
will have to manually provision three 20 GiB volumes before starting this
tutorial.
{{% /capture %}}
{{% capture objectives %}}
## {{% heading "objectives" %}}
After this tutorial, you will know the following.
- How to deploy a ZooKeeper ensemble using StatefulSet.
- How to consistently configure the ensemble using ConfigMaps.
- How to spread the deployment of ZooKeeper servers in the ensemble.
- How to use PodDisruptionBudgets to ensure service availability during planned maintenance.
{{% /capture %}}
{{% capture lessoncontent %}}
<!-- lessoncontent -->
### ZooKeeper Basics
@@ -1090,9 +1092,10 @@ node "kubernetes-node-ixsl" uncordoned
You can use `kubectl drain` in conjunction with `PodDisruptionBudgets` to ensure that your services remain available during maintenance. If drain is used to cordon nodes and evict pods prior to taking the node offline for maintenance, services that express a disruption budget will have that budget respected. You should always allocate additional capacity for critical services so that their Pods can be immediately rescheduled.
{{% /capture %}}
{{% capture cleanup %}}
## {{% heading "cleanup" %}}
- Use `kubectl uncordon` to uncordon all the nodes in your cluster.
- You will need to delete the persistent storage media for the PersistentVolumes
@@ -1100,5 +1103,5 @@ You can use `kubectl drain` in conjunction with `PodDisruptionBudgets` to ensure
storage configuration, and provisioning method, to ensure that all storage is
reclaimed.
{{% /capture %}}
@@ -1,18 +1,19 @@
---
title: Exposing an External IP Address to Access an Application in a Cluster
content_template: templates/tutorial
content_type: tutorial
weight: 10
---
{{% capture overview %}}
<!-- overview -->
This page shows how to create a Kubernetes Service object that exposes an
external IP address.
{{% /capture %}}
{{% capture prerequisites %}}
## {{% heading "prerequisites" %}}
* Install [kubectl](/docs/tasks/tools/install-kubectl/).
@@ -24,19 +25,20 @@ external IP address.
* Configure `kubectl` to communicate with your Kubernetes API server. For
instructions, see the documentation for your cloud provider.
{{% /capture %}}
{{% capture objectives %}}
## {{% heading "objectives" %}}
* Run five instances of a Hello World application.
* Create a Service object that exposes an external IP address.
* Use the Service object to access the running application.
{{% /capture %}}
{{% capture lessoncontent %}}
<!-- lessoncontent -->
## Creating a service for an application running in five pods
@@ -148,10 +150,11 @@ The preceding command creates a
Hello Kubernetes!
{{% /capture %}}
{{% capture cleanup %}}
## {{% heading "cleanup" %}}
To delete the Service, enter this command:
@@ -162,11 +165,12 @@ the Hello World application, enter this command:
kubectl delete deployment hello-world
{{% /capture %}}
{{% capture whatsnext %}}
## {{% heading "whatsnext" %}}
Learn more about
[connecting applications with services](/docs/concepts/services-networking/connect-applications-service/).
{{% /capture %}}
@@ -2,7 +2,7 @@
title: "Example: Add logging and metrics to the PHP / Redis Guestbook example"
reviewers:
- sftim
content_template: templates/tutorial
content_type: tutorial
weight: 21
card:
name: tutorials
@@ -10,7 +10,7 @@ card:
title: "Example: Add logging and metrics to the PHP / Redis Guestbook example"
---
{{% capture overview %}}
<!-- overview -->
This tutorial builds upon the [PHP Guestbook with Redis](/docs/tutorials/stateless-application/guestbook) tutorial. Lightweight log, metric, and network data open source shippers, or *Beats*, from Elastic are deployed in the same Kubernetes cluster as the guestbook. The Beats collect, parse, and index the data into Elasticsearch so that you can view and analyze the resulting operational information in Kibana. This example consists of the following components:
* A running instance of the [PHP Guestbook with Redis tutorial](/docs/tutorials/stateless-application/guestbook)
@@ -19,17 +19,19 @@ This tutorial builds upon the [PHP Guestbook with Redis](/docs/tutorials/statele
* Metricbeat
* Packetbeat
{{% /capture %}}
{{% capture objectives %}}
## {{% heading "objectives" %}}
* Start up the PHP Guestbook with Redis.
* Install kube-state-metrics.
* Create a Kubernetes secret.
* Deploy the Beats.
* View dashboards of your logs and metrics.
{{% /capture %}}
{{% capture prerequisites %}}
## {{% heading "prerequisites" %}}
{{< include "task-tutorial-prereqs.md" >}}
{{< version-check >}}
@@ -40,9 +42,9 @@ Additionally you need:
* A running Elasticsearch and Kibana deployment. You can use [Elasticsearch Service in Elastic Cloud](https://cloud.elastic.co), run the [download files](https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-elastic-stack.html) on your workstation or servers, or the [Elastic Helm Charts](https://github.com/elastic/helm-charts).
{{% /capture %}}
{{% capture lessoncontent %}}
<!-- lessoncontent -->
## Start up the PHP Guestbook with Redis
This tutorial builds on the [PHP Guestbook with Redis](/docs/tutorials/stateless-application/guestbook) tutorial. If you have the guestbook application running, then you can monitor that. If you do not have it running then follow the instructions to deploy the guestbook and do not perform the **Cleanup** steps. Come back to this page when you have the guestbook running.
@@ -366,9 +368,10 @@ kubectl scale --replicas=3 deployment/frontend
See the screenshot, add the indicated filters and then add the columns to the view. You can see the ScalingReplicaSet entry that is marked, following from there to the top of the list of events shows the image being pulled, the volumes mounted, the pod starting, etc.
![Kibana Discover](https://raw.githubusercontent.com/elastic/examples/master/beats-k8s-send-anywhere/scaling-up.png)
{{% /capture %}}
{{% capture cleanup %}}
## {{% heading "cleanup" %}}
Deleting the Deployments and Services also deletes any running Pods. Use labels to delete multiple resources with one command.
1. Run the following commands to delete all Pods, Deployments, and Services.
@@ -396,11 +399,11 @@ Deleting the Deployments and Services also deletes any running Pods. Use labels
No resources found.
```
{{% /capture %}}
{{% capture whatsnext %}}
## {{% heading "whatsnext" %}}
* Learn about [tools for monitoring resources](/docs/tasks/debug-application-cluster/resource-usage-monitoring/)
* Read more about [logging architecture](/docs/concepts/cluster-administration/logging/)
* Read more about [application introspection and debugging](/docs/tasks/debug-application-cluster/)
* Read more about [troubleshoot applications](/docs/tasks/debug-application-cluster/resource-usage-monitoring/)
{{% /capture %}}
@@ -2,7 +2,7 @@
title: "Example: Deploying PHP Guestbook application with Redis"
reviewers:
- ahmetb
content_template: templates/tutorial
content_type: tutorial
weight: 20
card:
name: tutorials
@@ -10,32 +10,34 @@ card:
title: "Stateless Example: PHP Guestbook with Redis"
---
{{% capture overview %}}
<!-- overview -->
This tutorial shows you how to build and deploy a simple, multi-tier web application using Kubernetes and [Docker](https://www.docker.com/). This example consists of the following components:
* A single-instance [Redis](https://redis.io/) master to store guestbook entries
* Multiple [replicated Redis](https://redis.io/topics/replication) instances to serve reads
* Multiple web frontend instances
{{% /capture %}}
{{% capture objectives %}}
## {{% heading "objectives" %}}
* Start up a Redis master.
* Start up Redis slaves.
* Start up the guestbook frontend.
* Expose and view the Frontend Service.
* Clean up.
{{% /capture %}}
{{% capture prerequisites %}}
## {{% heading "prerequisites" %}}
{{< include "task-tutorial-prereqs.md" >}}
{{< version-check >}}
{{% /capture %}}
{{% capture lessoncontent %}}
<!-- lessoncontent -->
## Start up the Redis Master
@@ -321,9 +323,10 @@ Scaling up or down is easy because your servers are defined as a Service that us
redis-slave-2005841000-phfv9 1/1 Running 0 1h
```
{{% /capture %}}
{{% capture cleanup %}}
## {{% heading "cleanup" %}}
Deleting the Deployments and Services also deletes any running Pods. Use labels to delete multiple resources with one command.
1. Run the following commands to delete all Pods, Deployments, and Services.
@@ -358,12 +361,13 @@ Deleting the Deployments and Services also deletes any running Pods. Use labels
No resources found.
```
{{% /capture %}}
{{% capture whatsnext %}}
## {{% heading "whatsnext" %}}
* Add [ELK logging and monitoring](../guestbook-logs-metrics-with-elk/) to your Guestbook application
* Complete the [Kubernetes Basics](/docs/tutorials/kubernetes-basics/) Interactive Tutorials
* Use Kubernetes to create a blog using [Persistent Volumes for MySQL and Wordpress](/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/#visit-your-new-wordpress-blog)
* Read more about [connecting applications](/docs/concepts/services-networking/connect-applications-service/)
* Read more about [Managing Resources](/docs/concepts/cluster-administration/manage-deployment/#using-labels-effectively)
{{% /capture %}}