1) On your admin node (your laptop?) generate etcd unique discovery string:
$ curl -L https://discovery.etcd.io/new
Copy/paste the output as this will be used by our cluster nodes for discovery.
2) Next, from the AWS console/AWS CLI API launch 3 instances with the following user data:
#cloud-config
coreos:
etcd:
discovery: https://discovery.etcd.io/78c03094374cc2140d261d116c6d31f3
addr: $public_ipv4:4001
peer-addr: $public_ipv4:7001
units:
- name: etcd.service
command: start
- name: fleet.service
command: start
I have used the following AMI ID: ami-0e300d13 (which is CoreOS stable 607).
3) On the admin node add your AWS private key to the ssh-agent:
$ eval `ssh-agent -s`
$ ssh-add ~/.ssh/test-private-key.pem
4) Get Go Lang + Install fleetctl, we will use it orchestrate our CoreOS cluster:
$ apt-get update; apt-get install golang -y
$ git clone https://github.com/coreos/fleet.git /opt/fleet
$ cd /opt/fleet ; ./build
$ echo "export PATH=${PATH}:/opt/fleet/bin" >> ~/.bashrc
$ source ~/.bashrc
5) Check fleetctl functionality:
$ fleetctl --tunnel coreos1 list-machines
MACHINE IP METADATA
06673ee6... 172.31.13.15 -
3c5c65e8... 172.31.13.16 -
fd02bd21... 172.31.13.17 -
Where 'coreos1' is one of our cluster nodes external IP.
Voila! our CoreOS 3 node cluster is up and running, brilliant ;)
6) Let's create a sample unit file (similar to systemd) which will pull Docker ES container and bind it's port to 9200 of the host:
$ cat << EOF > ES.service
[Unit]
Description=ElasticSearch
After=docker.service
Requires=docker.service
[Service]
ExecStartPre=/usr/bin/docker pull elasticsearch:latest
ExecStart=/usr/bin/docker run --name elasticsearch -p 9200:9200 elasticsearch
ExecStopPre=/usr/bin/docker kill elasticsearch
ExecStop=/usr/bin/docker rm elasticsearch
TimeoutStartSec=0
Restart=always
RestartSec=10s
[X-Fleet]
X-Conflicts=ES@*.service
EOF
7) Launch our newly created unit file:
$ fleetctl --tunnel coreos1 start ES.service
Unit ES.service launched on 06673ee6.../172.31.13.15
$ fleetctl --tunnel coreos1 list-units
UNIT MACHINE ACTIVE SUB
ES.service 06673ee6.../172.31.13.15 active running
Boom! Our ES node is up and running. We can verify it's functionality by executing a simple HTTP GET such as:
$ curl -q -L http://coreos1/9200/_status/
We are still missing some important parts such as persistent data for ES Docker containers (to survive reboots), nodes discovery, monitoring and much more so stay tuned for the next part.