Kubernetes Àr ett utmÀrkt verktyg för att köra Docker-containrar i en klustrad produktionsmiljö. Men det finns uppgifter som Kubernetes inte kan lösa. Vid frekvent distribution i produktionsmiljö behöver vi en helt automatiserad Blue/Green-distribution för att undvika driftstopp i denna process, dÀr det ocksÄ Àr nödvÀndigt att hantera externa HTTP-förfrÄgningar och genomföra SSL-avlastning. Detta krÀver integration med en lastbalanserare, sÄsom ha-proxy. En annan uppgift Àr semi-automatiserad skalning av sjÀlva Kubernetes-klustret nÀr man arbetar i molnmiljö, till exempel delvis nedskalning av klustret under nattetid.
Ăven om Kubernetes inte har dessa funktioner direkt "ur lĂ„dan", erbjuder det ett API som kan anvĂ€ndas för att lösa sĂ„dana uppgifter. Verktyg för automatiserad Blue/Green-distribution och skalning av Kubernetes-klustret har utvecklats inom projektet Cloud RTI, som skapats baserat pĂ„ öppen programvara.
I denna artikel, en avkodning av videon, diskuteras hur man konfigurerar Kubernetes tillsammans med andra komponenter med öppen kÀllkod för att skapa en produktionsklar miljö som oavbrutet tar emot kod frÄn git commit.

SÄ snart du har fÄtt tillgÄng till dina applikationer frÄn den externa vÀrlden, kan du pÄbörja den fullstÀndiga automatiseringsinstÀllningen, det vill sÀga att ta den till en punkt dÀr du kan göra en git commit och vara sÀker pÄ att denna git commit nÄr produktionen. Naturligtvis vill vi inte uppleva driftstopp vid genomförandet av dessa steg under distributionen. SÄ varje automatisering i Kubernetes börjar med API:et.

Kubernetes Àr inte ett verktyg som kan anvÀndas produktivt "direkt ur lÄdan". SjÀlvklart kan du göra sÄ, anvÀnda kubectl och sÄ vidare, men API:et Àr ÀndÄ det mest intressanta och anvÀndbara med denna plattform. Genom att anvÀnda API:et som en uppsÀttning funktioner kan du fÄ tillgÄng till nÀstan allt du vill göra i Kubernetes. Kubectl sjÀlv anvÀnder ocksÄ REST API.
Det hÀr Àr REST, sÄ du kan anvÀnda vilket sprÄk och verktyg som helst för att arbeta med det hÀr API:et, men anvÀndarbiblioteken kommer att göra ditt liv betydligt enklare. Mitt team har skrivit tvÄ sÄdana bibliotek: ett för Java / OSGi och ett för Go. Det andra anvÀnds inte sÄ ofta, men ni har dessa anvÀndbara verktyg tillgÀngliga. De utgör ett delvis licensierat open-source-projekt. Det finns mÄnga sÄdana bibliotek för olika sprÄk, sÄ du kan vÀlja de som passar bÀst.

SÄ innan du börjar automatisera distributionen, Àr det viktigt att sÀkerstÀlla att denna process inte drabbas av nÄgra driftstopp. Till exempel genomför vÄrt team produktiondistribution mitt pÄ dagen, nÀr folk anvÀnder applikationerna som mest, sÄ det Àr mycket viktigt att undvika förseningar i denna process. För att undvika driftstopp anvÀnds tvÄ metoder: blue/green distribution eller glidande uppdatering (rolling update). I det senare fallet, om du har fem replikas av applikationen, uppdateras de sekventiellt en efter en. Denna metod fungerar utmÀrkt, men den Àr inte lÀmplig om du har olika versioner av applikationen som körs samtidigt under distributionsprocessen. I sÄ fall kan du uppdatera anvÀndargrÀnssnittet medan backend fortfarande arbetar med den gamla versionen, vilket skulle innebÀra att applikationen skulle upphöra att fungera. DÀrför Àr det ganska komplicerat ur en programmeringssynvinkel att arbeta i sÄdana förhÄllanden.
Detta Àr en av anledningarna till att vi föredrar att anvÀnda blue/green deployment för att automatisera distributionen av vÄra applikationer. Med denna metod mÄste du sÀkerstÀlla att endast en version av applikationen Àr aktiv vid en given tidpunkt.
Blue/green deployment-mekanismen fungerar enligt följande. Vi fÄr trafik till vÄra applikationer via ha-proxy, som dirigerar det till de körande replikas av applikationen med samma version.
NÀr en ny distribution görs anvÀnder vi Deployer, som tillhandahÄlls nya komponenter, och den genomför distributionen av den nya versionen. Distributionen av den nya versionen av applikationen innebÀr att en ny uppsÀttning repliker "startas", och dessa repliker av den nya versionen körs i en separat, ny pod. Men ha-proxy har ingen kÀnnedom om dem och dirigerar fortfarande ingen arbetsbelastning till dem.
DÀrför Àr det i första hand nödvÀndigt att utföra en hÀlsokontroll av de nya versionerna för att sÀkerstÀlla att replikerna Àr redo att hantera belastningen.

Alla distributionskomponenter mÄste stödja nÄgon form av hÀlsokontroll. Detta kan vara en mycket enkel kontroll med en HTTP-anrop, dÀr du fÄr en statuskod 200, eller en mer djupgÄende kontroll dÀr du kontrollerar replikerna med databasen och andra tjÀnster, stabiliteten i förbindelserna i den dynamiska miljön, och att allt startar och fungerar korrekt. Denna process kan vara ganska komplex.

NÀr systemet har verifierat att alla uppdaterade repliker fungerar, kommer Deployer att uppdatera konfigurationen och överföra rÀtt confd, som omkonfigurerar ha-proxy.

Först efter detta kommer trafiken att dirigeras till podden med repliker av den nya versionen, medan den gamla podden försvinner.

Denna mekanism Àr inte unik för Kubernetes. Konceptet med Blue/green deployment har funnits lÀnge, och det har alltid anvÀnt en lastbalanserare. Först dirigerar du all trafik till den gamla versionen av applikationen, och efter uppdateringen vÀxlar du helt över till den nya versionen. Detta princip gÀller inte bara i Kubernetes.
Nu ska jag introducera er till den nya distributionskomponenten â Deployer, som utför hĂ€lsokontroller, omkonfigurerar proxy och sĂ„ vidare. Detta Ă€r ett koncept som inte rör det externa vĂ€rlden och existerar inom Kubernetes. Jag kommer att visa hur man kan skapa sitt egna Deployer-koncept med hjĂ€lp av open source-verktyg.
SÄ, det första Deployer gör Àr att skapa en replikationskontroller RC med hjÀlp av Kubernetes API. Detta API skapar pods och tjÀnster för vidare distribution, det vill sÀga det skapar ett helt nytt kluster för vÄra applikationer. SÄ snart RC har bekrÀftat att replikerna har startat, gör den en statuskontroll av deras funktion, Health check. För detta anvÀnds kommandot GET /health i Deployer. Det aktiverar motsvarande kontrollkomponenter och kontrollerar alla element som gör att klustret fungerar.

NĂ€r alla pods har rapporterat sitt "hĂ€lsotillstĂ„nd", skapar Deployer en ny konfigurationspost â ett distribuerat lagringssystem etcd, som anvĂ€nds internt inom Kubernetes, inklusive för att lagra konfigurationen för lastbalanseraren. Vi skriver data till etcd, och ett litet verktyg, confd, övervakar etcd för nya data.
Om det upptÀcker nÄgra Àndringar i den ursprungliga konfigurationen, genererar det en ny konfigurationsfil och överför den till ha-proxy. I detta fall startar ha-proxy om utan att förlora nÄgra anslutningar och dirigerar belastningen till de nya tjÀnster som stöder den nya versionen av vÄra applikationer.

Som ni ser, trots mĂ€ngden komponenter, finns det inget svĂ„rt hĂ€r. Du behöver bara Ă€gna mer uppmĂ€rksamhet Ă„t API och etcd. Jag vill berĂ€tta om en open-source-deployer som vi sjĂ€lva anvĂ€nder â Amdatu Kubernetes Deployer.

Detta Àr ett verktyg för orkestrering av Kubernetes-distributioner, med följande funktioner:
- Blue/Green distribution;
- konfiguration av extern lastbalanserare;
- hantering av distributionsbeskrivningar;
- hantering av den faktiska distributionen;
- hÀlsokontroller under distributionen;
- införande av miljövariabler i pods.
Denna Deployer Àr byggd ovanpÄ Kubernetes API och erbjuder ett REST API för hantering av beskrivningar och distributioner, samt Websocket API för strömmande loggar under distributionen.
Den placerar konfigurationsdata för lastbalanseraren i etcd, sÄ att du kan anvÀnda din egen lastbalanseringskonfigurationsfil istÀllet för ha-proxy med "out-of-the-box"-stöd. Amdatu Deployer Àr skriven i Go, precis som Kubernetes, och Àr licensierad under Apache.
Innan jag började anvÀnda denna version av deployern anvÀnde jag följande distributionsbeskrivare, dÀr jag angav de parametrar jag behövde.

En av de viktiga parametrarna i denna kod Àr aktiveringen av flaggan "useHealthCheck". Vi behöver specificera att hÀlsokontroller mÄste utföras under distributionen. Denna parameter kan stÀngas av nÀr tredjepartscontainrar anvÀnds i distributionen som inte behöver kontrolleras. I denna beskrivare anges Àven antalet repliker och URL:en för frontenden som behövs av ha-proxy. I slutet anges flaggan för podspecifikationen "podspec" som hÀnvisar till Kubernetes för att hÀmta information om portkonfigurationer, bilder etc. Detta Àr en ganska enkel beskrivare i JSON-format.
Ett annat verktyg som Àr en del av open-source-projektet Amdatu, Àr Deploymentctl. Det har ett anvÀndargrÀnssnitt (UI) för konfiguration av distributionen, lagrar distributionshistorik och innehÄller webhooks för callbacks frÄn tredjepartsanvÀndare och utvecklare. Du behöver inte anvÀnda UI, eftersom Amdatu Deployer sjÀlv Àr ett REST API, men detta grÀnssnitt kan avsevÀrt underlÀtta din distribution utan att involvera nÄgot API. Deploymentctl Àr skrivet i OSGi/Vertx med hjÀlp av Angular 2.
Nu kommer jag att visa det som sagts ovan pÄ skÀrmen, genom att anvÀnda en förinspelad video, sÄ att du inte behöver vÀnta. Vi kommer att distribuera en enkel applikation pÄ Go. Oroa dig inte om du inte har stött pÄ Go tidigare, detta Àr en mycket enkel applikation, sÄ allt bör vara klart för dig.

HĂ€r skapar vi en HTTP-server som bara svarar pĂ„ /health, sĂ„ denna applikation Ă€r endast avsedd för att kontrollera hĂ€lsokontrollen och inget mer. Om kontrollen lyckas aktiveras den JSON-struktur som visas nedan. Den innehĂ„ller versionen av applikationen som kommer att distribueras av deployern, meddelandet som du ser i toppen av filen, samt en boolean datatyp â om vĂ„r applikation Ă€r fungerande eller inte.
I den sista raden fuskar jag lite, eftersom jag placerade ett fast boolean-vÀrde högst upp i filen, vilket senare kommer att hjÀlpa mig att distribuera Àven en "ohÀlsosam" applikation. Vi kommer att gÄ igenom detta senare.
LÄt oss börja. Först kontrollerar vi om det finns nÄgra aktiva pods genom att köra kommandot ~ kubectl get pods och, genom att inte fÄ nÄgot svar pÄ front-end-URL:en, bekrÀftar vi att inga distributioner för nÀrvarande pÄgÄr.

NÀsta pÄ skÀrmen ser ni det grÀnssnitt för Deploymentctl som jag nÀmnde, dÀr distributionsparametrarna stÀlls in: namnrymden, applikationsnamnet, distributionsversionen, antalet repliker, front-end-URL:en, containerinÀnget, bilden, resursgrÀnserna, portnumret för hÀlsokontrollen, och sÄ vidare. ResursgrÀnserna Àr mycket viktiga eftersom de möjliggör maximal anvÀndning av hÄrdvaran. HÀr kan vi ocksÄ se distributionsloggen Deployment log.

Om vi nu upprepar kommandot ~ kubectl get pods, kan vi se att systemet "fryser" i 20 sekunder, under vilka ha-proxy rekonfigureras. Efter det startas podden, och vi kan se vÄr replika i distributionsloggen.

Jag har klippt ut de 20 sekunder av vÀntan frÄn videon, och nu ser ni pÄ skÀrmen att den första versionen av applikationen har distribuerats. Detta gjordes enbart med hjÀlp av UI.

LÄt oss nu försöka med den andra versionen. För detta Àndrar jag applikationens meddelande frÄn "Hello, Kubernetes!" till "Hello, Deployer!", systemet skapar denna bild och placerar den i Docker-registret, varefter vi bara trycker pÄ knappen "Deploy" igen i fönstret Deploymentctl. Detta startar automatiskt distributionsloggen precis som det gjorde under distributionen av den första versionen av applikationen.

Kommandot ~ kubectl get pods visar att det för nÀrvarande finns 2 versioner av applikationen aktiva, men front-end visar att vi fortfarande kör version 1.

Lastbalanseraren vÀntar pÄ att hÀlsokontrollen ska genomföras, varefter trafiken kommer att omdirigeras till den nya versionen. Efter 20 sekunder vÀxlar vi till curl och ser att vi nu har distribuerat version 2 av applikationen, medan den första har tagits bort.

Detta var distributionen av en "hÀlsosam" applikation. LÄt oss se vad som hÀnder om jag Àndrar vÀrdet pÄ parametern Healthy för den nya versionen av applikationen frÄn true till false, det vill sÀga om jag försöker distribuera en ohÀlsosam applikation som inte klarade hÀlsokontrollen. Detta kan hÀnda om det under utvecklingen har förekommit konfigurationsfel i applikationen, och den skickas till produktion i detta skick.
Som du kan se, gÄr distributionen igenom alla de ovan nÀmnda stegen, och ~ kubectl get pods visar att bÄda poddar Àr igÄng. Men till skillnad frÄn den tidigare distributionen visar loggen ett timeout-tillstÄnd. Det innebÀr att eftersom health check inte lyckades kan den nya versionen av applikationen inte distribueras. Som ett resultat ser du att systemet ÄtergÄr till att anvÀnda den gamla versionen av applikationen, medan den nya versionen bara har tagits bort.

Det bÀsta med detta Àr att Àven om du har ett stort antal samtidiga förfrÄgningar som kommer till applikationen, kommer de knappt mÀrka av nÄgra driftstopp under distributionsproceduren. Om man testar denna applikation med hjÀlp av Gatling-ramverket, som skickar sÄ mÄnga förfrÄgningar som möjligt, sÄ kommer ingen av dessa förfrÄgningar att avvisas. Det betyder att vÄra anvÀndare knappt kommer att mÀrka uppdateringar av versionerna i realtid. Om det skulle misslyckas, fortsÀtter arbetet pÄ den gamla versionen; om det lyckas, flyttas anvÀndarna till den nya versionen.
Det finns bara en sak som kan leda till misslyckande â om health check gick igenom framgĂ„ngsrikt, men applikationen kraschade sĂ„ snart den fick arbetsbelastning, det vill sĂ€ga kollapsen intrĂ€ffar först efter att distributionen Ă€r klar. I sĂ„ fall mĂ„ste du manuellt Ă„tergĂ„ till den gamla versionen. SĂ„, vi har sett hur man anvĂ€nder Kubernetes med avsedda open-source-verktyg. Distributionsproceduren kommer att gĂ„ mycket smidigare om du integrerar dessa verktyg i Build/Deploy pipelines. För att starta distributionen kan du anvĂ€nda bĂ„de anvĂ€ndargrĂ€nssnittet och helt automatisera denna process, till exempel genom att göra en commit till master.

VÄr Build Server skapar en Docker-avbildning, lÀgger den i Docker Hub eller vilket register du anvÀnder. Docker Hub stöder webhook, sÄ vi kan starta en fjÀrrdistribution genom Deployer pÄ det sÀtt som visades ovan. PÄ sÄ sÀtt kan hela distributionen av applikationen till potentiell produktion automatiseras.
LĂ„t oss gĂ„ vidare till nĂ€sta Ă€mne â skalning av Kubernetes-klustret. Jag vill pĂ„peka att kommandot kubectl Ă€r ett skalningskommando. Med det kan vi enkelt öka antalet repliker i vĂ„rt befintliga kluster. Men i praktiken vill vi oftast öka antalet noder, inte pods.

Under arbetstid kan det hÀnda att du behöver öka antalet instanser, medan det pÄ natten, för att minska kostnaderna för Amazon, kan vara nödvÀndigt att minska antalet körande instanser av din applikation. Det betyder inte att det rÀcker med att bara skala antalet pods, eftersom Àven om en av noderna Àr oanvÀnd, mÄste du ÀndÄ betala för den till Amazon. SÄledes, förutom att skala pods, behöver du Àven skala antalet anvÀnda maskiner.
Detta kan skapa problem, eftersom oavsett om vi anvÀnder Amazon eller nÄgon annan molntjÀnst, vet Kubernetes ingenting om antalet anvÀnda maskiner. Det saknas ett verktyg som kan skala systemet pÄ nodnivÄ.

SÄ vi mÄste ta hand om bÄde noder och pods. Vi kan enkelt skala upp nya noder med hjÀlp av AWS API och autoskalningsgrupper för att konfigurera antalet arbetsnoder i Kubernetes. Det gÄr ocksÄ att anvÀnda cloud-init eller ett liknande skript för att registrera noder i Kubernetes-klustret.
Den nya maskinen startar i Scaling group, registrerar sig sjÀlv som en nod, skrivs in i masterregistren och börjar arbeta. Efter detta kan antalet repliker ökas för att utnyttja de bildade noderna. NedskÀrning krÀver större anstrÀngningar, eftersom det Àr nödvÀndigt att sÀkerstÀlla att ett sÄdant steg inte leder till att redan fungerande applikationer förstörs efter att "onödiga" maskiner har stÀngts av. För att förhindra detta scenario mÄste noderna sÀttas till statusen "unschedulable". Det innebÀr att schemalÀggaren, vid schemalÀggning av DaemonSet-pods, kommer att ignorera dessa noder. SchemalÀggaren kommer inte att ta bort nÄgon information frÄn dessa servrar, men inte heller starta nya containrar dÀr. Det följande steget Àr att drÀnera noden, det vill sÀga att flytta de fungerande pods frÄn den till en annan maskin eller andra noder med tillrÀcklig kapacitet. NÀr det har sÀkerstÀllts att det inte finns nÄgra containrar kvar pÄ dessa noder kan de tas bort frÄn Kubernetes. Efter detta kommer de helt enkelt att upphöra att existera för Kubernetes. DÀrefter behöver AWS API anvÀndas för att stÀnga av onödiga noder eller maskiner.
Du kan anvĂ€nda Amdatu Scalerd â ett annat open-source verktyg för skalning, liknande AWS API. Det erbjuder CLI för att lĂ€gga till eller ta bort noder i klustret. Dess intressanta funktion Ă€r möjligheten att konfigurera schemalĂ€ggaren med hjĂ€lp av följande json-fil.

Koden som visas minskar kapaciteten i klustret med hÀlften under nattperioden. Den stÀller in bÄde antalet befintliga repliker och den önskade kapaciteten för Amazon-klustret. AnvÀndningen av denna schemalÀggare kommer automatiskt att minska antalet noder pÄ natten och öka dem pÄ morgonen, vilket sparar kostnaden för anvÀndning av sÄdana noder frÄn en molntjÀnst som Amazon. Denna funktion Àr inte inbyggd i Kubernetes, men anvÀndningen av Scalerd kommer att lÄta dig skala denna plattform hur som helst.
Jag vill uppmÀrksamma er pÄ att mÄnga mÀnniskor sÀger till mig: "Det hÀr Àr allt bra, men vad hÀnder med min databas som vanligtvis Àr statisk?" Hur kan man fÄ nÄgot liknande att fungera i en sÄ dynamisk miljö som Kubernetes? Enligt min Äsikt bör ni inte göra det, ni bör inte försöka organisera databashantering i Kubernetes. Tekniskt sett Àr det möjligt, och det finns guider om detta pÄ internet, men det kommer att komplicera ert liv avsevÀrt.
Ja, det finns begreppet bestÀndiga lagringslösningar i Kubernetes, och ni kan försöka köra databaser som Mongo eller MySQL, men det Àr en ganska arbetsintensiv uppgift. Detta beror pÄ att databaser inte helt stöder interaktion med en dynamisk miljö. De flesta databaser krÀver betydande konfiguration, inklusive manuell klusterinstÀllning, gillar inte automatiserad skalning och liknande.
SÄ det Àr inte vÀrt att komplicera ert liv genom att försöka köra en databas i Kubernetes. Organisera deras arbete pÄ det traditionella sÀttet med hjÀlp av bekanta tjÀnster och lÄt Kubernetes anvÀnda dem.

Avslutningsvis vill jag introducera er för Cloud RTI-plattformen baserad pÄ Kubernetes, som mitt team arbetar med. Den erbjuder centraliserad loggning, övervakning av applikationer och kluster och har mÄnga andra anvÀndbara funktioner som ni kommer att ha nytta av. Den anvÀnder olika open-source verktyg, sÄsom Grafana för att visa övervakning.


Det stĂ€lldes en frĂ„ga om varför man ska anvĂ€nda lastbalanseraren ha-proxy med Kubernetes. Bra frĂ„ga, eftersom det för nĂ€rvarande finns tvĂ„ nivĂ„er av lastbalansering. Kubernetes-tjĂ€nster Ă€r fortfarande pĂ„ virtuella IP-adresser. Ni kan inte anvĂ€nda dem för portar pĂ„ externa vĂ€rd-maskiner, eftersom om Amazon överbelastar sin molnserver kommer adressen att Ă€ndras. Det Ă€r dĂ€rför vi placerar ha-proxy framför tjĂ€nsterna â för att skapa en mer statisk struktur för sömlös trafikinteraktion med Kubernetes.
Ănnu en bra frĂ„ga â hur kan man hantera förĂ€ndringar i databasstrukturen vid blue/green deployment? Faktum Ă€r att oavsett om man anvĂ€nder Kubernetes, sĂ„ Ă€r det en komplex uppgift att Ă€ndra databasstrukturen. Du mĂ„ste sĂ€kerstĂ€lla kompatibilitet mellan den gamla och den nya strukturen, och först dĂ€refter kan du uppdatera databasen och sedan sjĂ€lva applikationerna. Du kan genomföra en 'hot swapping' av databasen och sedan uppdatera applikationerna. Jag kĂ€nner folk som har laddat upp ett helt nytt databascluster med en ny struktur, vilket Ă€r ett alternativ om du har en schemaless databas som Mongo, men i vilket fall som helst Ă€r det inte en enkel uppgift. Om det inte finns fler frĂ„gor, tack för uppmĂ€rksamheten!

Lite reklam đ
Tack för att ni stannar kvar hos oss. Gillar ni vÄra artiklar? Vill ni se fler intressanta material? Stöd oss genom att göra en bestÀllning eller rekommendera oss till era vÀnner, , en unik motsvarighet till entry-level servrar som vi har skapat för er: (alternativ med RAID1 och RAID10 finns tillgÀngliga, upp till 24 kÀrnor och upp till 40GB DDR4).
Dell R730xd Ă€r tvĂ„ gĂ„nger billigare i datacentret Equinix Tier IV i Amsterdam? Bara hos oss i NederlĂ€nderna! Dell R420 â 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB â frĂ„n $99! LĂ€s om
KĂ€lla: habr.com
