Piecas kļūdas, izvietojot pirmo lietojumprogrammu Kubernetes

Piecas kļūdas, izvietojot pirmo lietojumprogrammu KubernetesAris-Dreamer neveiksme

Daudzi cilvēki uzskata, ka pietiek migrēt lietojumprogrammu uz Kubernetes (vai nu izmantojot Helm, vai manuāli), un viņi bÅ«s laimÄ«gi. Bet tas nav tik vienkārÅ”i.

Komanda Mail.ru mākoņa risinājumi iztulkojis DevOps inženiera Džuliana Džindija rakstu. ViņŔ dalās ar kļūmēm, ar kurām viņa uzņēmums saskārās migrācijas procesa laikā, lai jÅ«s neuzkāptu uz tā paÅ”a grābekļa.

Pirmais solis: Pod pieprasījumu un ierobežojumu iestatīŔana

Sāksim, izveidojot tÄ«ru vidi, kurā mÅ«su podi darbosies. Kubernetes paveic lielisku darbu, plānojot aplikumus un apstrādājot atteices apstākļus. Bet izrādÄ«jās, ka plānotājs dažreiz nevar ievietot podziņu, ja ir grÅ«ti novērtēt, cik daudz resursu tam nepiecieÅ”ams, lai tas veiksmÄ«gi darbotos. Å eit parādās resursu un ierobežojumu pieprasÄ«jumi. Ir daudz diskusiju par labāko pieeju pieprasÄ«jumu un ierobežojumu noteikÅ”anai. Dažreiz patieŔām Ŕķiet, ka tā ir vairāk māksla nekā zinātne. LÅ«k, mÅ«su pieeja.

Pod pieprasījumi - Šī ir galvenā vērtība, ko plānotājs izmanto, lai optimāli novietotu podziņu.

No Kubernetes dokumentācija: filtrÄ“Å”anas darbÄ«ba nosaka mezglu kopu, kurā var ieplānot aplikumu. Piemēram, filtrs PodFitsResources pārbauda, ā€‹ā€‹vai mezglam ir pietiekami daudz resursu, lai apmierinātu podziņas specifiskos resursu pieprasÄ«jumus.

Mēs izmantojam lietojumprogrammu pieprasÄ«jumus, lai tos varētu izmantot, lai novērtētu, cik daudz resursu patiesÄ«bā Lietojumprogrammai tā ir nepiecieÅ”ama, lai tā darbotos pareizi. Tādā veidā plānotājs var reālistiski izvietot mezglus. Sākotnēji mēs vēlējāmies iestatÄ«t pieprasÄ«jumus ar rezervi, lai nodroÅ”inātu, ka katrā podā ir pietiekami liels resursu skaits, taču mēs pamanÄ«jām, ka plānoÅ”anas laiki ievērojami palielinājās un daži aplikumi nekad netika pilnÄ«bā ieplānoti, it kā par tiem nebÅ«tu saņemti resursu pieprasÄ«jumi.

Šādā gadÄ«jumā plānotājs bieži izstumtu aplikumus un nevarētu tos pārplānot, jo vadÄ«bas plaknei nebija ne jausmas, cik daudz resursu lietojumprogrammai bÅ«s nepiecieÅ”ams, kas ir plānoÅ”anas algoritma galvenā sastāvdaļa.

Podu ierobežojumi - Ŕī ir skaidrāka pāksts robeža. Tas atspoguļo maksimālo resursu daudzumu, ko klasteris pieŔķirs konteineram.

Atkal, no oficiālā dokumentācija: ja konteineram ir iestatÄ«ts 4 GiB atmiņas ierobežojums, kubelet (un konteinera izpildlaiks) to ieviesÄ«s. Izpildlaiks neļauj konteineram izmantot vairāk par norādÄ«to resursu ierobežojumu. Piemēram, kad process konteinerā mēģina izmantot vairāk nekā atļauts atmiņas apjoms, sistēmas kodols pabeidz procesu ar kļūdu ā€œout of memoryā€ (OOM).

Konteiners vienmēr var izmantot vairāk resursu, nekā norādīts resursa pieprasījumā, taču nekad nevar izmantot vairāk, nekā norādīts ierobežojumā. Šo vērtību ir grūti pareizi iestatīt, taču tā ir ļoti svarīga.

Ideālā gadÄ«jumā mēs vēlamies, lai podziņas resursu prasÄ«bas mainÄ«tos procesa dzÄ«ves cikla laikā, netraucējot citiem sistēmas procesiem ā€” tas ir ierobežojumu noteikÅ”anas mērÄ·is.

Diemžēl nevaru sniegt konkrētus norādÄ«jumus par to, kādas vērtÄ«bas iestatÄ«t, bet mēs paÅ”i ievērojam Ŕādus noteikumus:

  1. Izmantojot slodzes pārbaudes rÄ«ku, mēs simulējam trafika bāzes lÄ«meni un uzraugām pod resursu (atmiņas un procesora) izmantoÅ”anu.
  2. Mēs iestatām apkopēju pieprasÄ«jumus uz patvaļīgi zemu vērtÄ«bu (ar resursu ierobežojumu apmēram 5 reizes par pieprasÄ«jumu vērtÄ«bu) un novērojam. Ja pieprasÄ«jumu ir pārāk maz, procesu nevar sākt, bieži izraisot noslēpumainas Go izpildlaika kļūdas.

Ņemiet vērā, ka augstāki resursu ierobežojumi apgrÅ«tina plānoÅ”anu, jo podam ir nepiecieÅ”ams mērÄ·a mezgls ar pietiekamiem pieejamiem resursiem.

Iedomājieties situāciju, kad jums ir viegls tÄ«mekļa serveris ar ļoti lielu resursu ierobežojumu, piemēram, 4 GB atmiņas. Å im procesam, visticamāk, bÅ«s jāmēro horizontāli, un katrs jaunais modulis bÅ«s jāplāno mezglā ar vismaz 4 GB pieejamo atmiņu. Ja Ŕāda mezgla nav, klasterim ir jāievieÅ” jauns mezgls, lai apstrādātu Å”o podziņu, kas var aizņemt kādu laiku. Ir svarÄ«gi lÄ«dz minimumam samazināt atŔķirÄ«bu starp resursu pieprasÄ«jumiem un ierobežojumiem, lai nodroÅ”inātu ātru un vienmērÄ«gu mērogoÅ”anu.

Otrais solis: dzīvīguma un gatavības testu iestatīŔana

Å Ä« ir vēl viena smalka tēma, kas bieži tiek apspriesta Kubernetes kopienā. Ir svarÄ«gi labi izprast dzÄ«vÄ«guma un gatavÄ«bas testus, jo tie nodroÅ”ina programmatÅ«ras vienmērÄ«gu darbÄ«bu un samazina dÄ«kstāves laiku. Tomēr, ja tie nav pareizi konfigurēti, tie var nopietni ietekmēt jÅ«su lietojumprogrammas veiktspēju. Tālāk ir sniegts abu paraugu kopsavilkums.

DzÄ«vÄ«gums parāda, vai konteiners darbojas. Ja tas neizdodas, kubelet nogalina konteineru un tam tiek iespējota restartÄ“Å”anas politika. Ja konteiners nav aprÄ«kots ar Liveness zondi, noklusējuma stāvoklis bÅ«s veiksmÄ«gs - tas ir rakstÄ«ts Kubernetes dokumentācija.

Liveness zondēm jābūt lētām, kas nozīmē, ka tām nevajadzētu patērēt daudz resursu, jo tās darbojas bieži un tām ir jāinformē Kubernetes, ka lietojumprogramma darbojas.

Ja iestatāt opciju palaist katru sekundi, tiks pievienots 1 pieprasÄ«jums sekundē, tāpēc ņemiet vērā, ka Ŕīs trafika apstrādei bÅ«s nepiecieÅ”ami papildu resursi.

MÅ«su uzņēmumā Liveness testi pārbauda lietojumprogrammas pamatkomponentus pat tad, ja dati (piemēram, no attālās datu bāzes vai keÅ”atmiņas) nav pilnÄ«bā pieejami.

Mēs esam konfigurējuÅ”i lietotnes ar ā€œveselÄ«basā€ galapunktu, kas vienkārÅ”i atgriež atbildes kodu 200. Tas norāda, ka process darbojas un spēj apstrādāt pieprasÄ«jumus (bet vēl ne trafiku).

Paraugs Gatavība norāda, vai konteiners ir gatavs apkalpot pieprasījumus. Ja gatavības zonde neizdodas, galapunkta kontrolleris noņem pod IP adresi no visu pakalpojumu galapunktiem, kas atbilst pod. Tas ir norādīts arī Kubernetes dokumentācijā.

Gatavības pārbaudes patērē vairāk resursu, jo tie ir jānosūta uz aizmugursistēmu tādā veidā, kas norāda, ka lietojumprogramma ir gatava pieņemt pieprasījumus.

SabiedrÄ«bā notiek daudz diskusiju par to, vai tieÅ”i piekļūt datu bāzei. Ņemot vērā pieskaitāmās izmaksas (pārbaudes tiek veiktas bieži, bet tās var pielāgot), mēs nolēmām, ka dažām lietojumprogrammām gatavÄ«ba apkalpot trafiku tiek skaitÄ«ta tikai pēc tam, kad ir pārbaudÄ«ts, vai ieraksti tiek atgriezti no datu bāzes. Labi izstrādāti gatavÄ«bas izmēģinājumi nodroÅ”ināja augstāku pieejamÄ«bas lÄ«meni un novērsa dÄ«kstāves izvietoÅ”anas laikā.

Ja nolemjat vaicāt datu bāzē, lai pārbaudÄ«tu lietojumprogrammas gatavÄ«bu, pārliecinieties, vai tā ir pēc iespējas lētāka. Pieņemsim Å”o pieprasÄ«jumu:

SELECT small_item FROM table LIMIT 1

Å eit ir piemērs, kā mēs konfigurējam Ŕīs divas vērtÄ«bas Kubernetes:

livenessProbe: 
 httpGet:   
   path: /api/liveness    
   port: http 
readinessProbe:  
 httpGet:    
   path: /api/readiness    
   port: http  periodSeconds: 2

Varat pievienot dažas papildu konfigurācijas opcijas:

  • initialDelaySeconds ā€” cik sekundes paies no konteinera palaiÅ”anas lÄ«dz paraugu ņemÅ”anas sākumam.
  • periodSeconds ā€” gaidÄ«Å”anas intervāls starp paraugu ņemÅ”anu.
  • timeoutSeconds ā€” sekunžu skaits, pēc kura vienÄ«ba tiek uzskatÄ«ta par avārijas situāciju. Regulāra taimauts.
  • failureThreshold ā€” testa kļūmju skaits pirms restartÄ“Å”anas signāla nosÅ«tÄ«Å”anas uz pod.
  • successThreshold ā€” veiksmÄ«go zondu skaits, pirms pods pāriet gatavÄ«bas stāvoklÄ« (pēc kļūmes, kad pods ieslēdzas vai atjaunojas).

TreŔā darbÄ«ba: noklusējuma tÄ«kla politiku iestatÄ«Å”ana podam

Kubernetes tÄ«kla topogrāfija ir ā€œplakanaā€; pēc noklusējuma visi podi sazinās tieÅ”i viens ar otru. Dažos gadÄ«jumos tas nav vēlams.

Iespējama droŔības problēma ir tāda, ka uzbrucējs var izmantot vienu ievainojamu lietojumprogrammu, lai nosÅ«tÄ«tu trafiku uz visiem tÄ«kla blokiem. Tāpat kā daudzās droŔības jomās, arÄ« Å”eit tiek piemērots mazāko privilēģiju princips. Ideālā gadÄ«jumā tÄ«kla politikām bÅ«tu skaidri jānorāda, kuri savienojumi starp podiem ir atļauti un kuri nav.

Piemēram, tālāk ir vienkārÅ”a politika, kas liedz visu ienākoÅ”o trafiku konkrētai nosaukumvietai.

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:  
 name: default-deny-ingress
spec:  
 podSelector: {}  
 policyTypes:  
   - Ingress

Šīs konfigurācijas vizualizācija:

Piecas kļūdas, izvietojot pirmo lietojumprogrammu Kubernetes
(https://miro.medium.com/max/875/1*-eiVw43azgzYzyN1th7cZg.gif)
Sīkāka informācija Ŕeit.

Ceturtais solis: pielāgota darbība, izmantojot āķus un init konteinerus

Viens no mÅ«su galvenajiem mērÄ·iem bija nodroÅ”ināt Kubernetes izvietoÅ”anu bez dÄ«kstāves izstrādātājiem. Tas ir sarežģīti, jo ir daudz iespēju lietojumprogrammu izslēgÅ”anai un to izmantoto resursu atbrÄ«voÅ”anai.

ÄŖpaÅ”as grÅ«tÄ«bas radās ar Nginx. Mēs pamanÄ«jām, ka, kad Å”ie podi tika izvietoti secÄ«gi, aktÄ«vie savienojumi tika pārtraukti pirms veiksmÄ«gas pabeigÅ”anas.

Pēc plaÅ”as izpētes tieÅ”saistē izrādās, ka Kubernetes negaida, lÄ«dz Nginx savienojumi izsÄ«ks, pirms pārtrauks podziņu. Izmantojot pirmsapstāŔanās āķi, mēs ieviesām Ŕādu funkcionalitāti un pilnÄ«bā atbrÄ«vojāmies no dÄ«kstāves:

lifecycle: 
 preStop:
   exec:
     command: ["/usr/local/bin/nginx-killer.sh"]

Bet nginx-killer.sh:

#!/bin/bash
sleep 3
PID=$(cat /run/nginx.pid)
nginx -s quit
while [ -d /proc/$PID ]; do
   echo "Waiting while shutting down nginx..."
   sleep 10
done

Vēl viena ārkārtÄ«gi noderÄ«ga paradigma ir init konteineru izmantoÅ”ana konkrētu lietojumprogrammu palaiÅ”anai. Tas ir Ä«paÅ”i noderÄ«gi, ja jums ir resursietilpÄ«gs datu bāzes migrācijas process, kas jāpalaiž pirms lietojumprogrammas palaiÅ”anas. Å im procesam var norādÄ«t arÄ« lielāku resursu ierobežojumu, nenosakot Ŕādu ierobežojumu galvenajai lietojumprogrammai.

Vēl viena izplatÄ«ta shēma ir piekļuve noslēpumiem sākuma konteinerā, kas nodroÅ”ina Å”os akreditācijas datus galvenajam modulim, kas novērÅ” nesankcionētu piekļuvi noslēpumiem no paÅ”a galvenā lietojumprogrammas moduļa.

Kā parasti, citējiet no dokumentācijas: Init konteineri droÅ”i palaiž pielāgotu kodu vai utilÄ«tas, kas citādi samazinātu lietojumprogrammas konteinera attēla droŔību. Turot nevajadzÄ«gus rÄ«kus atseviŔķi, jÅ«s ierobežojat lietojumprogrammas konteinera attēla uzbrukuma virsmu.

Piektais solis: Kodola konfigurēŔana

Visbeidzot, parunāsim par progresīvāku tehniku.

Kubernetes ir ārkārtÄ«gi elastÄ«ga platforma, kas ļauj darbināt darba slodzes tā, kā jums Ŕķiet piemērots. Mums ir vairākas augstas veiktspējas lietojumprogrammas, kas ir ārkārtÄ«gi resursietilpÄ«gas. Pēc plaÅ”as slodzes pārbaudes mēs atklājām, ka vienai lietojumprogrammai bija grÅ«ti tikt galā ar paredzamo trafika slodzi, kad bija spēkā Kubernetes noklusējuma iestatÄ«jumi.

Tomēr Kubernetes ļauj palaist priviliģētu konteineru, kas maina kodola parametrus tikai konkrētam podam. Lūk, ko izmantojām, lai mainītu maksimālo atvērto savienojumu skaitu:

initContainers:
  - name: sysctl
     image: alpine:3.10
     securityContext:
         privileged: true
      command: ['sh', '-c', "sysctl -w net.core.somaxconn=32768"]

Å Ä« ir progresÄ«vāka tehnika, kas bieži vien nav nepiecieÅ”ama. Bet, ja jÅ«su lietojumprogrammai ir grÅ«ti tikt galā ar lielu slodzi, varat mēģināt pielāgot dažus no Å”iem iestatÄ«jumiem. SÄ«kāka informācija par Å”o procesu un dažādu vērtÄ«bu iestatÄ«Å”anu - kā vienmēr oficiālajā dokumentācijā.

Noslēgumā

Lai gan Kubernetes var Ŕķist gatavs risinājums, ir jāveic dažas galvenās darbības, lai jūsu lietojumprogrammas darbotos nevainojami.

Visā Kubernetes migrācijas laikā ir svarÄ«gi ievērot "slodzes pārbaudes ciklu": palaidiet lietojumprogrammu, pārbaudiet to ielādes, novērojiet metriku un mērogoÅ”anas darbÄ«bu, pielāgojiet konfigurāciju, pamatojoties uz Å”iem datiem, un pēc tam atkārtojiet ciklu vēlreiz.

Esiet reālistisks attiecÄ«bā uz paredzamo trafiku un mēģiniet to pārsniegt, lai redzētu, kuri komponenti sabojājas vispirms. Izmantojot Å”o iteratÄ«vo pieeju, panākumu gÅ«Å”anai var pietikt tikai ar dažiem no uzskaitÄ«tajiem ieteikumiem. Vai arÄ« tas var prasÄ«t dziļāku pielāgoÅ”anu.

Vienmēr uzdodiet sev Å”os jautājumus:

  1. Cik resursus patērē lietojumprogrammas un kā mainÄ«sies Å”is apjoms?
  2. Kādas ir reālās mērogoÅ”anas prasÄ«bas? Cik lielu trafiku lietotne vidēji apkalpos? Kā ar maksimālo satiksmi?
  3. Cik bieži pakalpojumam bÅ«s jāmēro horizontāli? Cik ātri jauni podi ir jāpievieno tieÅ”saistē, lai saņemtu trafiku?
  4. Cik pareizi pākstis izslēdzas? Vai tas vispār ir vajadzÄ«gs? Vai ir iespējams panākt izvietoÅ”anu bez dÄ«kstāves?
  5. Kā jÅ«s varat samazināt droŔības riskus un ierobežot bojājumus, ko rada jebkādi apdraudēti podi? Vai kādiem pakalpojumiem ir atļaujas vai piekļuve, kas tiem nav nepiecieÅ”ama?

Kubernetes nodroÅ”ina neticamu platformu, kas ļauj izmantot labāko praksi tÅ«kstoÅ”iem pakalpojumu izvietoÅ”anai klasterÄ«. Tomēr katrs pieteikums ir atŔķirÄ«gs. Dažreiz ievieÅ”ana prasa nedaudz vairāk darba.

Par laimi, Kubernetes nodroÅ”ina nepiecieÅ”amo konfigurāciju visu tehnisko mērÄ·u sasniegÅ”anai. Izmantojot resursu pieprasÄ«jumu un ierobežojumu kombināciju, dzÄ«vÄ«guma un gatavÄ«bas zondes, iniciÄ“Å”anas konteinerus, tÄ«kla politikas un pielāgotu kodola regulÄ“Å”anu, varat sasniegt augstu veiktspēju, kā arÄ« kļūdu toleranci un ātru mērogojamÄ«bu.

Ko vēl lasīt:

  1. Paraugprakse un labākā prakse konteineru un Kubernetes darbināŔanai ražoÅ”anas vidēs.
  2. Vairāk nekā 90 noderÄ«gu rÄ«ku Kubernetes: izvietoÅ”ana, pārvaldÄ«ba, uzraudzÄ«ba, droŔība un citi.
  3. Mūsu kanāls Ap Kubernetes telegrammā.

Avots: www.habr.com

Pievieno komentāru