Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

8. aprill konverentsil Saint HighLoad++ 2019, DevOps ja haldamise sektsiooni raames toimus ettekande "Kubernetesi laiendamine ja tĂ€iendamine" esitus, mille koostamisel osalesid kolm ettevĂ”tte "Flant" töötajat. Selles rÀÀgime mitmetest olukordadest, kus soovisime Kuberneteset laiendada ja tĂ€iendada, kuid ei leidnud selleks valmis ja lihtsat lahendust. Vajalikud lahendused ilmusid meile Open Source projektide nĂ€ol, millele see ettekande ka pĂŒhendatud.

Traditsiooniliselt oleme uhked esitama ettekande video vaatamiseks (50 minutit, palju informatiivsem kui artikkel) ja peamise kokkuvÔtte tekstivormis. Alustame!

K8si tuum ja lisandused

Kubernetes muudab valdkonda ja administreerimise lÀhenemisi, mis on juba ammu kindlaks kujunenud:

  • TĂ€nu tema abstraktsioonidele, opereme me enam mitte selliste mĂ”istetega nagu konfi seadistamine vĂ”i kĂ€su kĂ€ivitamine (Chef, Ansible
), vaid kasutame konteinerite rĂŒhmitamist, teenuseid jne.
  • Saame rakendusi valmistada, mĂ”tlemata konkreetse platvormi, millel see kĂ€ivitub: bare metal, ĂŒhe teenusepakkuja pilv jne.
  • K8si abil on muutunud kergemaks parimate praktikate kasutamine infrastruktuuri korraldamise osas: skaleerimise, enesetĂ€iustamise, vigade taastumise tehnikaid jne.

Kuid loomulikult ei ole kÔik nii sujuv: koos Kubernetesega tulid ka uued vÀljakutsed.

Kubernetes ei on kombain, mis lahendab kÔigi kasutajate probleemid. Tuuma Kubernetes vastutab ainult minimaalsete vajalike funktsioonide komplekti eest, mis on olemas igal klastril:

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

Kubernetes tuum mÀÀratleb pĂ”hikomplekti primitiive — konteinerite rĂŒhmitamiseks, liikluse haldamiseks ning nii edasi. RÀÀkisime neist lĂ€hemalt kahe aasta taguses ettekandes.

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

Teiselt poolt pakub K8s suurepĂ€raseid vĂ”imalusi olemasolevate funktsioonide laiendamiseks, et katta ka teised — spetsiifilised kasutajate vajadused. Kubernetese tĂ€ienduste eest vastutavad klastri administraatorid, kes peavad kĂ”ik vajalikud koostisosad installima ja konfigureerima, et nende klaster "omandaks vajaliku vormi" [nende spetsiifiliste ĂŒlesannete lahendamiseks]. Millised need tĂ€iendused on? Vaatame mĂ”nda nĂ€idet.

TÀienduste nÀited

Kubernetes'i seadistamisel vĂ”ime olla ĂŒllatunud, et pod-ide omavaheline suhtlemine, nii sĂ”lmede sees kui ka nende vahel, ei toimi. Kubernetes'i sĂŒda ei taga vajalikke ĂŒhendusi — selle asemel defineerib see vĂ”rgu liidese (CNI) kolmandate osapoolte pluginatele. Me peame installima ĂŒhe sellise plugina, mis vastutab vĂ”rgu seadistamise eest.

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

LĂ€hedane nĂ€ide — andmesalvestuslahendused (kohalik kett, vĂ”rgutöötlusseade, Ceph...). Alguses olid need sĂŒsteemi sees, kuid koos CSI muutub olukord sarnaseks juba kirjeldatule: Kubernetes'is on liides ja selle teostamine on kolmandate osapoolte moodulites.

Teiste nÀidete seast:

  • Ingress-kontrollerid (ĂŒlevaate saamiseks vt meie hiljutist artiklit).
  • cert-manager:

    Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

  • Operaatorid — on terve rikka klass laiendusi (kuhu kuulub ka mainitud cert-manager), mis mÀÀratleb primitiivid ja kontrollijad. Nende töö loogika on piiratud vaid meie kujutlusvĂ”imega ning vĂ”imaldab muuta olemasolevad infrastruktuuri komponendid (nĂ€iteks andmebaasid) primitiivideks, millega on palju lihtsam töötada (kui konteinerite ja nende seadistuste kogumiga). Operaatoreid on kirjutatud tohutult palju — ja kuigi paljud neist pole veel produzentsiks valmis, on see vaid aja kĂŒsimus:

    Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

  • MÔÔdikud — veel ĂŒks illustratsioon, kuidas Kubernetes eraldas liidese (Metrics API) rakendusest (kolmandate osapoolte laiendused, nagu Prometheus adapter, Datadog cluster agent
)
  • Kuna monitooringu ja statistika, kus praktikas on vajalikud mitte ainult Prometheus ja Grafana, vaid ka kube-state-metrics, node-exporter jpt.

Ja see ei ole kaugeltki tĂ€ielik nimekiri laiendustest
 NĂ€iteks installime meie ettevĂ”ttes „Flant” iga Kubernetes-klastrile tĂ€naseks 29 laiendust (kĂ”ik loovad kokku 249 Kubernetes objekt). TeisisĂ”nu, me ei nĂ€e klastrite elu ilma laiendusteta.

Automatiseerimine

Operaatoreid on loodud rutiinsete toimingute automatiseerimiseks, millega igapÀevaselt kokku puutume. Siin on elust nÀited, mille jaoks oleks optimaalne lahendus operaatori kirjutamine:

  1. On olemas privaatne (s.t. sisselogimist nĂ”udev) register rakenduse piltide jaoks. Eeldatakse, et igale pod’ile seostatakse spetsiaalne saladus, mis vĂ”imaldab autentida ennast registris. Meie ĂŒlesanne on tagada, et see saladus asub nimedruumis, et pod’id saaksid pilte allalaadida. Rakendusi (kellel on igaĂŒhel vaja saladust) vĂ”ib olla vĂ€ga palju ja saladusi on mĂ”istlik regulaarselt uuendada, nii et kĂ€sitsi saladuste paigutamine pole variant. Just siin tulebki abi operaatorist: loome kontrolleri, mis ootab nimedruumi ilmumist ja selle sĂŒndmuse puhul lisab saladuse nimedruumi.
  2. Oletame, et vaikimisi on pod’ide internetiĂŒhendus keelatud. Kuid mĂ”nikord vĂ”ib see vajalik olla: loogiline on, et juurdepÀÀsumehanism töötaks lihtsalt, ilma spetsiifiliste oskuste nĂ”udmiseta — nĂ€iteks teatud silti olemasolu pĂ”hjal namespace’is. Kuidas saab operaator siin abiks olla? Loo kontrollija, mis ootab silti namespace’is ja lisab vastava poliitika internetiĂŒhenduse jaoks.
  3. Sarnane olukord: oletame, et peame lisama sÔlmele teatud taint, kui sellel on samasugune silt (mingi eesliitega). Tegevused operaatoriga on ilmsed


Igas klastris tuleb lahendada rutiinseid ĂŒlesandeid ning Ă”igesti seda teha — operaatorite abil.

KokkuvĂ”tteks kĂ”igist kirjeldatud lugudest jĂ”udsime jĂ€reldusele, et Kuberneteses mugavalt töötamiseks on vajalik: a) paigaldada lisandmooduleid, b) arendada operaatorite (igapĂ€evaste administraatoriĂŒlesannete lahendamiseks).

Kuidas kirjutada Kubernetes'e operaatorit?

Üldiselt on skeem lihtne:

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)


 kuid selgub, et:

  • Kubernetes API on piisavalt mittetriviaalne asi, mis nĂ”uab palju aega Ă”ppimiseks;
  • programmeerimine ei ole ka kĂ”igile (Go keel on valitud eelistatuna, sest selle jaoks on olemas spetsiaalne raamistik — Operator SDK);
  • raamistikuga on olukord sarnane.

KokkuvĂ”te: kontrolleri kirjutamiseks (operaatori) tuleb kulutada mĂ€rkimisvÀÀrseid ressursse Ă”pikute tundmiseks. See oleks pĂ”hjendatud "suuremate" operaatorite jaoks — nĂ€iteks MySQL andmebaasi jaoks. Kuid kui me meenutame eelnevalt kirjeldatud nĂ€iteid (saladuste jagamine, pod'ide juurdepÀÀs internetis
), mida tahame samuti Ă”igesti teha, siis saame aru, et tehtud pingutused ĂŒletavad vajaliku tulemuse:

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

KokkuvĂ”ttes tekib dilemma: kulutada palju ressursse ja omandada Ă”ige tööriist operaatorite kirjutamiseks vĂ”i tegutseda "vana viisi" (aga kiiresti). Selle lahendamiseks — kompromissi leidmiseks nende ÀÀrmuslike lĂ€henemiste vahel — lĂ”ime oma projekti: shell-operator (vt ka selle hiljutine teadanne Habrast).

Shell-operator

Kuidas see töötab? Klusteris on pod, milles asub Go binaar shell-operatoriga. Selle kĂ”rval hoitakse komplekti hook'ide (lisainfot nende kohta — vt allpool). Shell-operator ise kuulub kindlatele sĂŒndmustele Kubernetes API-s kĂ€ivitavad vastavaid hĂŒbriidide vastavad sĂŒndmused.

Kuidas shell-operator mĂ”istab, milliseid hĂŒbriide milliste sĂŒndmuste korral kutsuda? Selle teabe edastavad shell-operatorile hĂŒbriidid ise, tehes seda vĂ€ga lihtsalt.

HĂŒbro on Bash-skripti vĂ”i mĂ”ne muu tĂ€idetava faili, mis toetab ĂŒhte argumenti --config ja tagastab selle peale JSON-i. Viimane mÀÀrab, millised objektid teda huvitavad ja millistele sĂŒndmustele (neid objekte silmas pidades) tuleks reageerida:

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

Illustreerin shell-operatori rakendust meie nĂ€itest — saladuste jaotamine privaatse registry-le rakenduse piltide juurdepÀÀsuks. See koosneb kahest etapist.

Praktika: 1. Kirjutame hĂŒbriidi

Esimese asjana töötame hĂŒbriidi sees --config, mĂ€rkides, et meid huvitavad namespace'id, ja konkreetsemalt — nende loomise hetk:

[[ $1 == "--config" ]] ; siis
  cat << EOF
{
  "onKubernetesEvent": [
    {
      "kind": "namespace",
      "event": ["add"]
    }
  ]
}
EOF



Kuidas see loogika vĂ€lja nĂ€eb? Samuti ĂŒsna lihtne:



muud
  createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH)
  kubectl create -n ${createdNamespace} -f - << EOF
Kind: Secret
...
EOF
fi

Esimese sammuna saame teada, milline namespace on loodud, ja teiseks — loome lĂ€bi kubectl saladuse selle nimede alale.

Praktika: 2. Loome pilti

JÀÀnud on edastada loodud kĂ€epide shell-operatorile — kuidas seda teha? Shell-operator tuleb Docker-pildina, seega meie ĂŒlesanne on lisada kĂ€epide spetsiaalsesse katalooge selles pildis:

FROM flant/shell-operator:v1.0.0-beta.1
ADD my-handler.sh /hooks

JÀÀb alles see ĂŒles ehitada ja push'ida:

$ docker build -t registry.example.com/my-operator:v1 .
$ docker push registry.example.com/my-operator:v1

Viimane puudutus — laadida pilt klastrisse. Selleks kirjutame Deployment:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-operator
spec:
  template:
    spec:
      containers:
      - name: my-operator
        image: registry.example.com/my-operator:v1 # 1
      serviceAccountName: my-operator              # 2

Siin tuleb tÀhelepanu pöörata kahele punktile:

  1. just loodud pildi nÀitamine;
  2. see on sĂŒsteemikomponent, millel (vĂ€hemalt) on vaja Ă”igusi, et registreeruda Kubernetes'is sĂŒndmustele ja et jagada saladusi namespace'ide vahel, seega loome kĂ€epideme jaoks ServiceAccount'i (ja komplekti reegleid).

Tulemus — me lahendasime oma probleemi loodud Kubernetes'i viisil, luues operaatori saladuste jagamiseks.

Muud shell-operatori vÔimalused

Et piirata teie valitud tĂŒĂŒpi objekte, millega kĂ€epide töötama hakkab, saab neid filtreerida, valides etiketid valides on (vĂ”i koos matchExpressions):

"onKubernetesEvent": [
  {
    "selector": {
      "matchLabels": {
        "foo": "bar",
       },
       "matchExpressions": [
         {
           "key": "allow",
           "operation": "In",
           "values": ["wan", "warehouse"],
         },
       ],
     }
     

  }
]

Kavandatud deduplikaatsiooni mehhanism, mis — jq-filtri abil — vĂ”imaldab suuri JSON objekte konverteerida vĂ€ikesteks, kus jÀÀvad alles vaid need parameetrid, mille muutust me tahame jĂ€lgida.

Hooki shell-operatori kutsumisel edastab ta andmed objekti kohta, mida saab kasutada igasugusteks vajadusteks.

SĂŒndmused, mille korral hĂŒpikuid kutsutakse, ei ole piiratud Kubernetes sĂŒndmustega: shell-operator toetab hĂŒpikute kutsumist ajas (sarnane crontabile traditsioonilises ajakava koostajas), samuti spetsiaalset sĂŒndmust onStartup. KĂ”iki neid sĂŒndmusi saab kombineerida ja mÀÀrata ĂŒhele ja samale hĂŒpikule.

Ja veel kaks omadust shell-operatori kohta:

  1. Ta töötab asĂŒnkroonselt. Alates Kubernetes'i sĂŒndmuse (nĂ€iteks objekti loomise) saamisest on klastris vĂ”inud toimuda ka teisi sĂŒndmusi (nĂ€iteks sama objekti kustutamine), mida tuleb hookides arvesse vĂ”tta. Kui hook lĂ”ppes vea tĂ”ttu, siis kordab sĂŒsteem seda vaikimisi. korduvkutsumist kuni see Ă”nnestub (seda kĂ€itumist saab muuta).
  2. See eksportib metriika Prometheus'ele, millega on vÔimalik aru saada, kas shell-operator töötab, teada saada iga hooki vigade arvu ja praeguse jÀrjekorra suuruse.

KokkuvÔttes selles osa ettekandest:

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

Lisandmoodulite installimine

Kubernetesega mugava töötamise jaoks mainiti ka lisandmoodulite installimise vajadust. RÀÀgin sellest meie ettevÔtte teekonna nÀitel, kuidas me seda praegu teeme.

Kubernetes'e kasutamine algas meil mitmest klastrist, kus ainsaks lisandmooduliks oli Ingress. Iga klastrisse tuli seda paigaldada erinevalt, ning tegime erinevate keskkondade jaoks mitmeid YAML-konfiguratsioone: bare metal, AWS


Klastrite arv kasvas — koos suurenes ka konfiguratsioonide arv. Lisaks parandasime neid konfiguratsioone, mistĂ”ttu need muutusid ĂŒsna mitmekesisteks:

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

Ettevalmistamiseks alustasime skriptist (install-ingress.sh), mis vĂ”ttis argumendiks klastrityĂŒbi, kuhu me oleme paigaldamas, genereeris vajaliku YAML-konfiguratsiooni ja edastas selle Kubernetesesse.

LĂŒhidalt öeldes nĂ€gi meie edasine tee ja seotud arutlused vĂ€lja sellised:

  • YAML-konfiguratsioonide töötlemiseks on vajalik malligeneraator (esimestel etappidel oli see lihtne sed);
  • klastrite arvu suurenedes tekkis vajadus automaatseks uuendamiseks (kĂ”ige varasem lahendus — panime skripti Git'i, uuendame seda cron'i abil ja kĂ€ivitame);
  • sarnast skripti nĂ”uti ka Prometheusele (install-prometheus.sh), kuid see on tĂ€helepanuvÀÀrne, kuna nĂ”uab palju rohkem sisendandmeid ja nende sĂ€ilitamist (ideaaljuhul — tsentraliseeritult klastris), lisaks olid mĂ”ned andmed (salasid) automaatselt genereeritavad:

    Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

  • risk panna vale asi kasvavatesse klastritesse kasvas pidevalt, seega mĂ”istsime, et installeerijatele (st kahe skripti: Ingressi ja Prometheuse jaoks) oli vajalik st stages (mitmed harud Git'is, mitmed cron'id nende uuendamiseks vastavalt: stabiilsetes vĂ”i testklastrites);
  • koos kubectl apply töötamine muutus keeruliseks, kuna see ei ole deklaratiivne ja oskab vaid objekte luua, kuid ei suuda nende staatust otsustada ega neid kustutada;
  • puudusid mĂ”ned funktsioonid, mida me tol ajal tĂ€ielikult ei rakendanud:
    • tĂ€ielikku kontrolli klastrite uuendamise tulemuse ĂŒle,
    • automaatset teatud parameetrite mÀÀramist (sisseseadmise skriptide sisendeid) andmete pĂ”hjal, mida saab klastri (discovery) kaudu kĂ€tte saada,
    • loogilist arengut pideva avastamise kujul.

Kogu see kogunenud kogemus on rakendatud meie teises projektis — addon-operator.

Addon-operator

Selle pĂ”hielement on juba mainitud shell-operator. Kogu sĂŒsteem nĂ€eb vĂ€lja jĂ€rgmine:

Shell-operator'i hook'idele lisatakse:

  • values hoidla,
  • Helm-chart,
  • komponent, mis jĂ€lgib values hoidlat ja — muudatuste korral — palub Helm'il vĂ€lja lasta chart.

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

Nii saame reageerida sĂŒndmusele Kubernetes'is, kĂ€ivitada hook'i ja sealt teha muudatusi hoidlas, mille jĂ€rel chart uuesti vĂ€lja antakse. Saadud skeemis eristame hulka hook'e ja chart'i ĂŒheks komponendiks, mida nimetame mooduliks:

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

Moduleid vÔib olla palju, ja nendele lisame globaalsete hook'ide, globaalsete vÀÀrtuste salvestusruumi ja komponendi, mis jÀlgib seda globaalset salvestusruumi.

NĂŒĂŒd, kui Kubernetes'is midagi juhtub, saame sellele reageerida globaalse hook'i abil ja muuta midagi globaalsete vÀÀrtuste salvestusruumis. See muudatus mĂ€rgatakse ja see kĂ€ivitab kĂ”igi klastris olevate moodulite uuendamise:

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

See skeem vastab kÔigile lisandmoodulite installimise nÔuetele, mis on eelnevalt vÀlja toodud:

  • Mallide loomise ja deklaratiivsuse eest vastutab Helm.
  • Automaatse vĂ€rskenduse kĂŒsimus lahendatakse globaalsete hook'ide abil, mis plaanipĂ€raselt kĂ€ivad registris ja, kui seal nĂ€hakse uut sĂŒsteemipilti, uuendavad selle (st "iseennast").
  • Seadete salvestamine klastris on rakendatud lĂ€bi ConfigMap, kuhu on salvestatud algandmed salvestusruumide jaoks (kĂ€ivitamisel laaditakse need salvestusruumidesse).
  • Paroolide genereerimise, avastamise ja pideva avastamise probleemid on lahendatud hook'ide kaudu.
  • Etapid on saavutatud tĂ€nu siltidele, mida Docker toetab otse vĂ€lja.
  • Tulemuse kontroll toimub meetrikate kaudu, mille abil saame aru staatusest.

Kogu see sĂŒsteem on teostatud ĂŒhe Go binaarprogrammina, mille nimi on addon-operator. SeetĂ”ttu tundub skeem lihtsam:

Kubernetesi laiendamine ja tĂ€iendamine (ĂŒlevaade ja video ettekandest)

Selle skeemi peamine komponent on moodulite komplekt (tumedas hallis alt vĂ€lja toodud). NĂŒĂŒd suudame vĂ€ikeste pingutustega kirjutada mooduli vajaliku lisafunktsiooni jaoks ja olla kindlad, et see installitakse igasse klastrisse, uuendatakse ja reageerib sealsetele vajalikele sĂŒndmustele.

Flant kasutab addon-operator ĂŒle 70 Kubernetes-klastri. Praegune staatus on alfaversioon. Praegu valmistame ette dokumentatsiooni, et vĂ€lja anda beetaversioon, samal ajal on meie hoidlas nĂ€idised, mille pĂ”hjal suudate luua oma addon.

Kust saada addon-operatori mooduleid? Oma teegi avaldamine on meie jaoks jÀrgmine samm, plaanime selle suvel teha.

Video ja slaidid

Esitlusvideo (~50 minutit):

Vaata videot

Ettekande esitlus:

P.S.

Teised ettekanded meie blogis:

VÔib-olla huvitavad teid ka jÀrgmised publikatsioonid:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster