236 lines
6.5 KiB
Markdown
236 lines
6.5 KiB
Markdown
# DEIS on Openstack with Terraform
|
|
|
|
Provision a DEIS cluster with [Terraform](https://www.terraform.io) on
|
|
Openstack.
|
|
|
|
## Status
|
|
|
|
This will install a DEIS cluster on an Openstack Cloud. It is tested on a
|
|
OpenStack Cloud provided by [BlueBox](https://www.blueboxcloud.com/) and
|
|
should work on most modern installs of OpenStack that support the basic
|
|
services.
|
|
|
|
## Requirements
|
|
|
|
- [Install Terraform](https://www.terraform.io/intro/getting-started/install.html)
|
|
- [Install DEIS CLI](http://docs.deis.io/en/latest/using_deis/install-client/)
|
|
- ]Upload a CoreOS](https://coreos.com/os/docs/latest/booting-on-openstack.html) image to glance and remember the image name.
|
|
|
|
## Terraform
|
|
|
|
Terraform will be used to provision all of the OpenStack resources required to
|
|
run Docker Swarm. It is also used to deploy and provision the software
|
|
requirements.
|
|
|
|
### Prep
|
|
|
|
#### OpenStack
|
|
|
|
Ensure your OpenStack credentials are loaded in environment variables. This is
|
|
how I do it:
|
|
|
|
```
|
|
$ source ~/.stackrc
|
|
```
|
|
|
|
You will need two networks before installing, an internal network and
|
|
an external (floating IP Pool) network. The internet network can be shared as
|
|
we use security groups to provide network segregation. Due to the many
|
|
differences between OpenStack installs the Terraform does not attempt to create
|
|
these for you.
|
|
|
|
By default Terraform will expect that your networks are called `internal` and
|
|
`external`. You can change this by altering the Terraform variables `network_name` and `floatingip_pool`.
|
|
|
|
You can also change the number of instances `cluster_size` (default `3`); the
|
|
path to your public key `public_key_path` (default `~/.ssh/id_rsa.pub`); and
|
|
the flavor `flavor` to use (default `m1.medium`).
|
|
|
|
All OpenStack resources will use the Terraform variable `cluster_name` (
|
|
default `example`) in their name to make it easier to track. For example the
|
|
first compute resource will be named `example-deis-1`.
|
|
|
|
#### Terraform
|
|
|
|
Ensure your local ssh-agent is running and your ssh key has been added. This
|
|
step is required by the terraform provisioner:
|
|
|
|
```
|
|
$ eval $(ssh-agent -s)
|
|
$ ssh-add ~/.ssh/id_rsa
|
|
```
|
|
|
|
|
|
Ensure that you have your Openstack credentials loaded into Terraform
|
|
environment variables. Likely via a command similar to:
|
|
|
|
```
|
|
$ export TF_VAR_username=${OS_USERNAME}
|
|
$ export TF_VAR_password=${OS_PASSWORD}
|
|
$ export TF_VAR_tenant=${OS_TENANT_NAME}
|
|
$ export TF_VAR_auth_url=${OS_AUTH_URL}
|
|
```
|
|
|
|
Terraform expects an SSH keypair to exist `keys/deis` and `keys/deis.pub`
|
|
which it will upload to the instances so they can communicate with eachother
|
|
over SSH, if this keypair doesn't exist it will attempt to create them.
|
|
|
|
Terraform will attempt to fetch a _Discovery URL_ for etcd. If you want to
|
|
provide your own write it to the text file `files/discovery_url` and set the
|
|
Terraform variable `generate_discovery_url` to `0`.
|
|
|
|
You can also change the version of DEIS to install by setting `deisctl_version`
|
|
and you can set `deis_domain` if you have a custom URL (otherwise it will use
|
|
`.xip.io`).
|
|
|
|
|
|
# Provision a Deis Cluster on OpenStack
|
|
|
|
With all our variables set we can go ahead and provision our cluster adding any
|
|
extra variables you wish to pass through like this:
|
|
|
|
_The steps that install and start deis can take quite some time, be patient._
|
|
|
|
```
|
|
$ terraform apply \
|
|
-var "image=coreos-alpha-884-0-0"
|
|
...
|
|
...
|
|
Apply complete! Resources: 12 added, 0 changed, 0 destroyed.
|
|
|
|
The state of your infrastructure has been saved to the path
|
|
below. This state is required to modify and destroy your
|
|
infrastructure, so keep it safe. To inspect the complete state
|
|
use the `terraform show` command.
|
|
|
|
State path: terraform.tfstate
|
|
|
|
Outputs:
|
|
|
|
msg = Your hosts are ready to go! Continue following the documentation to install and start Deis. Your hosts are: x.x.x.x, y.y.y.y, z.z.z.z
|
|
register = Run the following to register your first [admin] user: $ deis register http://deis.x.x.x.x.xip.io
|
|
|
|
```
|
|
|
|
# Create first user and deploy a demonstration app:
|
|
|
|
Create admin user:
|
|
|
|
```
|
|
$ deis register http://deis.x.x.x.x.xip.io
|
|
username: admin
|
|
password:
|
|
password (confirm):
|
|
email: admin@example.com
|
|
Registered admin
|
|
upgrading.
|
|
Logged in as admin
|
|
```
|
|
|
|
Upload a SSH key:
|
|
|
|
```
|
|
$ deis keys:add ~/.ssh/id_rsa.pub
|
|
Uploading id_rsa.pub to deis... done
|
|
```
|
|
|
|
Deploy an example application:
|
|
|
|
```
|
|
$ git clone https://github.com/deis/example-python-flask.git
|
|
$ cd example-python-flask
|
|
$ deis create
|
|
Creating Application... o..done, created hungry-knapsack
|
|
|
|
$ git push deis master
|
|
Counting objects: 98, done.
|
|
Delta compression using up to 8 threads.
|
|
Compressing objects: 100% (88/88), done.
|
|
Writing objects: 100% (98/98), 22.55 KiB | 0 bytes/s, done.
|
|
Total 98 (delta 38), reused 0 (delta 0)
|
|
-----> Python app detected
|
|
-----> Installing runtime (python-2.7.10)
|
|
-----> Installing dependencies with pip
|
|
...
|
|
-----> Discovering process types
|
|
-----> Compiled slug size is 37M
|
|
-----> Building Docker image
|
|
remote: Sending build context to Docker daemon 38.33 MB
|
|
...
|
|
Step 1 : ENV GIT_SHA 774eded22b5bab907c89a29b100ccc7f2423b729
|
|
---> Running in 75274e449a86
|
|
---> 3ec06b68ed87
|
|
Removing intermediate container 75274e449a86
|
|
Successfully built 3ec06b68ed87
|
|
-----> Pushing image to private registry
|
|
-----> Launching...
|
|
done, hungry-knapsack:v2 deployed to Deis
|
|
http://hungry-knapsack.x.x.x.x.xip.io
|
|
To learn more, use `deis help` or visit http://deis.io
|
|
To ssh://git@deis.x.x.x.x.xip.io:2222/hungry-knapsack.git
|
|
* [new branch] master -> master
|
|
|
|
```
|
|
|
|
Test that it works:
|
|
|
|
```
|
|
$ curl http://hungry-knapsack.x.x.x.x.xip.io/
|
|
Powered by Deis
|
|
```
|
|
|
|
Scale it up:
|
|
|
|
```
|
|
$ deis scale web=3
|
|
Scaling processes... but first, coffee!
|
|
..o
|
|
=== hungry-knapsack Processes
|
|
--- web:
|
|
web.1 up (v2)
|
|
web.2 up (v2)
|
|
web.3 up (v2)
|
|
$ curl http://hungry-knapsack.x.x.x.x.xip.io/
|
|
Powered by Deis
|
|
```
|
|
|
|
Configure it:
|
|
|
|
```
|
|
$ deis config:set POWERED_BY=OpenStack
|
|
Creating config... ..o
|
|
done, v3
|
|
=== hungry-knapsack Config
|
|
POWERED_BY OpenStack
|
|
|
|
$ curl http://hungry-knapsack.x.x.x.x.xip.io/
|
|
Powered by OpenStack
|
|
```
|
|
|
|
Destroy it:
|
|
|
|
```
|
|
$ deis destroy
|
|
! WARNING: Potentially Destructive Action
|
|
! This command will destroy the application: hungry-knapsack
|
|
! To proceed, type "hungry-knapsack" or re-run this command with --confirm=hungry-knapsack
|
|
> hungry-knapsack
|
|
Destroying hungry-knapsack...
|
|
done in 3s
|
|
Git remote deis removed
|
|
```
|
|
|
|
# clean up:
|
|
|
|
```
|
|
$ terraform destroy
|
|
Do you really want to destroy?
|
|
Terraform will delete all your managed infrastructure.
|
|
There is no undo. Only 'yes' will be accepted to confirm.
|
|
|
|
Enter a value: yes
|
|
...
|
|
...
|
|
Apply complete! Resources: 0 added, 0 changed, 12 destroyed.
|
|
```
|