Added inline links to "services" "pods" "namespaces" and "replication controllers" (using relative linking ../../folder/filename.md)
This commit is contained in:
		
							parent
							
								
									a4f285124e
								
							
						
					
					
						commit
						de564f4fc2
					
				| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
 | 
			
		||||
The following document describes the development of a _cloud native_ [Cassandra](http://cassandra.apache.org/) deployment on Kubernetes.  When we say _cloud native_ we mean an application which understands that it is running within a cluster manager, and uses this cluster management infrastructure to help implement the application.  In particular, in this instance, a custom Cassandra ```SeedProvider``` is used to enable Cassandra to dynamically discover new Cassandra nodes as they join the cluster.
 | 
			
		||||
 | 
			
		||||
This document also attempts to describe the core components of Kubernetes, _Pods_, _Services_ and _Replication Controllers_.
 | 
			
		||||
This document also attempts to describe the core components of Kubernetes: _Pods_, _Services_, and _Replication Controllers_.
 | 
			
		||||
 | 
			
		||||
### Prerequisites
 | 
			
		||||
This example assumes that you have a Kubernetes cluster installed and running, and that you have installed the ```kubectl``` command line tool somewhere in your path.  Please see the [getting started](https://github.com/GoogleCloudPlatform/kubernetes/tree/master/docs/getting-started-guides) for installation instructions for your platform.
 | 
			
		||||
| 
						 | 
				
			
			@ -11,7 +11,7 @@ This example assumes that you have a Kubernetes cluster installed and running, a
 | 
			
		|||
This is a somewhat long tutorial.  If you want to jump straight to the "do it now" commands, please see the [tl; dr](#tl-dr) at the end.
 | 
			
		||||
 | 
			
		||||
### Simple Single Pod Cassandra Node
 | 
			
		||||
In Kubernetes, the atomic unit of an application is a [_Pod_](http://docs.k8s.io/pods.md).  A Pod is one or more containers that _must_ be scheduled onto the same host.  All containers in a pod share a network namespace, and may optionally share mounted volumes.  In this simple case, we define a single container running Cassandra for our pod:
 | 
			
		||||
In Kubernetes, the atomic unit of an application is a [_Pod_](../../docs/pods.md).  A Pod is one or more containers that _must_ be scheduled onto the same host.  All containers in a pod share a network namespace, and may optionally share mounted volumes.  In this simple case, we define a single container running Cassandra for our pod:
 | 
			
		||||
 | 
			
		||||
```yaml
 | 
			
		||||
apiVersion: v1beta3
 | 
			
		||||
| 
						 | 
				
			
			@ -70,7 +70,7 @@ cassandra   10.244.3.3                                            kubernetes-min
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
### Adding a Cassandra Service
 | 
			
		||||
In Kubernetes a _Service_ describes a set of Pods that perform the same task.  For example, the set of nodes in a Cassandra cluster, or even the single node we created above.  An important use for a Service is to create a load balancer which distributes traffic across members of the set.  But a _Service_ can also be used as a standing query which makes a dynamically changing set of Pods (or the single Pod we've already created) available via the Kubernetes API.  This is the way that we use initially use Services with Cassandra.
 | 
			
		||||
In Kubernetes a _[Service](../../docs/services.md)_ describes a set of Pods that perform the same task.  For example, the set of nodes in a Cassandra cluster, or even the single node we created above.  An important use for a Service is to create a load balancer which distributes traffic across members of the set.  But a _Service_ can also be used as a standing query which makes a dynamically changing set of Pods (or the single Pod we've already created) available via the Kubernetes API.  This is the way that we use initially use Services with Cassandra.
 | 
			
		||||
 | 
			
		||||
Here is the service description:
 | 
			
		||||
```yaml
 | 
			
		||||
| 
						 | 
				
			
			@ -127,7 +127,7 @@ You can see that the _Service_ has found the pod we created in step one.
 | 
			
		|||
### Adding replicated nodes
 | 
			
		||||
Of course, a single node cluster isn't particularly interesting.  The real power of Kubernetes and Cassandra lies in easily building a replicated, scalable Cassandra cluster.
 | 
			
		||||
 | 
			
		||||
In Kubernetes a _Replication Controller_ is responsible for replicating sets of identical pods.  Like a _Service_ it has a selector query which identifies the members of it's set.  Unlike a _Service_ it also has a desired number of replicas, and it will create or delete _Pods_ to ensure that the number of _Pods_ matches up with it's desired state.
 | 
			
		||||
In Kubernetes a _[Replication Controller](../../docs/replication-controller.md)_ is responsible for replicating sets of identical pods.  Like a _Service_ it has a selector query which identifies the members of it's set.  Unlike a _Service_ it also has a desired number of replicas, and it will create or delete _Pods_ to ensure that the number of _Pods_ matches up with it's desired state.
 | 
			
		||||
 | 
			
		||||
Replication Controllers will "adopt" existing pods that match their selector query, so let's create a Replication Controller with a single replica to adopt our existing Cassandra Pod.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ $ hack/dev-build-and-up.sh
 | 
			
		|||
 | 
			
		||||
### Step One: Create two namespaces
 | 
			
		||||
 | 
			
		||||
We'll see how cluster DNS works across multiple namespaces, first we need to create two namespaces:
 | 
			
		||||
We'll see how cluster DNS works across multiple [namespaces](../../docs/namespaces.md), first we need to create two namespaces:
 | 
			
		||||
 | 
			
		||||
```shell
 | 
			
		||||
$ cluster/kubectl.sh create -f examples/cluster-dns/namespace-dev.yaml
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ $ cluster/kubectl.sh config set-context prod --namespace=production --cluster=${
 | 
			
		|||
 | 
			
		||||
### Step Two: Create backend replication controller in each namespace
 | 
			
		||||
 | 
			
		||||
Use the file [`examples/cluster-dns/dns-backend-rc.yaml`](dns-backend-rc.yaml) to create a backend server replication controller in each namespace.
 | 
			
		||||
Use the file [`examples/cluster-dns/dns-backend-rc.yaml`](dns-backend-rc.yaml) to create a backend server [replication controller](../../docs/replication-controller.md) in each namespace.
 | 
			
		||||
 | 
			
		||||
```shell
 | 
			
		||||
$ cluster/kubectl.sh config use-context dev
 | 
			
		||||
| 
						 | 
				
			
			@ -67,7 +67,7 @@ dns-backend   dns-backend    ddysher/dns-backend   name=dns-backend   1
 | 
			
		|||
### Step Three: Create backend service
 | 
			
		||||
 | 
			
		||||
Use the file [`examples/cluster-dns/dns-backend-service.yaml`](dns-backend-service.yaml) to create
 | 
			
		||||
a service for the backend server.
 | 
			
		||||
a [service](../../docs/services.md) for the backend server.
 | 
			
		||||
 | 
			
		||||
```shell
 | 
			
		||||
$ cluster/kubectl.sh config use-context dev
 | 
			
		||||
| 
						 | 
				
			
			@ -94,7 +94,7 @@ dns-backend   <none>    name=dns-backend   10.0.35.246   8000/TCP
 | 
			
		|||
 | 
			
		||||
### Step Four: Create client pod in one namespace
 | 
			
		||||
 | 
			
		||||
Use the file [`examples/cluster-dns/dns-frontend-pod.yaml`](dns-frontend-pod.yaml) to create a client pod in dev namespace. The client pod will make a connection to backend and exit. Specifically, it tries to connect to address `http://dns-backend.development.kubernetes.local:8000`.
 | 
			
		||||
Use the file [`examples/cluster-dns/dns-frontend-pod.yaml`](dns-frontend-pod.yaml) to create a client [pod](../../docs/pods.md) in dev namespace. The client pod will make a connection to backend and exit. Specifically, it tries to connect to address `http://dns-backend.development.kubernetes.local:8000`.
 | 
			
		||||
 | 
			
		||||
```shell
 | 
			
		||||
$ cluster/kubectl.sh config use-context dev
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,9 +18,9 @@ If you are running from source, replace commands such as `kubectl` below with ca
 | 
			
		|||
 | 
			
		||||
Note: This redis-master is *not* highly available.  Making it highly available would be a very interesting, but intricate exercise - redis doesn't actually support multi-master deployments at the time of this writing, so high availability would be a somewhat tricky thing to implement, and might involve periodic serialization to disk, and so on.
 | 
			
		||||
 | 
			
		||||
Use (or just create) the file `examples/guestbook/redis-master-controller.json` which describes a single pod running a redis key-value server in a container:
 | 
			
		||||
Use (or just create) the file `examples/guestbook/redis-master-controller.json` which describes a single [pod](../../docs/pods.md) running a redis key-value server in a container:
 | 
			
		||||
 | 
			
		||||
Note that, although the redis server runs just with a single replica, we use replication controller to enforce that exactly one pod keeps running (e.g. in a event of node going down, the replication controller will ensure that the redis master gets restarted on a healthy node).   This could result in data loss.
 | 
			
		||||
Note that, although the redis server runs just with a single replica, we use [replication controller](../../docs/replication-controller.md) to enforce that exactly one pod keeps running (e.g. in a event of node going down, the replication controller will ensure that the redis master gets restarted on a healthy node).   This could result in data loss.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
| 
						 | 
				
			
			@ -99,7 +99,7 @@ CONTAINER ID        IMAGE                                  COMMAND
 | 
			
		|||
(Note that initial `docker pull` may take a few minutes, depending on network conditions. The pods will be reported as pending while the image is being downloaded.) 
 | 
			
		||||
 | 
			
		||||
### Step Two: Fire up the master service
 | 
			
		||||
A Kubernetes 'service' is a named load balancer that proxies traffic to *one or more* containers. This is done using the *labels* metadata which we defined in the redis-master pod above.  As mentioned, in redis there is only one master, but we nevertheless still want to create a service for it.  Why?  Because it gives us a deterministic way to route to the single master using an elastic IP.
 | 
			
		||||
A Kubernetes '[service](../../docs/services.md)' is a named load balancer that proxies traffic to *one or more* containers. This is done using the *labels* metadata which we defined in the redis-master pod above.  As mentioned, in redis there is only one master, but we nevertheless still want to create a service for it.  Why?  Because it gives us a deterministic way to route to the single master using an elastic IP.
 | 
			
		||||
 | 
			
		||||
The services in a Kubernetes cluster are discoverable inside other containers via environment variables.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue