Amazonin EC2 Container Service siirtyi jokin aika sitten beta-vaiheesta tuotantoon. Sitä voi hallita AWS Console -käyttöliittymästä ja palvelu toimii myös esimerkiksi eu-west-1-alueella eli Irlannissa, jossa tämäkin blogi pyörii nykyään. Kirjasin tähän ylös muutamia (teknisiä) huomioita blogin siirtämisestä perinteisemmästä Docker-ympäristöstä ECS:ään.

CPU- ja RAM-rajoitukset

Suurin ratkaistava ongelma oli se, että AWS EC2 Container Service vaatii määrittelemään jokaisen kontin muistintarpeen megatavun tarkkuudella. Perus-Dockerissa tämän voi ohittaa ja luottaa vain siihen, että muistia on riittävästi. ECS:ssä pitää ensin selvittää, paljonko muistia kukin kontti tarvitsee, ja huolehtia että EC2-instanssi sisältää ainakin niiden yhteenlasketun määrän verran RAM-muistia. Omien kokeilujeni perusteella ECS-agentti ei huomioi swap-muistia, vaan antaa virheilmoituksen, jos konttien kokonaisvaraus ylittää RAM-muistin määrän.

Yksi Amazonin t2.micro-instanssi jaksaa pyörittää Docker-konteissa Nginx:ää, MySQL:ää, PHP:tä, MongoDB:tä ja muutamaa Node.js-palvelinta. Omat Node-konttini tuntuvat kukin vaativan vähintään noin 60MB muistivarauksen. Gigatavun muisti riittää alkuun hyvin mutta loppuu jossain vaiheessa kesken, jos erilaisia palveluita lisäilee paljon. MySQL ja MongoDB vaativat vielä enemmän muistia, joten mikroinstansisssa niitä kannattaa ajaa vain yksin kappalein ja jakaa ne usean eri sovelluksen kesken.

Datalevyt

EC2-instanssin oman juurilevyn lisäksi kannattaa tehdä kaksi EBS-levyä, jotka ovat kukin kooltaan ainakin 30GB. Ensimmäinen EBS-levy liitetään hakemistoon /var/lib/docker, jolloin se sisältää kaikki Dockerin levykuvat ja kontit. Tällöin ne eivät pääse vahingossa täyttämään juuri- ja datalevyjä. Toinen EBS-levy liitetään hakemistoon /data, ja kaikki Docker-kontit määritellään tallentamaan datansa kyseiseen hakemistoon.

Kun kaikki data sijaitsee erillisellä datalevyllä, niin hakemiston /var/lib/docker mahdollinen korruptoituminen tai tuhoutuminen ei haittaa. Se voidaan tarvittaessa tyhjentää kokonaan, sillä Docker lataa automaattisesti uudelleen tarvittavat levykuvat Docker Hubista ja muista yksityisistä rekistereistä.

Service-määrittelyt ja virtuaalipalvelimet

ECS:ssä ei kannata käyttää Taskeja vaan Servicejä, jotka käynnistävät uuden Taskin vanhan tilalle automaattisesti, jos se kuolee. Servicet on tarkoitettu liitettäviksi ELB-kuormantasaajiin, mutta kuormantasaajien käyttö on valinnaista. Konfiguraatio muodostuu siis Clusterista, Task Definitioneista ja Serviceistä.

Kun Service halutaan käynnistää uudelleen ja päivittää mahdolliset muutokset kontin levykuvaan, se skaalataan ensin kokoon 0 ja sitten takaisin kokoon 1. Tämän voi tehdä joko AWS Consolesta tai komentorivityökaluilla (pip install awscli). Tämä näyttäisi olevan normaali tapa päivittää uusia versioita palveluista tuotantoon.

Amazonin ECS:ssä tai ELB:ssä ei ole minkäänlaista virtual host -tukea, joten palveluihin täytyy viitata erillisillä porttinumeroilla. Jokainen palvelu julkaistaan siis omalla porttinumerollaan, jossa sen HTTP-palvelin vastaa. Portissa 80 voidaan ajaa Nginx-konttia, joka ohjaa pyynnöt DNS-nimien perusteella muihin portteihin samalla koneella. Perinteisesti Nginx ohjaisi liikenteen osoitteeseen 127.0.0.1, mutta omassa kontissa pyörissään se pääsee viittaamaan julkaistuihin portteihin docker0-interfacen kautta IP-osoitteella 172.17.42.1.

Porttien julkaiseminen linkitysten käytön sijaan

Dockerin konttilinkityksiä ei kannata käyttää. Ne aiheuttavat ongelmia, jos linkityksen kohteena oleva kontti kuolee tai käynnistetään uudelleen. ECS osaa tuolloin käynnistää Servicen kaikki kontit uudelleen, mutta tämä on raskasta ja kestää kauan varsinkin kehityksen aikana. On kevyempää tehdä esimerkiksi MongoDB:stä erillinen Service ja julkaista se portissa 27017. Tällöin MongoDB-palvelin on kaikkien muiden konttien käytettävissä osoitteessa 172.17.42.1:27017, eikä sitä tarvitse käynnistellä uudelleen aina kun palveluja päivitetään.

Yhteenveto

Kaiken kaikkiaan olen tyytyväinen EC2 Container Serviceen. Se vaikuttaa toimivan luotettavasti ja vähentää tarvetta omille käyttöjärjestelmätason virityksille. Alla pyörivään Amazon Linuxiin pitää lähinnä määritellä omat EBS-datalevyt /etc/fstab-tiedostoon. Tämä toivottavasti automatisoidaan myöhemmin niin, että EBS-levyt liitetään ECS-klustereihin ja agentit osaavat huolehtia niiden mounttaamisesta.

Omassa käytössäni en ole vielä kokeillut ECS:n skaalautuvuusominaisuuksia. Kun palvelu koostuu isommasta määrästä kontteja, joiden CPU- ja muistitarpeet vaihtelevat, ECS:n pitäisi osata ripotella niitä klusteriin liitetyille EC2-instansseille sopivasti. Jää nähtäväksi, miten hyvin tämä toimii käytännössä.