parent
							
								
									e1f67ff31b
								
							
						
					
					
						commit
						1524418100
					
				|  | @ -31,28 +31,29 @@ You should already have turned up a Kubernetes cluster. To get the most of this | |||
| 
 | ||||
| The Celery task queue will need to communicate with the RabbitMQ broker. RabbitMQ will eventually appear on a separate pod, but since pods are ephemeral we need a service that can transparently route requests to RabbitMQ. | ||||
| 
 | ||||
| Use the file `examples/celery-rabbitmq/rabbitmq-service.json`: | ||||
| Use the file `examples/celery-rabbitmq/rabbitmq-service.yaml`: | ||||
| 
 | ||||
| ```js | ||||
| { | ||||
|   "id": "rabbitmq-service", | ||||
|   "kind": "Service", | ||||
|   "apiVersion": "v1beta1", | ||||
|   "port": 5672, | ||||
|   "containerPort": 5672, | ||||
|   "selector": { | ||||
|     "app": "taskQueue" | ||||
|   }, | ||||
|   "labels": { | ||||
|     "name": "rabbitmq-service" | ||||
|   } | ||||
| } | ||||
| ```yaml | ||||
| apiVersion: v1beta3 | ||||
| kind: Service | ||||
| metadata: | ||||
|   labels: | ||||
|     name: rabbitmq | ||||
|   name: rabbitmq-service | ||||
| spec: | ||||
|   ports: | ||||
|   - port: 5672 | ||||
|     protocol: TCP | ||||
|     targetPort: 5672 | ||||
|   selector: | ||||
|     app: taskQueue | ||||
|     component: rabbitmq | ||||
| ``` | ||||
| 
 | ||||
| To start the service, run: | ||||
| 
 | ||||
| ```shell | ||||
| $ kubectl create -f examples/celery-rabbitmq/rabbitmq-service.json | ||||
| $ kubectl create -f examples/celery-rabbitmq/rabbitmq-service.yaml | ||||
| ``` | ||||
| 
 | ||||
| **NOTE**: If you're running Kubernetes from source, you can use `cluster/kubectl.sh` instead of `kubectl`. | ||||
|  | @ -62,81 +63,71 @@ This service allows other pods to connect to the rabbitmq. To them, it will be s | |||
| 
 | ||||
| ## Step 2: Fire up RabbitMQ | ||||
| 
 | ||||
| A RabbitMQ broker can be turned up using the file `examples/celery-rabbitmq/rabbitmq-controller.json`: | ||||
| A RabbitMQ broker can be turned up using the file `examples/celery-rabbitmq/rabbitmq-controller.yaml`: | ||||
| 
 | ||||
| ```js | ||||
| { | ||||
|   "id": "rabbitmq-controller", | ||||
|   "kind": "ReplicationController", | ||||
|   "apiVersion": "v1beta1", | ||||
|   "desiredState": { | ||||
|     "replicas": 1, | ||||
|     "replicaSelector": {"name": "rabbitmq"}, | ||||
|     "podTemplate": { | ||||
|       "desiredState": { | ||||
|         "manifest": { | ||||
|           "version": "v1beta1", | ||||
|           "id": "rabbitmq", | ||||
|           "containers": [{ | ||||
|             "name": "rabbitmq", | ||||
|             "image": "library/rabbitmq", | ||||
|             "cpu": 100, | ||||
|             "ports": [{"containerPort": 5672, "hostPort": 5672}] | ||||
|           }] | ||||
|         } | ||||
|       }, | ||||
|       "labels": { | ||||
|         "name": "rabbitmq", | ||||
|         "app": "taskQueue" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "labels": { | ||||
|     "name": "rabbitmq" | ||||
|   } | ||||
| } | ||||
| ```yaml | ||||
| apiVersion: v1beta3 | ||||
| kind: ReplicationController | ||||
| metadata: | ||||
|   labels: | ||||
|     name: rabbitmq | ||||
|   name: rabbitmq-controller | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     component: rabbitmq | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: taskQueue | ||||
|         component: rabbitmq | ||||
|     spec: | ||||
|       containers: | ||||
|       - image: rabbitmq | ||||
|         name: rabbitmq | ||||
|         ports: | ||||
|         - containerPort: 5672 | ||||
|           protocol: TCP | ||||
|         resources: | ||||
|           limits: | ||||
|             cpu: 100m | ||||
| ``` | ||||
| 
 | ||||
| Running `$ kubectl create -f examples/celery-rabbitmq/rabbitmq-controller.json` brings up a replication controller that ensures one pod exists which is running a RabbitMQ instance. | ||||
| Running `$ kubectl create -f examples/celery-rabbitmq/rabbitmq-controller.yaml` brings up a replication controller that ensures one pod exists which is running a RabbitMQ instance. | ||||
| 
 | ||||
| Note that bringing up the pod includes pulling down a docker image, which may take a few moments. This applies to all other pods in this example. | ||||
| 
 | ||||
| 
 | ||||
| ## Step 3: Fire up Celery | ||||
| 
 | ||||
| Bringing up the celery worker is done by running `$ kubectl create -f examples/celery-rabbitmq/celery-controller.json`, which contains this: | ||||
| Bringing up the celery worker is done by running `$ kubectl create -f examples/celery-rabbitmq/celery-controller.yaml`, which contains this: | ||||
| 
 | ||||
| ```js | ||||
| { | ||||
|   "id": "celery-controller", | ||||
|   "kind": "ReplicationController", | ||||
|   "apiVersion": "v1beta1", | ||||
|   "desiredState": { | ||||
|     "replicas": 1, | ||||
|     "replicaSelector": {"name": "celery"}, | ||||
|     "podTemplate": { | ||||
|       "desiredState": { | ||||
|         "manifest": { | ||||
|           "version": "v1beta1", | ||||
|           "id": "celery", | ||||
|           "containers": [{ | ||||
|             "name": "celery", | ||||
|             "image": "endocode/celery-app-add", | ||||
|             "cpu": 100, | ||||
|             "ports": [{"containerPort": 5672, "hostPort": 5672}] | ||||
|           }] | ||||
|         } | ||||
|       }, | ||||
|       "labels": { | ||||
|         "name": "celery", | ||||
|         "app": "taskQueue" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "labels": { | ||||
|     "name": "celery" | ||||
|   } | ||||
| } | ||||
| ```yaml | ||||
| apiVersion: v1beta3 | ||||
| kind: ReplicationController | ||||
| metadata: | ||||
|   labels: | ||||
|     name: celery | ||||
|   name: celery-controller | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     component: celery | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: taskQueue | ||||
|         component: celery | ||||
|     spec: | ||||
|       containers: | ||||
|       - image: endocode/celery-app-add | ||||
|         name: celery | ||||
|         ports: | ||||
|         - containerPort: 5672 | ||||
|           protocol: TCP | ||||
|         resources: | ||||
|           limits: | ||||
|             cpu: 100m | ||||
| ``` | ||||
| 
 | ||||
| There are several things to point out here... | ||||
|  | @ -187,39 +178,35 @@ The question now is, how do you see what's going on? | |||
| 
 | ||||
| Flower is a web-based tool for monitoring and administrating Celery clusters. By connecting to the node that contains Celery, you can see the behaviour of all the workers and their tasks in real-time. | ||||
| 
 | ||||
| To bring up the frontend, run this command `$ kubectl create -f examples/celery-rabbitmq/celery-controller.json`. This controller is defined as so: | ||||
| To bring up the frontend, run this command `$ kubectl create -f examples/celery-rabbitmq/flower-controller.yaml`. This controller is defined as so: | ||||
| 
 | ||||
| ```js | ||||
| { | ||||
|   "id": "flower-controller", | ||||
|   "kind": "ReplicationController", | ||||
|   "apiVersion": "v1beta1", | ||||
|   "desiredState": { | ||||
|     "replicas": 1, | ||||
|     "replicaSelector": {"name": "flower"}, | ||||
|     "podTemplate": { | ||||
|       "desiredState": { | ||||
|         "manifest": { | ||||
|           "version": "v1beta1", | ||||
|           "id": "flower", | ||||
|           "containers": [{ | ||||
|             "name": "flower", | ||||
|             "image": "endocode/flower", | ||||
|             "cpu": 100, | ||||
|             "ports": [{"containerPort": 5555, "hostPort": 5555}] | ||||
|           }] | ||||
|         } | ||||
|       }, | ||||
|       "labels": { | ||||
|         "name": "flower", | ||||
|         "app": "taskQueue" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "labels": { | ||||
|     "name": "flower" | ||||
|   } | ||||
| } | ||||
| ```yaml | ||||
| apiVersion: v1beta3 | ||||
| kind: ReplicationController | ||||
| metadata: | ||||
|   labels: | ||||
|     name: flower | ||||
|   name: flower-controller | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     component: flower | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: taskQueue | ||||
|         component: flower | ||||
|     spec: | ||||
|       containers: | ||||
|       - image: endocode/flower | ||||
|         name: flower | ||||
|         ports: | ||||
|         - containerPort: 5555 | ||||
|           hostPort: 5555 | ||||
|           protocol: TCP | ||||
|         resources: | ||||
|           limits: | ||||
|             cpu: 100m | ||||
| ``` | ||||
| 
 | ||||
| This will bring up a new pod with Flower installed and port 5555 (Flower's default port) exposed. This image uses the following command to start Flower: | ||||
|  |  | |||
|  | @ -1,31 +0,0 @@ | |||
| { | ||||
|   "id": "celery-controller", | ||||
|   "kind": "ReplicationController", | ||||
|   "apiVersion": "v1beta1", | ||||
|   "desiredState": { | ||||
|     "replicas": 1, | ||||
|     "replicaSelector": {"name": "celery"}, | ||||
|     "podTemplate": { | ||||
|       "desiredState": { | ||||
|         "manifest": { | ||||
|           "version": "v1beta1", | ||||
|           "id": "celery", | ||||
|           "containers": [{ | ||||
|             "name": "celery", | ||||
|             "image": "endocode/celery-app-add", | ||||
|             "cpu": 100, | ||||
|             "ports": [{"containerPort": 5672, "hostPort": 5672}] | ||||
|           }] | ||||
|         } | ||||
|       }, | ||||
|       "labels": { | ||||
|         "name": "celery", | ||||
|         "app": "taskQueue" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "labels": { | ||||
|     "name": "celery" | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | @ -0,0 +1,25 @@ | |||
| apiVersion: v1beta3 | ||||
| kind: ReplicationController | ||||
| metadata: | ||||
|   labels: | ||||
|     name: celery | ||||
|   name: celery-controller | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     component: celery | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: taskQueue | ||||
|         component: celery | ||||
|     spec: | ||||
|       containers: | ||||
|       - image: endocode/celery-app-add | ||||
|         name: celery | ||||
|         ports: | ||||
|         - containerPort: 5672 | ||||
|           protocol: TCP | ||||
|         resources: | ||||
|           limits: | ||||
|             cpu: 100m | ||||
|  | @ -1,31 +0,0 @@ | |||
| { | ||||
|   "id": "flower-controller", | ||||
|   "kind": "ReplicationController", | ||||
|   "apiVersion": "v1beta1", | ||||
|   "desiredState": { | ||||
|     "replicas": 1, | ||||
|     "replicaSelector": {"name": "flower"}, | ||||
|     "podTemplate": { | ||||
|       "desiredState": { | ||||
|         "manifest": { | ||||
|           "version": "v1beta1", | ||||
|           "id": "flower", | ||||
|           "containers": [{ | ||||
|             "name": "flower", | ||||
|             "image": "endocode/flower", | ||||
|             "cpu": 100, | ||||
|             "ports": [{"containerPort": 5555, "hostPort": 5555}] | ||||
|           }] | ||||
|         } | ||||
|       }, | ||||
|       "labels": { | ||||
|         "name": "flower", | ||||
|         "app": "taskQueue" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "labels": { | ||||
|     "name": "flower" | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | @ -0,0 +1,26 @@ | |||
| apiVersion: v1beta3 | ||||
| kind: ReplicationController | ||||
| metadata: | ||||
|   labels: | ||||
|     name: flower | ||||
|   name: flower-controller | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     component: flower | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: taskQueue | ||||
|         component: flower | ||||
|     spec: | ||||
|       containers: | ||||
|       - image: endocode/flower | ||||
|         name: flower | ||||
|         ports: | ||||
|         - containerPort: 5555 | ||||
|           hostPort: 5555 | ||||
|           protocol: TCP | ||||
|         resources: | ||||
|           limits: | ||||
|             cpu: 100m | ||||
|  | @ -1,31 +0,0 @@ | |||
| { | ||||
|   "id": "rabbitmq-controller", | ||||
|   "kind": "ReplicationController", | ||||
|   "apiVersion": "v1beta1", | ||||
|   "desiredState": { | ||||
|     "replicas": 1, | ||||
|     "replicaSelector": {"name": "rabbitmq"}, | ||||
|     "podTemplate": { | ||||
|       "desiredState": { | ||||
|         "manifest": { | ||||
|           "version": "v1beta1", | ||||
|           "id": "rabbitmq", | ||||
|           "containers": [{ | ||||
|             "name": "rabbitmq", | ||||
|             "image": "library/rabbitmq", | ||||
|             "cpu": 100, | ||||
|             "ports": [{"containerPort": 5672, "hostPort": 5672}] | ||||
|           }] | ||||
|         } | ||||
|       }, | ||||
|       "labels": { | ||||
|         "name": "rabbitmq", | ||||
|         "app": "taskQueue" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "labels": { | ||||
|     "name": "rabbitmq" | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | @ -0,0 +1,25 @@ | |||
| apiVersion: v1beta3 | ||||
| kind: ReplicationController | ||||
| metadata: | ||||
|   labels: | ||||
|     name: rabbitmq | ||||
|   name: rabbitmq-controller | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     component: rabbitmq | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: taskQueue | ||||
|         component: rabbitmq | ||||
|     spec: | ||||
|       containers: | ||||
|       - image: rabbitmq | ||||
|         name: rabbitmq | ||||
|         ports: | ||||
|         - containerPort: 5672 | ||||
|           protocol: TCP | ||||
|         resources: | ||||
|           limits: | ||||
|             cpu: 100m | ||||
|  | @ -1,13 +0,0 @@ | |||
| { | ||||
|   "id": "rabbitmq-service", | ||||
|   "kind": "Service", | ||||
|   "apiVersion": "v1beta1", | ||||
|   "port": 5672, | ||||
|   "containerPort": 5672, | ||||
|   "selector": { | ||||
|     "app": "taskQueue" | ||||
|   }, | ||||
|   "labels": { | ||||
|     "name": "rabbitmq-service" | ||||
|   } | ||||
| } | ||||
|  | @ -0,0 +1,14 @@ | |||
| apiVersion: v1beta3 | ||||
| kind: Service | ||||
| metadata: | ||||
|   labels: | ||||
|     name: rabbitmq | ||||
|   name: rabbitmq-service | ||||
| spec: | ||||
|   ports: | ||||
|   - port: 5672 | ||||
|     protocol: TCP | ||||
|     targetPort: 5672 | ||||
|   selector: | ||||
|     app: taskQueue | ||||
|     component: rabbitmq | ||||
		Loading…
	
		Reference in New Issue