Jeg har laget Kube Eagle â en Prometheus-eksportĂžr. Det viste seg Ă„ vĂŠre en flott lĂžsning som hjelper til med Ă„ forstĂ„ ressursene i smĂ„ og mellomstore klynger bedre. Resultatet er at jeg har spart flere hundre dollar fordi jeg har valgt de riktige maskintypene og tilpasset ressursbegrensningene for applikasjonene etter arbeidsbelastningen.
Jeg vil fortelle om fordelene , men fĂžrst vil jeg forklare hva som fĂžrte til problemene og hvorfor vi trengte en kvalitetsmonitorering.
Jeg har administrert flere klynger med 4â50 noder. I hver klynge er det opptil 200 mikroseriver og applikasjoner. For Ă„ bruke det tilgjengelige maskinvaren mer effektivt, ble de fleste distribusjoner konfigurert med burstable minne og CPU-ressurser. PĂ„ denne mĂ„ten kan podden ta tilgjengelige ressurser nĂ„r det trengs, uten Ă„ forstyrre andre applikasjoner pĂ„ denne noden. Er ikke det flott?
Og selv om klyngen forbrukte relativt lite CPU (8%) og minne (40%), oppstod det stadig problemer med Ä fordrive poddene nÄr de prÞvde Ä tildele mer minne enn det som var tilgjengelig pÄ noden. Da hadde vi bare ett panel for overvÄking av Kubernetes-ressurser. Slik sÄ det ut:
Grafana-panel kun med cAdvisor-metrikker
Med et slikt panel er det ikke et problem Ă„ se noder som bruker mye minne og CPU. Problemet er Ă„ finne Ă„rsaken. For at poddene skulle bli vĂŠrende pĂ„ plass, kunne man selvfĂžlgelig ha satt opp garanterte ressurser pĂ„ alle poddene (forespurte ressurser er lik grensen). Men det er ikke den smarteste bruken av maskinvaren. Klyngen hadde flere hundre gigabyte minne, mens noen noder sultet og andre hadde 4â10 GB tilgjengelig.
Det viser seg at Kubernetes-planleggeren fordelte arbeidsbelastningene ujevnt basert pÄ tilgjengelige ressurser. Kubernetes-planleggeren tar hensyn til forskjellige konfigurasjoner: affinity-regler, taints og tolereringer, nodeselektorer som kan begrense tilgjengelige noder. Men i mitt tilfelle var det ikke noe slikt, og poddene ble planlagt basert pÄ de forespurte ressursene pÄ hver node.
For en pod ble det valgt en node med flest tilgjengelige ressurser som oppfylte forespÞrselens betingelser. Det vi oppdaget var at de forespurte ressursene pÄ nodene ikke samsvarte med det faktiske forbruket, og her kom Kube Eagle og dens overvÄkingsmuligheter til unnsetning.
Nesten alle Kubernetes-klynger mine ble overvÄket bare med og . Node Exporter gir statistikk for inn- og utdata, diskbruk, CPU og minnebruk, mens Kube State Metrics viser metrikker for Kubernetes-objekter, som CPU- og minneforespÞrsel og begrensninger.
Vi trenger Ä kombinere bruksmetrikker med forespÞrsels- og begrensningsmetrikker i Grafana, sÄ vi fÄr all informasjon om problemet. Det hÞres enkelt ut, men i disse to verktÞyene har etikettene forskjellige navn, og noen metrikker har ikke metadataetiketter i det hele tatt. Kube Eagle gjÞr alt dette selv, og panelet ser slik ut:
Vi har lykkes med Ă„ lĂžse mange ressursproblemer og spare hardware:
- Noen utviklere visste ikke hvor mye ressurser mikrotjenester trenger (eller brydde seg ikke). Vi hadde ingen mĂ„te Ă„ oppdage feilaktige ressursforespĂžrsler pĂ„ â for dette mĂ„ man kjenne til forbruket pluss forespĂžrslene og begrensningene. NĂ„ ser de Prometheus-metrikker, overvĂ„ker det faktiske forbruket og justerer forespĂžrslene og begrensningene.
- JVM-applikasjoner bruker sÄ mye minne som de kan. SÞppelsamleren frigjÞr minne bare nÄr mer enn 75% er i bruk. Og siden de fleste tjenester har burstable minne, ble det alltid opptatt av JVM. Derfor brukte alle disse Java-tjenestene mye mer minne enn forventet.
- Noen applikasjoner ba om for mye minne, og Kubernetes-planleggeren ga ikke disse nodene til andre applikasjoner, selv om de faktisk var mer ledige enn andre noder. En utvikler la tilfeldig til et ekstra tall i forespÞrselen og tok en stor del av minnet: 20 GB i stedet for 2. Ingen la merke til det. Applikasjonen hadde 3 replikaer, sÄ det pÄvirket faktisk 3 noder.
- Vi innfÞrte ressursbegrensninger, omplanla podene med riktige forespÞrselene og oppnÄdde perfekt balanse mellom bruken av maskinvare pÄ alle nodene. Noen noder kunne faktisk stenges. SÄ vi oppdaget at vi hadde feil maskiner (rettet mot CPU, ikke minne). Vi byttet type og fjernet ytterligere noen noder.
Resultater
Med burstable ressurser i klyngen utnytter du det tilgjengelige utstyret mer effektivt, men Kubernetes-planleggeren planlegger podene basert pÄ ressursforespÞrslene, noe som kan vÊre problematisk. For Ä drepe to fluer i en smekk: unngÄ problemer og bruke ressursene optimalt, er god overvÄking nÞdvendig. Dette vil vÊre nyttig. (exporter of Prometheus and Grafana monitoring panel).
Kilde: habr.com
