magnum/doc/source/dev/quickstart.rst

692 lines
26 KiB
ReStructuredText

.. _quickstart:
=====================
Developer Quick-Start
=====================
This is a quick walkthrough to get you started developing code for magnum.
This assumes you are already familiar with submitting code reviews to an
OpenStack project.
.. seealso::
http://docs.openstack.org/infra/manual/developers.html
Setup Dev Environment
=====================
Install OS-specific prerequisites::
# Ubuntu/Debian:
sudo apt-get update
sudo apt-get install -y python-dev libssl-dev libxml2-dev \
libmysqlclient-dev libxslt-dev libpq-dev git \
libffi-dev gettext build-essential python3.4-dev
# Fedora/RHEL:
sudo yum install -y python-devel openssl-devel mysql-devel \
libxml2-devel libxslt-devel postgresql-devel git \
libffi-devel gettext gcc
# openSUSE/SLE 12:
sudo zypper --non-interactive install git libffi-devel \
libmysqlclient-devel libopenssl-devel libxml2-devel \
libxslt-devel postgresql-devel python-devel \
gettext-runtime
Install pip::
curl -s https://bootstrap.pypa.io/get-pip.py | sudo python
Install common prerequisites::
sudo pip install virtualenv flake8 tox testrepository git-review
You may need to explicitly upgrade virtualenv if you've installed the one
from your OS distribution and it is too old (tox will complain). You can
upgrade it individually, if you need to::
sudo pip install -U virtualenv
Magnum source code should be pulled directly from git::
# from your home or source directory
cd ~
git clone https://git.openstack.org/openstack/magnum
cd magnum
All unit tests should be run using tox. To run magnum's entire test suite::
# run all tests (unit and pep8)
tox
To run a specific test, use a positional argument for the unit tests::
# run a specific test for Python 2.7
tox -epy27 -- test_conductor
You may pass options to the test programs using positional arguments::
# run all the Python 2.7 unit tests (in parallel!)
tox -epy27 -- --parallel
To run only the pep8/flake8 syntax and style checks::
tox -epep8
To run unit test coverage and check percentage of code covered::
tox -e cover
To discover and interact with templates, please refer to
`<http://docs.openstack.org/developer/magnum/dev/bay-template-example.html>`_
Exercising the Services Using Devstack
======================================
Devstack can be configured to enable magnum support. It is easy to develop
magnum with the devstack environment. Magnum depends on nova, glance, heat and
neutron to create and schedule virtual machines to simulate bare-metal (full
bare-metal support is under active development).
**NOTE:** Running devstack within a virtual machine with magnum enabled is not
recommended at this time.
This session has only been tested on Ubuntu 14.04 (Trusty) and Fedora 20/21.
We recommend users to select one of them if it is possible.
For in-depth guidance on adding magnum manually to a devstack instance, please
refer to the `<http://docs.openstack.org/developer/magnum/dev/manual-devstack.html>`_
Clone devstack::
# Create a root directory for devstack if needed
sudo mkdir -p /opt/stack
sudo chown $USER /opt/stack
git clone https://git.openstack.org/openstack-dev/devstack /opt/stack/devstack
We will run devstack with minimal local.conf settings required to enable
magnum, heat, and neutron (neutron is enabled by default in devstack since
Kilo, and heat is enabled by the magnum plugin)::
cat > /opt/stack/devstack/local.conf << END
[[local|localrc]]
DATABASE_PASSWORD=password
RABBIT_PASSWORD=password
SERVICE_TOKEN=password
SERVICE_PASSWORD=password
ADMIN_PASSWORD=password
# magnum requires the following to be set correctly
PUBLIC_INTERFACE=eth1
enable_plugin magnum https://git.openstack.org/openstack/magnum
# Enable barbican service and use it to store TLS certificates
# For details http://docs.openstack.org/developer/magnum/dev/tls.html
enable_plugin barbican https://git.openstack.org/openstack/barbican
enable_plugin neutron-lbaas https://git.openstack.org/openstack/neutron-lbaas
VOLUME_BACKING_FILE_SIZE=20G
END
**NOTE:** Update PUBLIC_INTERFACE as appropriate for your system.
Optionally, you can enable ceilometer in devstack. If ceilometer is enabled,
magnum will periodically send metrics to ceilometer::
cat >> /opt/stack/devstack/local.conf << END
enable_plugin ceilometer https://git.openstack.org/openstack/ceilometer
END
If you want to deploy Docker Registry 2.0 in your bay, you should enable swift
in devstack::
cat >> /opt/stack/devstack/local.conf << END
enable_service s-proxy
enable_service s-object
enable_service s-container
enable_service s-account
END
More devstack configuration information can be found at
http://docs.openstack.org/developer/devstack/configuration.html
More neutron configuration information can be found at
http://docs.openstack.org/developer/devstack/guides/neutron.html
Run devstack::
cd /opt/stack/devstack
./stack.sh
**NOTE:** This will take a little extra time when the Fedora Atomic micro-OS
image is downloaded for the first time.
At this point, two magnum process (magnum-api and magnum-conductor) will be
running on devstack screens. If you make some code changes and want to
test their effects, just stop and restart magnum-api and/or magnum-conductor.
Prepare your session to be able to use the various openstack clients including
magnum, neutron, and glance. Create a new shell, and source the devstack openrc
script::
source /opt/stack/devstack/openrc admin admin
Magnum has been tested with the Fedora Atomic micro-OS and CoreOS. Magnum will
likely work with other micro-OS platforms, but each requires individual
support in the heat template.
The Fedora Atomic micro-OS image will automatically be added to glance. You
can add additional images manually through glance. To verify the image created
when installing devstack use::
glance -v image-list
+--------------------------------------+---------------------------------+-------------+------------------+-----------+--------+----------------------------------+
| ID | Name | Disk_format | Container_format | Size | Status | Owner |
+--------------------------------------+---------------------------------+-------------+------------------+-----------+--------+----------------------------------+
| 090de3a2-2c0c-42d5-b5a3-cfcddd6d011b | cirros-0.3.4-x86_64-uec | ami | ami | 25165824 | active | f98b9727094d40c78b1ed40e3bc91e80 |
| 9501d296-f0aa-4c0e-bc24-2a680f8741f0 | cirros-0.3.4-x86_64-uec-kernel | aki | aki | 4979632 | active | f98b9727094d40c78b1ed40e3bc91e80 |
| 01478d1a-59e0-4f36-b69e-0eaf5821ee46 | cirros-0.3.4-x86_64-uec-ramdisk | ari | ari | 3740163 | active | f98b9727094d40c78b1ed40e3bc91e80 |
| f14d6ee3-9e53-4f22-ba42-44e95810c294 | fedora-atomic-latest | qcow2 | bare | 507928064 | active | f98b9727094d40c78b1ed40e3bc91e80 |
+--------------------------------------+---------------------------------+-------------+------------------+-----------+--------+----------------------------------+
To list the available commands and resources for magnum, use::
magnum help
To list out the health of the internal services, namely conductor, of magnum, use::
magnum service-list
+----+------------------------------------+------------------+-------+
| id | host | binary | state |
+----+------------------------------------+------------------+-------+
| 1 | oxy-dev.hq1-0a5a3c02.hq1.abcde.com | magnum-conductor | up |
+----+------------------------------------+------------------+-------+
Create a keypair for use with the baymodel::
test -f ~/.ssh/id_rsa.pub || ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
nova keypair-add --pub-key ~/.ssh/id_rsa.pub testkey
Building a Kubernetes Bay - Based on Fedora Atomic
==================================================
Create a baymodel. This is similar in nature to a flavor and describes
to magnum how to construct the bay. The baymodel specifies a Fedora Atomic
image so the bays which use this baymodel will be based on Fedora Atomic.
The coe (Container Orchestration Engine) and keypair need to be specified
as well::
magnum baymodel-create --name k8sbaymodel \
--image-id fedora-atomic-latest \
--keypair-id testkey \
--external-network-id public \
--dns-nameserver 8.8.8.8 \
--flavor-id m1.small \
--docker-volume-size 5 \
--network-driver flannel \
--coe kubernetes
Create a bay. Use the baymodel name as a template for bay creation.
This bay will result in one master kubernetes node and one minion node::
magnum bay-create --name k8sbay --baymodel k8sbaymodel --node-count 1
Bays will have an initial status of CREATE_IN_PROGRESS. Magnum will update
the status to CREATE_COMPLETE when it is done creating the bay. Do not create
containers, pods, services, or replication controllers before magnum finishes
creating the bay. They will likely not be created, and may cause magnum to
become confused.
The existing bays can be listed as follows::
magnum bay-list
+--------------------------------------+---------+------------+-----------------+
| uuid | name | node_count | status |
+--------------------------------------+---------+------------+-----------------+
| 9dccb1e6-02dc-4e2b-b897-10656c5339ce | k8sbay | 1 | CREATE_COMPLETE |
+--------------------------------------+---------+------------+-----------------+
More detailed information for a given bay is obtained via::
magnum bay-show k8sbay
After a bay is created, you can dynamically add/remove node(s) to/from the bay
by updating the node_count attribute. For example, to add one more node::
magnum bay-update k8sbay replace node_count=2
Bays in the process of updating will have a status of UPDATE_IN_PROGRESS.
Magnum will update the status to UPDATE_COMPLETE when it is done updating
the bay.
**NOTE:** Reducing node_count will remove all the existing pods on the nodes
that are deleted. If you choose to reduce the node_count, magnum will first
try to remove empty nodes with no pods running on them. If you reduce
node_count by more than the number of empty nodes, magnum must remove nodes
that have running pods on them. This action will delete those pods. We
strongly recommend using a replication controller before reducing the
node_count so any removed pods can be automatically recovered on your
remaining nodes.
Heat can be used to see detailed information on the status of a stack or
specific bay:
To check the list of all bay stacks::
openstack stack list
To check an individual bay's stack::
openstack stack show <stack-name or stack_id>
Monitoring bay status in detail (e.g., creating, updating)::
BAY_HEAT_NAME=$(openstack stack list | awk "/\sk8sbay-/{print \$4}")
echo ${BAY_HEAT_NAME}
openstack stack resource list ${BAY_HEAT_NAME}
Building a Kubernetes Bay - Based on CoreOS
===========================================
You can create a Kubernetes bay based on CoreOS as an alternative to Atomic.
First, download the official CoreOS image::
wget http://beta.release.core-os.net/amd64-usr/current/coreos_production_openstack_image.img.bz2
bunzip2 coreos_production_openstack_image.img.bz2
Upload the image to glance::
glance image-create --name CoreOS \
--visibility public \
--disk-format=qcow2 \
--container-format=bare \
--os-distro=coreos \
--file=coreos_production_openstack_image.img
Create a CoreOS Kubernetes baymodel, which is similar to the Atomic Kubernetes
baymodel, except for pointing to a different image::
magnum baymodel-create --name k8sbaymodel-coreos \
--image-id CoreOS \
--keypair-id testkey \
--external-network-id public \
--dns-nameserver 8.8.8.8 \
--flavor-id m1.small \
--network-driver flannel \
--coe kubernetes
Create a CoreOS Kubernetes bay. Use the CoreOS baymodel as a template for bay
creation::
magnum bay-create --name k8sbay \
--baymodel k8sbaymodel-coreos \
--node-count 2
Using Kubernetes Bay
====================
**NOTE:** For the following examples, only one minion node is required in the
k8s bay created previously.
Kubernetes provides a number of examples you can use to check that things are
working. You may need to clone kubernetes using::
wget https://github.com/kubernetes/kubernetes/releases/download/v1.0.1/kubernetes.tar.gz
tar -xvzf kubernetes.tar.gz
sudo cp -a kubernetes/platforms/linux/amd64/kubectl /usr/bin/kubectl
We first need to setup the certs to allow Kubernetes to authenticate our
connection. See tls.rst for more info on using TLS keys/certs which are setup
below.
To generate an RSA key, you will use the 'genrsa' command of the 'openssl'
tool.::
openssl genrsa -out client.key 4096
To generate a CSR for client authentication, openssl requires a config file
that specifies a few values.::
$ cat > client.conf << END
[req]
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no
[req_distinguished_name]
CN = Your Name
[req_ext]
extendedKeyUsage = clientAuth
END
Once you have client.conf, you can run the openssl 'req' command to generate
the CSR.::
openssl req -new -days 365 \
-config client.conf \
-key client.key \
-out client.csr
Now that you have your client CSR, you can use the Magnum CLI to send it off
to Magnum to get it signed and also download the signing cert.::
magnum ca-sign --bay k8sbay --csr client.csr > client.crt
magnum ca-show --bay k8sbay > ca.crt
Here's how to set up the replicated redis example. Now we create a pod for the
redis-master::
KUBERNETES_URL=$(magnum bay-show k8sbay |
awk '/ api_address /{print $4}')
# Set kubectl to use the correct certs
kubectl config set-cluster k8sbay --server=${KUBERNETES_URL} \
--certificate-authority=$(pwd)/ca.crt
kubectl config set-credentials client --certificate-authority=$(pwd)/ca.crt \
--client-key=$(pwd)/client.key --client-certificate=$(pwd)/client.crt
kubectl config set-context k8sbay --cluster=k8sbay --user=client
kubectl config use-context k8sbay
# Test the cert and connection works
kubectl version
cd kubernetes/examples/redis
kubectl create -f ./redis-master.yaml
Now create a service to provide a discoverable endpoint for the redis
sentinels in the cluster::
kubectl create -f ./redis-sentinel-service.yaml
To make it a replicated redis cluster create replication controllers for the
redis slaves and sentinels::
sed -i 's/\(replicas: \)1/\1 2/' redis-controller.yaml
kubectl create -f ./redis-controller.yaml
sed -i 's/\(replicas: \)1/\1 2/' redis-sentinel-controller.yaml
kubectl create -f ./redis-sentinel-controller.yaml
Full lifecycle and introspection operations for each object are supported.
For example, magnum bay-create, magnum baymodel-delete.
Now there are four redis instances (one master and three slaves) running
across the bay, replicating data between one another.
Run the bay-show command to get the IP of the bay host on which the
redis-master is running::
magnum bay-show k8sbay
+--------------------+------------------------------------------------------------+
| Property | Value |
+--------------------+------------------------------------------------------------+
| status | CREATE_COMPLETE |
| uuid | cff82cd0-189c-4ede-a9cb-2c0af6997709 |
| status_reason | Stack CREATE completed successfully |
| created_at | 2016-05-26T17:45:57+00:00 |
| updated_at | 2016-05-26T17:50:02+00:00 |
| bay_create_timeout | 60 |
| api_address | https://172.24.4.4:6443 |
| baymodel_id | e73298e7-e621-4d42-b35b-7a1952b97158 |
| master_addresses | ['172.24.4.6'] |
| node_count | 1 |
| node_addresses | ['172.24.4.5'] |
| master_count | 1 |
| discovery_url | https://discovery.etcd.io/4caaa65f297d4d49ef0a085a7aecf8e0 |
| name | k8sbay |
+--------------------+------------------------------------------------------------+
The output here indicates the redis-master is running on the bay host with IP
address 172.24.4.5. To access the redis master::
ssh minion@172.24.4.5
REDIS_ID=$(sudo docker ps | grep redis:v1 | grep k8s_master | awk '{print $1}')
sudo docker exec -i -t $REDIS_ID redis-cli
127.0.0.1:6379> set replication:test true
OK
^D
exit # Log out of the host
Log into one of the other container hosts and access a redis slave from it.
You can use `nova list` to enumerate the kube-minions. For this example we
will use the same host as above::
ssh minion@172.24.4.5
REDIS_ID=$(sudo docker ps | grep redis:v1 | grep k8s_redis | awk '{print $1}')
sudo docker exec -i -t $REDIS_ID redis-cli
127.0.0.1:6379> get replication:test
"true"
^D
exit # Log out of the host
Additional useful commands from a given minion::
sudo docker ps # View Docker containers on this minion
kubectl get pods # Get pods
kubectl get rc # Get replication controllers
kubectl get svc # Get services
kubectl get nodes # Get nodes
After you finish using the bay, you want to delete it. A bay can be deleted as
follows::
magnum bay-delete k8sbay
Building and Using a Swarm Bay
==============================
Create a baymodel. It is very similar to the Kubernetes baymodel, except for
the absence of some Kubernetes-specific arguments and the use of 'swarm'
as the coe::
magnum baymodel-create --name swarmbaymodel \
--image-id fedora-atomic-latest \
--keypair-id testkey \
--external-network-id public \
--dns-nameserver 8.8.8.8 \
--flavor-id m1.small \
--docker-volume-size 5 \
--coe swarm
**NOTE:** If you are using Magnum behind a firewall then see:
.. _Using_Magnum_Behind_Firewall:
http://docs.openstack.org/developer/magnum/magnum-proxy.html
Finally, create the bay. Use the baymodel 'swarmbaymodel' as a template for
bay creation. This bay will result in one swarm manager node and two extra
agent nodes::
magnum bay-create --name swarmbay --baymodel swarmbaymodel --node-count 2
Now that we have a swarm bay we can start interacting with it::
magnum bay-show swarmbay
+---------------+------------------------------------------+
| Property | Value |
+---------------+------------------------------------------+
| status | CREATE_COMPLETE |
| uuid | eda91c1e-6103-45d4-ab09-3f316310fa8e |
| created_at | 2015-04-20T19:05:27+00:00 |
| updated_at | 2015-04-20T19:06:08+00:00 |
| baymodel_id | a93ee8bd-fec9-4ea7-ac65-c66c1dba60af |
| node_count | 2 |
| discovery_url | |
| name | swarmbay |
+---------------+------------------------------------------+
We now need to setup the docker CLI to use the swarm bay we have created with
the appropriate credentials.
Create a dir to store certs and cd into it. The `DOCKER_CERT_PATH` env variable
is consumed by docker which expects ca.pem, key.pem and cert.pem to be in that
directory.::
export DOCKER_CERT_PATH=~/.docker
mkdir -p ${DOCKER_CERT_PATH}
cd ${DOCKER_CERT_PATH}
Generate an RSA key.::
openssl genrsa -out key.pem 4096
Create openssl config to help generated a CSR.::
$ cat > client.conf << END
[req]
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no
[req_distinguished_name]
CN = Your Name
[req_ext]
extendedKeyUsage = clientAuth
END
Run the openssl 'req' command to generate the CSR.::
openssl req -new -days 365 \
-config client.conf \
-key key.pem \
-out client.csr
Now that you have your client CSR use the Magnum CLI to get it signed and also
download the signing cert.::
magnum ca-sign --bay swarmbay --csr client.csr > cert.pem
magnum ca-show --bay swarmbay > ca.pem
Set the CLI to use TLS . This env var is consumed by docker.::
export DOCKER_TLS_VERIFY="1"
Set the correct host to use which is the public ip address of swarm API server
endpoint. This env var is consumed by docker.::
export DOCKER_HOST=$(magnum bay-show swarmbay | awk '/ api_address /{print substr($4,9)}')
Next we will create a container in this swarm bay. This container will ping the
address 8.8.8.8 four times::
docker run --rm -it cirros:latest ping -c 4 8.8.8.8
You should see a similar output to::
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=40 time=25.513 ms
64 bytes from 8.8.8.8: seq=1 ttl=40 time=25.348 ms
64 bytes from 8.8.8.8: seq=2 ttl=40 time=25.226 ms
64 bytes from 8.8.8.8: seq=3 ttl=40 time=25.275 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 25.226/25.340/25.513 ms
Building and Using a Mesos Bay
==============================
Provisioning a mesos bay requires a Ubuntu-based image with some packages
pre-installed. To build and upload such image, please refer to
`<http://docs.openstack.org/developer/magnum/dev/mesos.html>`_
Alternatively, you can download and upload a pre-built image::
wget https://fedorapeople.org/groups/magnum/ubuntu-14.04.3-mesos-0.25.0.qcow2
glance image-create --name ubuntu-mesos --visibility public \
--disk-format=qcow2 --container-format=bare \
--os-distro=ubuntu --file=ubuntu-14.04.3-mesos-0.25.0.qcow2
Then, create a baymodel by using 'mesos' as the coe, with the rest of arguments
similar to the Kubernetes baymodel::
magnum baymodel-create --name mesosbaymodel --image-id ubuntu-mesos \
--keypair-id testkey \
--external-network-id public \
--dns-nameserver 8.8.8.8 \
--flavor-id m1.small \
--coe mesos
Finally, create the bay. Use the baymodel 'mesosbaymodel' as a template for
bay creation. This bay will result in one mesos master node and two mesos
slave nodes::
magnum bay-create --name mesosbay --baymodel mesosbaymodel --node-count 2
Now that we have a mesos bay we can start interacting with it. First we need
to make sure the bay's status is 'CREATE_COMPLETE'::
$ magnum bay-show mesosbay
+--------------------+--------------------------------------+
| Property | Value |
+--------------------+--------------------------------------+
| status | CREATE_COMPLETE |
| uuid | ff727f0d-72ca-4e2b-9fef-5ec853d74fdf |
| status_reason | Stack CREATE completed successfully |
| created_at | 2015-06-09T20:21:43+00:00 |
| updated_at | 2015-06-09T20:28:18+00:00 |
| bay_create_timeout | 60 |
| api_address | 172.24.4.115 |
| baymodel_id | 92dbda62-32d4-4435-88fc-8f42d514b347 |
| node_count | 2 |
| node_addresses | [u'172.24.4.116', u'172.24.4.117'] |
| master_count | 1 |
| discovery_url | None |
| name | mesosbay |
+--------------------+--------------------------------------+
Next we will create a container in this bay by using the REST API of Marathon.
This container will ping the address 8.8.8.8::
$ cat > mesos.json << END
{
"container": {
"type": "DOCKER",
"docker": {
"image": "cirros"
}
},
"id": "ubuntu",
"instances": 1,
"cpus": 0.5,
"mem": 512,
"uris": [],
"cmd": "ping 8.8.8.8"
}
END
$ MASTER_IP=$(magnum bay-show mesosbay | awk '/ api_address /{print $4}')
$ curl -X POST -H "Content-Type: application/json" \
http://${MASTER_IP}:8080/v2/apps -d@mesos.json
To check application and task status::
$ curl http://${MASTER_IP}:8080/v2/apps
$ curl http://${MASTER_IP}:8080/v2/tasks
You can access to the Mesos web page at \http://<master>:5050/ and Marathon web
console at \http://<master>:8080/.
Building Developer Documentation
================================
To build the documentation locally (e.g., to test documentation changes
before uploading them for review) chdir to the magnum root folder and
run tox::
tox -edocs
**NOTE:** The first time you run this will take some extra time as it
creates a virtual environment to run in.
When complete, the documentation can be accessed from::
doc/build/html/index.html