Konttien puhdistaminen 101: syvä sukeltaminen konttitekniikkaan aloittelijoille

Kuva Rye Jessen on Unsplash

esittely

Riippumatta siitä, oletko oppilas koulussa, jonkin yrityksen kehittäjä vai ohjelmisto-harrastaja, on todennäköistä, että kuulet kontteja. Olet ehkä kuullut myös, että kontit ovat kevyitä virtuaalikoneita, mutta mitä se todella tarkoittaa, kuinka tarkalleen konttit toimivat ja miksi ne ovat niin tärkeitä?

Tämä tarina on tutustuminen kontteihin, niiden tärkeimpiin teknisiin ideoihin ja sovelluksiin. En ota vastaan ​​mitään muuta aikaisempaa tietoa tällä alalla kuin tietotekniikan perustiedot.

Ydin ja käyttöjärjestelmä

Kannettava tietokone ja kaikki muut tietokoneet on rakennettu joidenkin laitteiden päälle, kuten suoritin, pysyvä tallennustila (levyasema, SSD), muisti, verkkokortti jne.

Tämän laitteiston kanssa vuorovaikutuksessa käyttöjärjestelmässä oleva ydin nimeltään ohjelmistokappale toimii sillana laitteiston ja muun järjestelmän välillä. Ydin vastaa suoritettavien prosessien (ohjelmien) ajoittamisesta, laitteiden hallinnasta (levyjen ja muistien osoitteiden lukeminen ja kirjoittaminen) ja muusta.

Muun käyttöjärjestelmän tehtävänä on käynnistää ja hallita käyttäjätilaa, jossa käyttäjän prosessit suoritetaan, ja se toimii jatkuvasti ytimen kanssa.

Ydin on osa käyttöjärjestelmää ja on rajapinnan kanssa laitteistoon. Koko käyttöjärjestelmä elää

Virtuaalikone

Joten sinulla on tietokone, joka käyttää MacOS-sovellusta, ja sovellus, joka on rakennettu toimimaan Ubuntun kanssa. Hmmm… Yksi yleisimmistä ratkaisuista on käynnistää virtuaalikone MacOS-tietokoneellesi, joka ajaa Ubuntua, ja suorittaa sitten ohjelma siellä.

Virtuaalikone koostuu jonkinasteisesta laitteiston ja ytimen virtualisoinnista, jolla suoritetaan vieraskäyttöjärjestelmä. Hypervisor-niminen ohjelmistotiedosto luo virtualisoidun laitteiston, joka voi sisältää virtuaalisen levyn, virtuaalisen verkkoliittymän, virtuaalisen CPU: n ja paljon muuta. Virtuaalikoneisiin kuuluu myös vierasydin, joka voi puhua tämän virtuaalisen laitteiston kanssa.

Hypervalvoja voidaan isännöidä, mikä tarkoittaa, että jotkut ohjelmistot toimivat Host OS: ssä (MacOS) kuten esimerkissä. Se voi olla myös paljaa metallia, juokseen suoraan konelaitteistoon (korvaa käyttöjärjestelmäsi). Joka tapauksessa hypervisor-lähestymistapaa pidetään raskaana, koska se vaatii useiden osien, ellei koko laitteiston ja ytimen, virtualisoinnin.

Kun samassa koneessa on oltava useita erillisiä ryhmiä, VM: n ajaminen jokaiselle näistä ryhmistä on aivan liian raskas ja resurssien tuhlausta, jotta se olisi hyvä lähestymistapa.

Yläpuolella ei mittakaavassa.

VM: t vaativat laitteistovirtualisointia koneen tason eristämistä varten, kun taas säilöt toimivat eristämisessä samassa käyttöjärjestelmässä. Ylitysero tulee todella ilmeiseksi, kun eristyneiden tilojen lukumäärä kasvaa. Tavallinen kannettava tietokone voi ajaa kymmeniä kontteja, mutta voi vaikeuttaa jopa yhden VM: n käyttöä.

cgroups

Vuonna 2006 Googlen insinöörit keksivät Linuxin "ohjausryhmät", lyhennettyinä ryhmiksi. Tämä on Linux-ytimen ominaisuus, joka eristää ja hallitsee resurssien käyttöä käyttäjäprosesseissa.

Nämä prosessit voidaan laittaa nimiavaruuksiin, lähinnä prosessikokoelmiin, joilla on samat resurssirajoitukset. Tietokoneella voi olla useita nimiavaroja, joista jokaisessa ydin on asettanut resurssiominaisuudet.

Resurssien allokointia nimitilaa kohti voidaan hallita kokonaisen suorittimen, RAM: n jne. Määrän rajoittamiseksi, jota prosessisarja voi käyttää. Esimerkiksi taustalokien yhdistämissovelluksella on todennäköisesti oltava resurssiraja, jotta se ei vahingossa ylikuormittaisi todellista palvelinta, jota se kirjaa.

Vaikka Linux-ryhmät eivät olleetkaan alkuperäisiä ominaisuuksia, ne lopulta muutettiin sisällyttämään nimitilan eristämiseen tarkoitettu ominaisuus. Itse nimitilan eristämisestä ei ole uusi, ja Linuxillä oli jo monenlaista nimitilan eristämistä. Yksi yleinen esimerkki on prosessieristys, joka erottaa kunkin prosessin ja estää sellaisia ​​asioita kuin jaettu muisti.

Ryhmän eristäminen on korkeampi eristysaste, joka varmistaa, että ryhmän nimitilassa olevat prosessit ovat riippumattomia prosesseista muissa nimitiloissa. Muutamia tärkeitä nimitilan eristämisominaisuuksia on kuvattu alla ja ne muodostavat perustan eristykselle, jota odotamme kontteista.

  • PID (Process Identifier) ​​nimitilat: tämä varmistaa, että yhden nimitilan sisällä olevat prosessit eivät ole tietoisia prosessista muissa nimitiloissa.
  • Verkon nimitilat: Verkkokortin ohjaimen, iptable-ohjelmien, reititystaulukoiden ja muiden alemman tason verkkotyökalujen eristäminen.
  • Yhdistä nimitilat: Tiedostojärjestelmät on asennettu, joten nimitilan tiedostojärjestelmän laajuus on rajoitettu vain asennettuihin hakemistoihin.
  • Käyttäjän nimitilat: Rajoittaa nimitilan käyttäjät vain kyseiseen nimitilaan ja välttää käyttäjätunnusten ristiriitoja nimitilojen välillä.

Yksinkertaisesti sanottuna, jokainen nimitila näyttäisi olevan oma kone prosessissa oleville koneille.

Linux-astiat

Linux-ryhmät loivat tietä linuxkonttien (LXC) nimeltä tekniikalle. LXC oli todella ensimmäinen merkittävä toteutus siihen, mitä tunnemme tänään olevan kontti, hyödyntämällä ryhmiä ja nimitilan eristämistä luodakseen virtuaaliympäristön erillisellä prosessi- ja verkottotilalla.

Tietyssä mielessä tämä sallii itsenäiset ja eristetyt käyttäjätilat. Konttien ajatus seuraa suoraan LXC: ltä. Itse asiassa Dockerin aiemmat versiot rakennettiin suoraan LXC: n päälle.

Satamatyöläinen

Docker on yleisimmin käytetty konttitekniikka ja oikeasti mitä useimmat ihmiset tarkoittavat, kun viitataan kontteihin. Vaikka on myös muita avoimen lähdekoodin konttitekniikoita (kuten CoreOS: n rkt) ja suuret yritykset, jotka rakentavat oman konttimoottorinsa (kuten lmctfy Googlessa), Dockerista on tullut alan standardointi konttivalmistukselle. Se on edelleen rakennettu Linux-ytimen ja äskettäin myös Windowsin tarjoamiin ryhmiin ja nimitilaan.

Kuvalähde: Docker

Docker-säilö koostuu kerroskuvista, binaareista, jotka on pakattu yhteen pakettiin. Peruskuva sisältää säilön käyttöjärjestelmän, joka voi olla erilainen kuin isäntäkoneen käyttöjärjestelmä.

Säiliön käyttöjärjestelmä on muodossa kuva. Tämä ei ole täydellinen käyttöjärjestelmä kuin isäntäkoneessa, ja ero on siinä, että kuva on vain käyttöjärjestelmän tiedostojärjestelmä ja binäärit, kun taas koko käyttöjärjestelmä sisältää tiedostojärjestelmän, binäärit ja ytimen.

Peruskuvan päällä on useita kuvia, jotka kukin muodostavat osan säiliöstä. Peruskuvan päällä voi olla esimerkiksi kuva, joka sisältää apt-get-riippuvuudet. Sen päällä voi olla kuva, joka sisältää sovelluksen binaarisen jne.

Viileä osa on, jos kuvakerroksilla a, b, c ja a, b, d on kaksi säilytyspaikkaa, sinun on tallennettava vain yksi kopio jokaisesta kuvakerroksesta a, b, c, d sekä paikallisesti että arkistossa . Tämä on Dockerin unionitiedostojärjestelmä.

Jokainen kuva, joka on tunnistettu hajautuksella, on vain yksi monista mahdollisista kuvakerroksista, jotka muodostavat säiliön. Säiliö tunnistetaan kuitenkin vain sen ylimmän tason kuvan perusteella, jolla on viittauksia vanhemmuuskuviin. Kaksi täällä näkyvää ylätason kuvaa (kuva 1 ja kuva 2) jakavat kolme ensimmäistä kerrosta. Kuvassa 2 on kaksi muuta kokoonpanoon liittyvää kerrosta, mutta siinä on samat vanhemmat kuvat kuin kuvassa 1.

Kun säilö käynnistetään, kuva ja sen vanhemmat kuvat ladataan reposta, ryhmä ja nimitilat luodaan ja kuvaa käytetään virtuaalisen ympäristön luomiseen. Säiliön sisällä kuvassa määritetyt tiedostot ja binaarit näyttävät olevan ainoat tiedostot koko koneessa. Sitten säilön pääprosessi aloitetaan ja säilön katsotaan olevan elossa.

Dockerilla on joitain muita todella hienoja ominaisuuksia, kuten kopioiminen kirjoitettaessa, taltioita (jaetut tiedostojärjestelmät säilytystilojen välillä), Docker-demoni (hallitsee säiliöitä koneella), versioohjatut arkistot (kuten Github kontteille) ja paljon muuta. Tämä Medium-artikkeli on erittäin hyödyllinen oppiaksesi heistä lisää ja nähdäksesi joitain käytännön esimerkkejä Dockerin käytöstä.

Komentoriviasiakas (1) kertoo koneen prosessille, jota kutsutaan docker-daemoniksi (2), mitä tehdä. Daemon vetää kuvia rekisteristä / arkistosta (3). Nämä kuvat on välimuistissa (4) paikallisella koneella, ja daemon voi käynnistää ne konttien (5) suorittamiseksi. Kuvalähde: Docker

Miksi kontit

Prosessieristyksen lisäksi säiliöillä on monia muita hyödyllisiä ominaisuuksia.

Säiliö toimii itsenäisenä eristeenä, joka voi ajaa minne tahansa sitä tukevana. Ja kussakin näissä tapauksissa säiliö itsessään on täsmälleen sama. Sillä ei ole väliä, onko isäntäjärjestelmän käyttöjärjestelmä CentOS, Ubuntu, MacOS vai edes jotain muuta kuin UNIX-tyyppistä, kuten Windows - säilytysosasta käyttöjärjestelmä on mikä tahansa käyttöjärjestelmä, jonka säiliö määrittää. Voit siis olla varma, että kannettavalle tietokoneellesi rakennettu säilö toimii myös yrityksen palvelimilla.

Säiliö toimii myös standardoiduna työ- tai laskentayksikkönä. Yhteinen malli on, että jokaisella säilöllä on yksi web-palvelin, yksi tietokannan sirpu tai yksi Spark-työntekijä jne.. Sitten sovelluksen skaalaamiseksi sinun on yksinkertaisesti mitoitettava säilytysasteiden lukumäärä.

Tässä paradigmassa jokaiselle säilölle annetaan kiinteä resurssikokoonpano (CPU, RAM, säikeiden lukumäärä jne.) Ja sovelluksen skaalaaminen vaatii skaalaamaan vain konttien lukumäärän yksittäisten resurssiprimatiivien sijaan. Tämä tarjoaa suunnittelijoille paljon helpomman abstraktin, kun sovelluksia täytyy skaalata ylös tai alas.

Kontit toimivat myös loistavana työkaluna mikropalveluarkkitehtuurin toteuttamisessa, jolloin jokainen mikropalvelu on vain joukko yhteistyössä toimivia säiliöitä. Esimerkiksi Redis-mikropalvelu voidaan toteuttaa yhdellä isäntäkontin ja useilla orjakonteilla.

Tällä (mikro) palvelukeskeisellä arkkitehtuurilla on joitain erittäin tärkeitä ominaisuuksia, jotka helpottavat suunnittelutiimien luomista ja käyttöönottoa (katso aikaisempi artikkeli saadaksesi lisätietoja).

Orkestrointi

Siitä lähtien, kun linux-astioita, käyttäjät ovat yrittäneet ottaa käyttöön laaja-alaisia ​​sovelluksia monien virtuaalikoneiden, joissa jokainen prosessi kulkee omassa säilytysastiassa. Tämän tekeminen vaatii kykyä ottaa tehokkaasti käyttöön kymmeniä tuhansia säilöjä mahdollisesti satojen virtuaalikoneiden välillä ja hallita niiden verkostoitumista, tiedostojärjestelmiä, resursseja jne.. Docker tekee tämän tänään hiukan helpommaksi, koska se paljastaa abstraktiot konttiverkon määrittämiseen, tiedostojen määrät järjestelmät, resurssien kokoonpanot jne.

Työkalua tarvitaan kuitenkin edelleen:

  • todella ottaa spesifikaatio ja määrittää kontit koneille (ajoittaminen)
  • Käynnistä määritetyt säilytyskoneet koneissa Dockerin kautta
  • käsitellä päivityksiä / palautuksia / järjestelmän jatkuvasti muuttuvaa luonnetta
  • reagoi virheisiin, kuten kontti kaatuu
  • ja luoda klusterresursseja, kuten palveluiden etsiminen, VM-verkkojen välinen verkostoituminen, klusterien sisäänpääsy / poistuminen jne.

Tämä ongelmajoukko liittyy hajautetun järjestelmän organisointiin, joka on rakennettu joukkoon (mahdollisesti ohimeneviä tai jatkuvasti muuttuvia) astioita, ja ihmiset ovat rakentaneet todella ihmeellisiä järjestelmiä tämän ongelman ratkaisemiseksi.

Seuraavassa tarinassani puhun perusteellisesti Kubernetesin, suurimman avoimen lähdekoodin orkesterin, toteutuksesta yhdessä kahden yhtä tärkeän, mutta vähemmän tunnetun kanssa, Mesos ja Borg.

Tämä tarina on osa sarjaa. Olen ala-aste UC Berkeleyssä. Tutkimukseni on hajautettuissa järjestelmissä, ja Scott Shenker neuvoo minua.

Edellinen: Kuinka Microservices tallensi Internetin
Seuraava: Orkestrointi (TBD)