CoreOS + Docker + RedBridge Cloud = Yeah!

(Magnus Bengtsson)

CoreOS är en ny Linuxdistribution speciellt framtagen för att köra Linux containers. CoreOS i sig är väldigt enkel och innehåller egentligen endast vad som behövs för att köra Linux containers – antingen som Docker eller Rkt. Tanken är att man startar CoreOS och alla tjänster man sedan behöver körs som containers.

Fördelen med Linux containers är att man enkelt uppnår en hög densitet av tjänster, det är väldigt liten overhead att köra en tjänst som en container. Det är även enkelt att deploya och hantera versioner av tjänsten. När det gäller Docker och kanske i ännu större grad Rkt är tanken att en container är en process. Detta gör att det ganska snabbt blir en stor mängd tjänster eller containers som skall hanteras, vilket gör att nya intressanta problem kring konfigurationshantering och schedulering uppstår.

drift

Källa: CoreOS

Det som gör att CoreOS sticker ut från mängden är att man i platformen inkluderar tjänster som underlättar hantering av många containers på många instanser: etcd, fleet samt flannel.

  • Etcd är ett distribuerad key/value-system som möjliggör och lagring av konfiguration över ett kluster av maskiner, men även grundläggande klusterfunktionalitet genom distribuerade lås.
  • Fleet är CoreOS inbyggda distribuerade Systemd tjänst. Den ger möjlighet att schemalägga tjänster eller framför allt containers på medlemmar i CoreOS klustret, fleet använder sig av etcd för att hålla CoreOS klustret i sync.
  • Flannel är ett virtuellt nätverk som ger varje instans ett eget subnät för containers på hosten, detta gör att containers på en instans inte behöver portmappas samt att containers på olika instanser kan prata över flannel utan att gå över nat.

CoreOS är anpassat för att köras i molnet och har ett förstaklassens stöd för cloud-config data inskjuten via user/meta-data av molnplattformen. RedBridge Cloud har givetvis stöd för detta.

Jag kommer här visa hur man snabbt och enkelt kan sätta upp ett CoreOS kluster i RedBridge Cloud och starta en tjänst i klustret.

Du behöver ha rbc-tools installerat, om du inte har det följ instruktionerna här.

Du behöver även skapa ett VPC i RedBridge Cloud, med ett tillhörande publikt nät. I exemplet nedan heter det external, samt en ssh nyckel i RBC.

Börja med att skapa en cloud-config fil för CoreOS:

#cloud-config
---
coreos:
 units:
 - name: etcd2.service
   command: start
 - name: flanneld.service
   drop-ins:
     - name: 50-network-config.conf
       content: |
         [Service]
         ExecStartPre=/usr/bin/etcdctl set /coreos.com/network/config '{ "Network": "10.132.0.0/16", "SubnetLen": 26,  "SubnetMin": "10.132.1.0", "SubnetMax": "10.132.64.0", "Backend": { "Type": "vxlan", "VNI": 1337 }}'
   command: start
 - name: fleet.service
   command: start
 - name: docker-tcp.socket
   command: start
   content: |
     [Unit]
     Description=Docker Socket for Remote API

     [Socket]
     ListenStream=2375
     Service=docker.service
     BindIPv6Only=both

     [Install]
     WantedBy=sockets.target
 - name: rpc-statd.service
   command: start
 flannel:
   interface: $private_ipv4
 fleet:
     public-ip: "$private_ipv4"
     metadata: "region=rbc-se-sth-z1"
 etcd2:
   # generate a new token for each unique cluster from https://discovery.etcd.io/new?size=3
   # specify the initial size of your cluster with ?size=X
   discovery: https://discovery.etcd.io/1417c280eb2831c5632e0ca3eee5bc6f
   advertise-client-urls: "http://$private_ipv4:2379"
   initial-advertise-peer-urls: "http://$private_ipv4:2380"
   listen-client-urls: "http://0.0.0.0:2379,http://0.0.0.0:4001"
   listen-peer-urls: "http://$private_ipv4:2380,http://$private_ipv4:7001"
 coreos:
   channel: stable
   update:
     reboot-strategy: "etcd-lock"

Filen kräver lite förklaringar:

etcd:
 discovery: https://discovery.etcd.io/794b876d62d944a7e9b8cbebee6c5f2a

För att etcd skall kunna formera ett kluster måste noder kunna bootstrappas, CoreOS teamet erbjuder tjänst som man kan använda för detta, Discovery adressen måste vara unik, så skapa en egen via:

$ curl https://discovery.etcd.io/new

Dessutom startar vi flannel över vxlan:

- name: flanneld.service
  drop-ins:
    - name: 50-network-config.conf
      content: |
        [Service]
        ExecStartPre=/usr/bin/etcdctl set /coreos.com/network/config '{ "Network": "10.132.0.0/16", "SubnetLen": 26,  "SubnetMin": "10.132.1.0", "SubnetMax": "10.132.64.0", "Backend": { "Type": "vxlan", "VNI": 1337 }}'

Slutligen sätter vi en kanal som vi vill följa, i detta fall stable-kanalen, som innehåller den stabila versionen av CoreOS. Samt hur vi skall låta klusternoder uppdatera sig själva, genom att ange etcd kommer våra noder se till att behålla klustret i quorum under uppdateringar.

Nu är det dags att starta upp vårt kluster i RedBridge Cloud:

$ rbc-instances deploy -w external -i 3 -g coreos-demo -t rbc/coreos-amd64-production-607-rbc-100GB -o small-m -s demo -f cloud-config coreos-demo

name             zone       state    offering    group        network    ipaddress    sshkey    password    template                                   created
---------------  ---------  -------  ----------  -----------  ---------  -----------  --------  ----------  -----------------------------------------  ------------------------
coreos-demo-a4b  se-sth-z1  Running  small-m     coreos-demo  external   10.0.1.158   demo      None        rbc/coreos-amd64-production-607-rbc-100GB  2015-11-21T21:57:37+0100
coreos-demo-bb6  se-sth-z1  Running  small-m     coreos-demo  external   10.0.1.101   demo      None        rbc/coreos-amd64-production-607-rbc-100GB  2015-11-21T21:57:37+0100
coreos-demo-c69  se-sth-z1  Running  small-m     coreos-demo  external   10.0.1.14    demo      None        rbc/coreos-amd64-production-607-rbc-100GB  2015-11-21T21:57:37+0100

Detta kommer att starta upp 3 instanser på nätverket “external” med vår ssh-nyckel “demo”.

Om du har ditt vpn igång skall du kunna ssh:a till den första noden och kontrollera status på klustret:

$ ssh 10.0.1.158 -l core -i demo.key
CoreOS stable (717.3.0)
$ fleetctl list-machines
MACHINE        IP        METADATA
14019ccc...    185.53.167.22    region=rbc-se-sth-z1
81181d7a...    185.53.167.22    region=rbc-se-sth-z1
db87ab99...    185.53.167.22    region=rbc-se-sth-z1

Det är nu dags att schemalägga en container på vårt CoreOS kluster, vi kommer att installera google's cadvisor som container så att vi kan få lite fin statistik från våra instanser. Starta med att skapa en systemd unit fil som fleet kan använda för att starta docker containern:

[Unit]
Description=cAdvisor Service
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=10m
Restart=always
ExecStartPre=-/usr/bin/docker kill cadvisor
ExecStartPre=-/usr/bin/docker rm -f cadvisor
ExecStartPre=/usr/bin/docker pull google/cadvisor
ExecStart=/usr/bin/docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=4194:4194 --name=cadvisor --net=host google/cadvisor:latest --logtostderr --port=4194
ExecStop=/usr/bin/docker stop -t 2 cadvisor

[X-Fleet]
Global=true

Detta är egentligen en standard systemd unitfil med lite fleet tillägg. ([X-Fleet]). I dett fall anger X-Fleet att tjänsten är global, dvs den skall köras på samtliga instanser i CoreOS klustret.

Flytta över filen till en av CoreOS maskinerna:

scp -i demo.key cadvisor.service core@10.0.1.158:

Starta sedan tjänsten:

core@coreos-demo-a4b ~ $ fleetctl start cadvisor.service
Triggered global unit cadvisor.service start
core@coreos-demo-a4b ~ $ fleetctl list-units
UNIT            MACHINE         ACTIVE  SUB
cadvisor.service    0a5fc2f7.../10.0.1.158  active  running
cadvisor.service    23db3d4a.../10.0.1.14   active  running
cadvisor.service    cffdd4fc.../10.0.1.101  active  running

Grattis! Du har nu satt upp och startat en tjänst på ditt nya fina CoreOS kluster.

I nästa blogpost skall jag visa hur vi kan köra Kuberentes på CoreOS!