Mitt företag Triop AB erbjuder konsulttjänster inom DevOps. Se här: triop.se/devops
Fleet är en av de nyare verktygen som kommer från gänget bakom operativsystemet CoreOS. Fleet är till för att köra din kod på kluster av Dockers som rullar under CoreOS.
fleet ties together systemd and etcd into a distributed init system. Think of it as an extension of systemd that operates at the cluster level instead of the machine level.
Jag tänkte visa när jag startar upp två noder på Amazon EC2 som kör CoreOS och som sedan administreras med hjälp av kommandot fleetctl.
Python-koden för att starta upp nya servrar hittar du längst ner i detta blogginlägg. Det finns några inställningar som du bör göra innan, såsom att nyckelnamnet stämmer och security group har regler som tillåter port 7001, 4001 och 22. Samt EC2 access id och key.
Starta upp klusterchefen
Först och främst startar vi upp en leader. Detta kommuniceras ut via den unika token som återfinnes under discovery i user_data som du bör sätta till ett unikt värde för varje kluster.
$ python ec2-coreos.py # Starting EC2 server with hostname coreos-roseanne - Wait.. - Wait.. - Wait.. Found IP: 46.137.21.3
Du kan även kontrollera att det fungerar att ansluta till den nya servern med IP-adress 46.137.21.3:
$ ssh -p 22 [email protected] CoreOS (alpha) [email protected] ~ $
Perfekt. Även kan det vara till fördel att se så att etc verkligen lyssnar på tcp port 4001 och 7001 antingen tittar vi via lsof eller testar att ansluta direkt med curl:
$ curl 46.137.21.3:4001 404 page not found $ curl 46.137.21.3:7001 404 page not found
Och det fungerar bra. Skulle inte etcd starta upp så kan det bero på att din cloudconfig är felaktig (ej unik nyckel) eller så kan du titta på loggen med journalctl -u etc. Även så kan du starta upp etcd med kommandot:
sudo systemctl start etcd.service
Starta upp en arbetsnod
För att vi ska ha någon mer nod i klustret så startar vi upp en till. Precis som ovan så kör vi bara ec2-coreos.py och väntar några sekunder på att vår nya nod ska starta upp:
$ python ec2-coreos.py # Starting EC2 server with hostname coreos-alia - Wait.. - Wait.. - Wait.. - Wait.. Found IP: 54.220.243.180
Om allt gick som det ska så ska denna nya nod automatiskt ansluta till coreos-roseanne som är leader. Du kan även titta på loggen med journalctl -u etcd om något skulle vara fel eller använda den unika discovery URL:en direkt för att lista alla noder i ditt kluster:
curl https://discovery.etcd.io/db7ce1f96d42b24f38b5c96a3018f1ea|python -mjson.tool
CoreOS Fleet
Då var det dags att administrera vår flotta med noder med hjälp av fleetctl. Jag har på min Mac installerat fleetctl från github men det går även bra via homebrew:
$ brew update
$ brew install fleetctl
Om vi har rätt ssh-nycklar är det bara att köra. Du kan installera rätt ssh nyckel via kommandot ssh-add coreos.pem exempelvis.
Vi börjar med att lista alla maskiner:
$ fleetctl --tunnel=46.137.21.3 list-machines MACHINE IP METADATA 9c62bc5f... 10.73.195.43 - f9946c83... 10.35.3.231 -
Perfekt. Då är det dags att slänga ut vårat första jobb som ska utföras i klustret. Det är ett simpelt Hello World test som ska exekveras, så vi lägger följande innehåll i filen myapp.service:
[Unit] Description=MyApp After=docker.service Requires=docker.service [Service] ExecStart=/usr/bin/docker run busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
Och startar upp:
$ fleetctl --tunnel=46.137.21.3 start myapp.service Job myapp.service launched on 9c62bc5f.../10.73.195.43
Perfekt. Nu ska jobbet ha startat och vi kan titta med fleetctl journal myapp.service eller list-nodes.
Så här ser det ut med info:
Och nu ligger Hello World och kör under Docker på en av noderna vilket fleetctl list-units kan bevittna.
För delning av jobb och leader/follower genomförs av Raft Consensus algortimen.
ec2-coreos.py
Här återfinnes koden som jag använder för att starta upp nya noder:
#!/usr/bin/env python ## ## Jonas Lejon 2014 ## ## sudo pip install apache-libcloud names import os, sys, time import names from libcloud.compute.types import Provider from libcloud.compute.providers import get_driver import libcloud.security libcloud.security.CA_CERTS_PATH = ['ca-bundle.crt'] # from Mozilla EC2_ACCESS_ID = '' # Paste your Amazon EC2 credentials here EC2_SECRET_KEY = '' userdata = """#cloud-config coreos: etcd: # generate a new token for each unique cluster from https://discovery.etcd.io/new discovery: https://discovery.etcd.io/unique_token_here # multi-region and multi-cloud deployments need to use $public_ipv4 addr: $public_ipv4:4001 peer-addr: $public_ipv4:7001 units: - name: etcd.service command: start - name: fleet.service command: start """ #EC2Driver = get_driver(Provider.EC2) EC2Driver = get_driver(Provider.EC2_EU_WEST) conn = EC2Driver(EC2_ACCESS_ID, EC2_SECRET_KEY) hostname = "coreos-" + names.get_first_name(gender='female').lower() print "# Starting EC2 server with hostname",hostname MY_SIZE = 't1.micro' #MY_IMAGE = "ami-8f30fff8" # CoreOS beta at eu-west-1 MY_IMAGE = "ami-87a769f0" # CoreOS alpha at eu-west-1 sizes = conn.list_sizes() images = conn.list_images() size = [s for s in sizes if s.id == MY_SIZE][0] image = [i for i in images if i.id == MY_IMAGE][0] node = conn.create_node(name=hostname, image=image, size=size, ex_keyname="coreos", ex_userdata=userdata, ex_securitygroup="coreos") nodes = conn.list_nodes() time.sleep(5) while nodes[-1].state != 0: time.sleep(5) print " - Wait.." nodes = conn.list_nodes() print "Found IP:",nodes[-1].public_ips[0]