Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

8. aprÄ«lÄ« konferencē Saint HighLoad++ 2019, sadaļas ā€œDevOps and Operationsā€ ietvaros tika sniegts ziņojums ā€œKubernetes paplaÅ”ināŔana un papildināŔanaā€, kura tapÅ”anā piedalÄ«jās trÄ«s uzņēmuma Flant darbinieki. Tajā runājam par neskaitāmām situācijām, kurās vēlējāmies paplaÅ”ināt un papildināt Kubernetes iespējas, bet kurām neatradām gatavu un vienkārÅ”u risinājumu. Mums ir nepiecieÅ”amie risinājumi Open Source projektu veidā, un arÄ« Ŕī runa ir veltÄ«ta tiem.

Saskaņā ar tradīciju mēs esam priecīgi iepazīstināt reportāžas video (50 minūtes, daudz informatīvāks par rakstu) un galvenais kopsavilkums teksta formā. Aiziet!

Kodols un papildinājumi K8s

Kubernetes maina jau sen iedibināto nozari un pieejas administrācijai:

  • Paldies viņam abstrakcijas, mēs vairs nedarbojamies ar tādiem jēdzieniem kā konfigurācijas iestatÄ«Å”ana vai komandas palaiÅ”ana (Chef, Ansible...), bet izmantojam konteineru grupÄ“Å”anu, pakalpojumus utt.
  • Mēs varam sagatavot pieteikumus, nedomājot par niansēm konkrēta vietne, uz kura tas tiks palaists: pliks metāls, viena no pakalpojumu sniedzēju mākonis utt.
  • Ar K8 jÅ«s nekad neesat bijis tik pieejams labākā prakse par infrastruktÅ«ras organizÄ“Å”anu: mērogoÅ”anas paņēmieni, paÅ”atveseļoÅ”anās, kļūdu tolerance utt.

Tomēr, protams, viss nav tik gludi: Kubernetes atnesa arī savus jaunus izaicinājumus.

Kubernetes nē ir kombains, kas atrisina visas visu lietotāju problēmas. kodols Kubernetes ir atbildÄ«gs tikai par minimālo nepiecieÅ”amo funkciju kopumu katrs klasteris:

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

Kubernetes kodols definē pamata primitÄ«vu kopu konteineru grupÄ“Å”anai, datplÅ«smas pārvaldÄ«bai un tā tālāk. Mēs par tiem runājām sÄ«kāk ziņojums pirms 2 gadiem.

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

Savukārt K8s piedāvā lieliskas iespējas paplaÅ”ināt pieejamās funkcijas, kas palÄ«dz aizvērt citas - specifisks ā€” lietotāju vajadzÄ«bas. Par Kubernetes papildinājumiem ir atbildÄ«gi klasteru administratori, kuriem ir jāinstalē un jākonfigurē viss nepiecieÅ”amais, lai klasteris bÅ«tu ā€œpareizā formāā€ [lai atrisinātu viņu Ä«paŔās problēmas]. Kādi ir Å”ie papildinājumi? ApskatÄ«sim dažus piemērus.

Papildinājumu piemēri

Pēc Kubernetes instalÄ“Å”anas mēs varam bÅ«t pārsteigti, ka tÄ«kloÅ”ana, kas ir tik nepiecieÅ”ama podiņu mijiedarbÄ«bai gan mezglā, gan starp mezgliem, nedarbojas pati par sevi. Kubernetes kodols negarantē nepiecieÅ”amos savienojumus; tā vietā tas nosaka tÄ«klu saskarne (CNI) treÅ”o puÅ”u papildinājumiem. Mums ir jāinstalē viens no Å”iem papildinājumiem, kas bÅ«s atbildÄ«gs par tÄ«kla konfigurāciju.

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

Tuvs piemērs ir datu uzglabāŔanas risinājumi (lokālais disks, tÄ«kla bloka ierÄ«ce, Ceph...). Sākotnēji tie bija kodolā, bet ar adventi CSI situācija mainās uz kaut ko lÄ«dzÄ«gu jau aprakstÄ«tajam: interfeiss ir Kubernetes, un tā ievieÅ”ana ir treŔās puses moduļos.

Citi piemēri:

  • IekļūŔana- kontrolieri (skatiet viņu pārskatu mÅ«su nesenais raksts).
  • sertificēts menedžeris:

    Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

  • Operatori ir vesela pievienojumprogrammu klase (kas ietver minēto sertifikātu pārvaldnieku), tie definē primitÄ«vu(s) un kontrolieri(-us). Viņu darba loÄ£iku ierobežo tikai mÅ«su iztēle un tas ļauj gatavus infrastruktÅ«ras komponentus (piemēram, DBVS) pārvērst primitÄ«vos, ar kuriem strādāt ir daudz vieglāk (nekā ar konteineru komplektu un to iestatÄ«jumiem). Ir uzrakstÄ«ts milzÄ«gs skaits operatoru - pat ja daudzi no tiem vēl nav gatavi ražoÅ”anai, tas ir tikai laika jautājums:

    Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

  • Metrika - vēl viens piemērs tam, kā Kubernetes atdalÄ«ja saskarni (Metrics API) no ievieÅ”anas (treŔās puses papildinājumi, piemēram, Prometheus adapteris, Datadog klastera aÄ£ents...).
  • Par uzraudzÄ«ba un statistika, kur praksē ir vajadzÄ«gas ne tikai Prometejs un Grafana, bet arÄ« kube-state-metrics, node-exporter utt.

Un tas nav pilnÄ«gs papildinājumu saraksts... Piemēram, uzņēmumā Flant, kuru mēs Å”obrÄ«d uzstādām 29 papildinājumi (visi kopā veido 249 Kubernetes objektus). VienkārÅ”i sakot, mēs nevaram redzēt klastera dzÄ«vi bez papildinājumiem.

Automatizācija

Operatori ir paredzēti, lai automatizētu ikdienas darbÄ«bas, ar kurām saskaramies katru dienu. Å eit ir reāli piemēri, kuriem operatora rakstÄ«Å”ana bÅ«tu lielisks risinājums:

  1. Lietojumprogrammai ir privāts (t.i., nepiecieÅ”ams pieteikÅ”anās) reÄ£istrs ar attēliem. Tiek pieņemts, ka katram podam ir pieŔķirts Ä«paÅ”s noslēpums, kas ļauj veikt autentifikāciju reÄ£istrā. MÅ«su uzdevums ir nodroÅ”ināt, lai Å”is noslēpums tiktu atrasts nosaukumu telpā, lai podi varētu lejupielādēt attēlus. Lietojumprogrammu var bÅ«t daudz (katrai no tām ir nepiecieÅ”ams noslēpums), un ir lietderÄ«gi regulāri atjaunināt paÅ”us noslēpumus, tāpēc tiek izslēgta iespēja noslēpumus izkārtot ar roku. Å eit palÄ«gā nāk operators: mēs izveidojam kontrolieri, kas gaidÄ«s, lÄ«dz parādÄ«sies nosaukumvieta, un, pamatojoties uz Å”o notikumu, pievienos nosaukumvietai noslēpumu.
  2. Ä»aut pēc noklusējuma piekļuve internetam no podiem ir aizliegta. Bet dažreiz tas var bÅ«t nepiecieÅ”ams: ir loÄ£iski, ka piekļuves atļauju mehānisms darbojas vienkārÅ”i, neprasot Ä«paÅ”as prasmes, piemēram, ar noteiktas etiÄ·etes klātbÅ«tni nosaukumu telpā. Kā operators var mums Å”eit palÄ«dzēt? Tiek izveidots kontrolleris, kas gaida, lÄ«dz nosaukumvietā parādÄ«sies etiÄ·ete, un pievieno atbilstoÅ”u interneta piekļuves politiku.
  3. Līdzīga situācija: pieņemsim, ka mums vajadzēja pievienot noteiktu piesārņojums, ja tam ir līdzīga etiķete (ar kādu prefiksu). Darbības ar operatoru ir acīmredzamas...

Jebkurā klasterī ir jāatrisina rutīnas uzdevumi, un pareizi to var izdarīt, izmantojot operatorus.

Apkopojot visus aprakstÄ«tos stāstus, nonācām pie secinājuma, ka ērtam darbam Kubernetes nepiecieÅ”ams: A) instalēt papildinājumus, b) attÄ«stÄ«t operatorus (ikdienas admin uzdevumu risināŔanai).

Kā uzrakstīt Kubernetes paziņojumu?

Kopumā shēma ir vienkārÅ”a:

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

... bet tad izrādās, ka:

  • Kubernetes API ir diezgan nenozÄ«mÄ«ga lieta, kuras apgÅ«Å”ana prasa daudz laika;
  • arÄ« programmÄ“Å”ana nav piemērota visiem (kā vēlamā valoda tika izvēlēta Go valoda, jo tai ir Ä«paÅ”s ietvars - Operatora SDK);
  • LÄ«dzÄ«ga situācija ir ar paÅ”u karkasu.

ApakŔējā lÄ«nija: lai uzrakstÄ«tu kontrolieri (operatoram) ir tērē ievērojamus resursus pētÄ«t materiālus. Tas bÅ«tu attaisnojams "lieliem" operatoriem - piemēram, MySQL DBVS. Bet, ja atcerēsimies iepriekÅ” aprakstÄ«tos piemērus (noslēpumu izpauÅ”ana, piekļuve internetam...), ko arÄ« vēlamies izdarÄ«t pareizi, tad sapratÄ«sim, ka iztērētās pÅ«les atsvērs mums Å”obrÄ«d nepiecieÅ”amo rezultātu:

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

Kopumā rodas dilemma: tērēt daudz resursu un atrast pareizo rÄ«ku paziņojumu rakstÄ«Å”anai vai darÄ«t to vecmodÄ«gi (bet ātri). Lai to atrisinātu - lai atrastu kompromisu starp Ŕīm galējÄ«bām - mēs izveidojām savu projektu: čaulas operators (skatiet arÄ« viņa nesenais paziņojums uz centrmezgla).

Apvalka operators

Kā viņŔ strādā? Klasterim ir pods, kurā ir Go binārs ar čaulas operatoru. Blakus viņam ir komplekts āķi (sÄ«kāka informācija par tiem - skatÄ«t zemāk). Pats čaulas operators abonē noteiktus attÄ«stÄ«ba Kubernetes API, pēc kuras parādÄ«Å”anās tas palaiž atbilstoÅ”os āķus.

Kā čaulas operators zina, kurus āķus izsaukt par kādiem notikumiem? Å o informāciju čaulas operatoram pārraida paÅ”i āķi, un viņi to dara ļoti vienkārÅ”i.

Āķis ir Bash skripts vai jebkurÅ” cits izpildāms fails, kas pieņem vienu argumentu --config un atbild ar JSON. Pēdējais nosaka, kuri objekti to interesē un uz kādiem notikumiem (Å”iem objektiem) ir jāreaģē:

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

Es ilustrÄ“Å”u viena no mÅ«su piemēriem čaulas operatora ievieÅ”anu - noslēpumu sadalÄ«Å”anu, lai piekļūtu privātam reÄ£istram ar lietojumprogrammu attēliem. Tas sastāv no diviem posmiem.

Prakse: 1. Uzrakstiet āķi

Pirmkārt, āķī mēs apstrādāsim --config, norādot, ka mūs interesē nosaukumvietas un konkrēti to izveides brīdis:

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

Kā izskatītos loģika? Arī pavisam vienkārŔi:

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

Pirmais solis ir noskaidrot, kura nosaukumvieta tika izveidota, un otrais ir izveidot to, izmantojot kubectl noslēpums Å”ai nosaukumvietai.

Prakse: 2. Attēla salikÅ”ana

Atliek tikai nodot izveidoto āķi apvalka operatoram - kā to izdarÄ«t? Pats čaulas operators nāk kā Docker attēls, tāpēc mÅ«su uzdevums ir pievienot āķi Ä«paÅ”am direktorijam Å”ajā attēlā:

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

Atliek tikai to salikt un nospiest:

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

Pēdējais pieskāriens ir attēla izvietoÅ”ana klasterÄ«. Lai to izdarÄ«tu, rakstÄ«sim IzvietoÅ”anas:

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

Ir divi punkti, kuriem jāpievērÅ” uzmanÄ«ba:

  1. jaunizveidotā attēla norāde;
  2. Å is ir sistēmas komponents, kuram (vismaz) ir vajadzÄ«gas tiesÄ«bas abonēt notikumus pakalpojumā Kubernetes un pieŔķirt noslēpumus nosaukumvietām, tāpēc mēs izveidojam pakalpojuma kontu (un noteikumu kopu) āķim.

Rezultāts - mēs atrisinājām savu problēmu radiniekiem par Kubernetes tādā veidā, kas izveido operatoru noslēpumu sadalÄ«Å”anai.

Citas čaulas operatora funkcijas

Lai ierobežotu jÅ«su izvēlētā tipa objektus, ar kuriem darbosies āķis, tos var filtrēt, izvēloties atbilstoÅ”i noteiktām etiÄ·etēm (vai izmantojot matchExpressions):

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

Ar nosacījumu deduplikācijas mehānisms, kas - izmantojot jq filtru - ļauj pārvērst lielus JSON objektus mazos, kur paliek tikai tie parametri, kurus mēs vēlamies uzraudzīt, lai veiktu izmaiņas.

Kad tiek izsaukts āķis, čaulas operators to palaiž garām objekta dati, ko var izmantot jebkurai vajadzībai.

Notikumi, kas izraisa āķus, neaprobežojas tikai ar Kubernetes notikumiem: čaulas operators nodroÅ”ina atbalstu zvana āķi pēc laika (lÄ«dzÄ«gi kā crontab tradicionālajā plānotājā), kā arÄ« Ä«paÅ”s notikums onStartup. Visus Å”os notikumus var apvienot un pieŔķirt vienam un tam paÅ”am āķim.

Un vēl divas čaulas operatora funkcijas:

  1. Tas strādā asinhroni. Tā kā tika saņemts Kubernetes notikums (piemēram, objekts, kas tiek izveidots), klasterÄ« varēja notikt citi notikumi (piemēram, tas pats objekts tika dzēsts), un āķiem tas ir jāņem vērā. Ja āķis tika izpildÄ«ts ar kļūdu, tad pēc noklusējuma tā bÅ«s pārzvanÄ«t lÄ«dz veiksmÄ«gai pabeigÅ”anai (Å”o uzvedÄ«bu var mainÄ«t).
  2. Tas eksportē metriku par Prometheus, ar kuru jÅ«s varat saprast, vai čaulas operators darbojas, uzziniet katra āķa kļūdu skaitu un paÅ”reizējo rindas lielumu.

Lai apkopotu Å”o ziņojuma daļu:

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

Papildinājumu instalÄ“Å”ana

Ērtam darbam ar Kubernetes tika pieminēta arÄ« nepiecieÅ”amÄ«ba instalēt papildinājumus. Es jums par to pastāstÄ«Å”u, izmantojot piemēru par mÅ«su uzņēmuma ceļu uz to, kā mēs to darām tagad.

Ar Kubernetes sākām strādāt ar vairākiem klasteriem, kuru vienÄ«gais papildinājums bija Ingress. Katrā klasterÄ« tas bija jāinstalē atŔķirÄ«gi, un mēs izveidojām vairākas YAML konfigurācijas dažādām vidēm: tukÅ”s metāls, AWS...

Tā kā bija vairāk kopu, bija vairāk konfigurāciju. Turklāt mēs paÅ”i uzlabojām Ŕīs konfigurācijas, kā rezultātā tās kļuva diezgan neviendabÄ«gas:

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

Lai visu sakārtotu, sākām ar skriptu (install-ingress.sh), kas par argumentu izmantoja klastera veidu, kurā mēs izvietosim, Ä£enerēja nepiecieÅ”amo YAML konfigurāciju un izlaida to Kubernetes.

ÄŖsāk sakot, mÅ«su tālākais ceļŔ un ar to saistÄ«tie argumenti bija Ŕādi:

  • lai strādātu ar YAML konfigurācijām, ir nepiecieÅ”ams veidņu dzinējs (pirmajos posmos tas ir vienkārÅ”s sed);
  • palielinoties klasteru skaitam, radās nepiecieÅ”amÄ«ba pēc automātiskās atjaunināŔanas (agrākais risinājums bija ievietot skriptu Git, atjaunināt to izmantojot cron un palaist);
  • lÄ«dzÄ«gs skripts bija vajadzÄ«gs Prometejam (install-prometheus.sh), tomēr tas ir ievērojams ar to, ka tas prasa daudz vairāk ievades datu, kā arÄ« to glabāŔanas (labā nozÄ«mē - centralizēti un klasterÄ«), un daži dati (paroles) varētu tikt Ä£enerēti automātiski:

    Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

  • PastāvÄ«gi pieauga risks ieviest kaut ko nepareizu arvien lielākam skaitam klasteru, tāpēc mēs sapratām, ka instalētāji (t.i., divi skripti: Ingress un Prometheus) bija nepiecieÅ”ama inscenÄ“Å”ana (vairāki zari Gitā, vairāki kroni, lai tos atjauninātu atbilstoÅ”ajos: stabilajos vai testa klasteros);
  • с kubectl apply ar to ir kļuvis grÅ«ti strādāt, jo tas nav deklaratÄ«vs un var tikai izveidot objektus, bet nevar pieņemt lēmumus par to statusu/dzēst;
  • Mums trÅ«ka dažas funkcijas, kuras mēs tobrÄ«d nemaz nebijām ieviesuÅ”i:
    • pilnÄ«ga kontrole pār klasteru atjauninājumu rezultātiem,
    • dažu parametru automātiska noteikÅ”ana (instalācijas skriptu ievade), pamatojoties uz datiem, ko var iegÅ«t no klastera (atklāŔana),
    • tā loÄ£iskā attÄ«stÄ«ba nepārtrauktas atklāŔanas veidā.

Visu Ŕo uzkrāto pieredzi īstenojām sava cita projekta ietvaros - papildinājumu operators.

Addon-operators

Tā pamatā ir jau pieminētais čaulas operators. Visa sistēma izskatās Ŕādi:

Apvalka operatora āķiem ir pievienots:

  • vērtÄ«bu glabāŔana,
  • StÅ«res diagramma,
  • sastāvdaļa, kas uzrauga vērtÄ«bu krātuvi un - jebkādu izmaiņu gadÄ«jumā - lÅ«dz Helmu pārrullēt diagrammu.

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

Tādējādi mēs varam reaģēt uz notikumu Kubernetes, palaist āķi un no Ŕī āķa veikt izmaiņas krātuvē, pēc tam diagramma tiks atkārtoti lejupielādēta. IegÅ«tajā diagrammā mēs sadalām āķu kopu un diagrammu vienā komponentā, ko mēs saucam modulis:

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

Var bÅ«t daudz moduļu, un tiem mēs pievienojam globālos āķus, globālo vērtÄ«bu krātuvi un komponentu, kas uzrauga Å”o globālo veikalu.

Tagad, kad kaut kas notiek Kubernetes, mēs varam uz to reaģēt, izmantojot globālo āķi un kaut ko mainÄ«t globālajā veikalā. Å Ä«s izmaiņas tiks pamanÄ«tas un izraisÄ«s visu klastera moduļu izlaiÅ”anu:

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

Å Ä« shēma atbilst visām iepriekÅ” minētajām pievienojumprogrammu instalÄ“Å”anas prasÄ«bām:

  • Helms ir atbildÄ«gs par Å”ablonu veidoÅ”anu un deklarativitāti.
  • Automātiskās atjaunināŔanas problēma tika atrisināta, izmantojot globālo āķi, kas pēc grafika tiek novirzÄ«ts uz reÄ£istru un, ja tajā tiek parādÄ«ts jauns sistēmas attēls, to izlaiž (t.i., ā€œpatsā€).
  • IestatÄ«jumu glabāŔana klasterÄ« tiek Ä«stenota, izmantojot ConfigMap, kurā ir krātuvju primārie dati (palaiÅ”anas laikā tie tiek ielādēti krātuvēs).
  • Problēmas ar paroļu Ä£enerÄ“Å”anu, atklāŔanu un nepārtrauktu atklāŔanu tika atrisinātas, izmantojot āķus.
  • UzstādÄ«Å”ana tiek panākta, pateicoties tagiem, kurus Docker atbalsta no kastes.
  • Rezultāts tiek uzraudzÄ«ts, izmantojot metriku, pēc kuras mēs varam saprast statusu.

Visa Ŕī sistēma Go ir ieviesta viena bināra formātā, ko sauc par addon-operator. Tas padara diagrammu vienkārŔāku:

Kubernetes paplaŔināŔana un papildināŔana (pārskats un video reportāža)

Å Ä«s diagrammas galvenā sastāvdaļa ir moduļu komplekts (zemāk izcelts pelēkā krāsā). Tagad mēs varam ar nelielu piepÅ«li uzrakstÄ«t moduli vajadzÄ«gajam papildinājumam un bÅ«t droÅ”i, ka tas tiks instalēts katrā klasterÄ«, tiks atjaunināts un reaģēs uz nepiecieÅ”amajiem notikumiem klasterÄ«.

"Flant" lietojumi papildinājumu operators uz 70+ Kubernetes klasteriem. PaÅ”reizējais statuss - alfa versija. Tagad mēs gatavojam dokumentāciju beta versijas izlaiÅ”anai, bet pagaidām repozitorijā pieejami piemēri, uz kuras pamata jÅ«s varat izveidot savu papildinājumu.

Kur es varu iegÅ«t moduļus addon-operatoram? Bibliotēkas izdoÅ”ana mums ir nākamais posms; plānojam to paveikt vasarā.

Videoklipi un slaidi

Video no izrādes (~50 minūtes):

Ziņojuma prezentācija:

PS

Citi ziņojumi mūsu emuārā:

JÅ«s varētu interesēt arÄ« Ŕādas publikācijas:

Avots: www.habr.com

Pievieno komentāru