De 10 beste tips en trucs voor Kubernetes

De 10 beste tips en trucs voor Kubernetes

Er is veel naslagwerk op internet, maar soms zijn de eenvoudigste tips de meest waardevolle. Het team Kubernetes aaS van Mail.ru heeft vertaald een verzameling van tien tips en trucs, die de auteur van het artikel heeft verzameld na een jaar werken met Kubernetes. De tips zijn niet op belangrijkheid gerangschikt, maar we denken dat iedereen iets nuttigs voor zichzelf zal vinden.

De eenvoudigste commando in Kubernetes

Om te beginnen, misschien de eenvoudigste en nuttigste actie bij het werken met Kubernetes. De volgende commando schakelt autocompletion in voor commando's kubectl in de bash-shell:

echo "source > ~/.bashrc

Autocompletion kubectl wordt in het .bashrc-bestand geschreven en zal automatisch actief zijn telkens wanneer de shell wordt gestart. Dit versnelt het typen van lange commando's en parameters, zoals all-namespacesMeer informatie in de de Kubernetes-handleiding voor bash.

Standaardlimieten voor geheugen en CPU in de namespace

Als een applicatie verkeerd is geschreven, bijvoorbeeld een nieuwe verbinding met de database opent elke seconde, maar deze nooit sluit, dan ontstaat er een geheugenlek in de cluster. En als er geen geheugenlimiet wordt ingesteld bij het implementeren van de applicatie, kan dit leiden tot het falen van een node.

Om dit te voorkomen, stelt Kubernetes in staat om standaardlimieten voor elke namespace in te stellen. Deze worden geschreven in een yaml-bestand voor de specifieke namespace. Hier is een voorbeeld van zo'n bestand:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

Maak zo'n yaml-bestand en pas het toe op een willekeurige namespace. Bijvoorbeeld, op de namespace limit-example. Nu geldt er een limiet van 512Mi voor elke container die in deze namespace is gedeployed, tenzij er voor die container een andere individuele limiet is ingesteld.

Opruimen in oude versies van Kubernetes

Kubelet begint standaard met opruimen wanneer var/lib/docker 90 % van de beschikbare schijfruimte in beslag neemt. Dit is geweldig, maar tot versie 1.7 van Kubernetes was er geen standaardlimiet op het aantal gebruikte inode-descriptoren (inodes), die overeenkomen met het aantal bestanden in het bestandssysteem.

Potentieel kan je container slechts 50 % van de schijfruimte gebruiken, maar de inodes kunnen op raken, wat problemen kan veroorzaken met de werkers. var/lib/docker kan slechts 50% van de schijfruimte gebruiken, maar de inodes kunnen opraken, wat problemen kan veroorzaken in de werking van de workers.

In oudere versies van kubelet van 1.4 tot 1.6 moet je de volgende vlag toevoegen:

--eviction-hard
=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%

In versie 1.7 en nieuwere versies is deze vlag standaard ingesteld. Eerdere versies houden echter geen rekening met de limiet van inodes.

Minikube… klein, maar krachtige lokale Kubernetes

Minikube is de eenvoudigste manier om een lokale Kubernetes-cluster op te starten. Het wordt gestart met een eenvoudige opdracht:

minikube start

Als resultaat van deze opdracht draait er een echte Kubernetes-cluster op uw computer.

De 10 beste tips en trucs voor Kubernetes
Bron van de illustratie

De truc is om de applicatie te bouwen en deze lokaal in deze cluster uit te voeren. Als er geen specifieke instructies worden gegeven, wordt de Docker-image op uw computer gebouwd, en niet in de cluster.

Om Docker te dwingen de image naar de lokale Kubernetes-cluster te sturen, geeft u de volgende opdracht aan de docker-machine:

eval $(minikube docker-env)

Nu kunnen we applicaties bouwen op de lokale Kubernetes-cluster.

Geef kubectl niet zomaar toegang aan iedereen

Dit lijkt vanzelfsprekend, maar als meerdere teams ƩƩn cluster voor hun applicaties gebruiken (wat de bedoeling van Kubernetes is), is het niet verstandig om zomaar toegang te geven aan iedereen. kubectlHet is beter om teams te scheiden door elk een eigen namespace toe te wijzen en de toegang af te bakenen met RBAC-beleidsregels.

Je kunt er moeilijk over doen door voor elke pod toegang, lezing, creatie, verwijdering en andere bewerkingen in te stellen. Maar het belangrijkste is om de toegang tot geheimen te beperken, alleen toegestaan voor beheerders. Op deze manier scheiden we degenen die het cluster kunnen beheren van degenen die daar eenvoudig kunnen implementeren.

Beheer de budgetten van pods

Hoe garandeer je dat er geen uitval is voor de applicatie in de Kubernetes-cluster? PodDisruptionBudget en nog eens PodDisruptionBudget.

Clusters worden periodiek bijgewerkt en knooppunten worden leeggemaakt. Niets blijft stilzitten, dat is de realiteit. Bij elke deployment met meer dan ƩƩn instantie moet PDB (PodDisruptionBudget) absoluut worden inbegrepen. Het wordt gemaakt in een eenvoudig yaml-bestand dat op de cluster wordt toegepast. De dekking van een specifieke PDB wordt bepaald door labelselectoren.

Opmerking: Het budget van de PDB wordt alleen in aanmerking genomen bij omkeerbare budgetinbreuken (vrijwillige onderbreking). In situaties zoals hardwarestoringen werkt de PDB niet.

Voorbeeld PDB:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: app-a-pdb
spec:
  minAvailable: 2
  selector:
      matchLabels:
        app: app-a

De twee belangrijkste parameters zijn matchLabels en minAvailableIn de eerste parameter geef je op voor welke applicaties het budget geldt. Bijvoorbeeld, als ik deployments heb met labels app: app-a en app: app-b, dan zal deze PDB alleen op de eerste van toepassing zijn.

Parameter minAvailable wordt overwogen bij het leegmaken (opruimen) van de node. Bijvoorbeeld, in ons voorbeeld worden tijdens het leegmaken alle instanties app: app-a, behalve twee.

Dit stelt je in staat om te controleren hoeveel exemplaren van de applicatie op elk moment actief moeten zijn.

Toepassing van monitoring

Dit soort monitoring is op twee manieren mogelijk: met behulp van Readiness- of Liveness-checks.

De eerste check (readiness) bepaalt de gereedheid van de container om verkeer te ontvangen.

De tweede (liveness) geeft aan of de container goed functioneert of dat deze opnieuw moet worden opgestart.

De desbetreffende configuraties worden eenvoudig toegevoegd aan de yaml voor de implementatie. Hier kunnen timeouts, vertragingstijden en aantal herhalingspogingen worden aangegeven. Meer details hierover vind je in de Kubernetes-documentatie.

Labels overal

Labels zijn een van de fundamentele concepten in Kubernetes. Ze stellen objecten in staat om vrij met elkaar te communiceren en verzoeken op basis van labels te maken. In Kubernetes kun je zelfs naar de klant gaan en gebeurtenissen op specifieke labels opvolgen.

Met labels kun je praktisch alles doen, maar een goed voorbeeld is het maken van meerdere omgevingen om programma's binnen dezelfde cluster uit te voeren.

Stel dat je dezelfde cluster gebruikt voor , maar volgt geen wijzigingen), gebruikmakend van een andere configuratie. en qa. Dit betekent dat je een applicatie app-a, tegelijkertijd in beide omgevingen kan draaien. qa en , maar volgt geen wijzigingen), gebruikmakend van een andere configuratie.. In dit geval kunnen we apart verwijzen naar het exemplaar van de applicatie in een specifieke omgeving door de bijbehorende parameter op te geven omgeving. Bijvoorbeeld, app: app-a en environment: dev voor de ene omgeving, en app: app-a en environment: qa voor de andere.

Dit stelt ons in staat om toegang te krijgen tot beide exemplaren van de applicatie, bijvoorbeeld om tegelijkertijd tests uit te voeren.

Houd het netjes

Kubernetes is een zeer krachtig systeem, maar elk systeem kan uiteindelijk vastlopen in een groot aantal processen. Kubelet start alle door jou opgegeven processen en controles op, evenals zijn eigen.

Natuurlijk zal ƩƩn verlaten service het systeem niet vertragen, en Kubernetes is vanaf het begin ontworpen voor schaalbaarheid. Maar als in plaats van ƩƩn service er een miljoen verschijnen, begint kubelet te stotteren.

Als u om welke reden dan ook een implementatie (container, afbeelding, wat dan ook) verwijdert, zorg er dan voor dat u alles volledig opruimt.

Maak kennis met Go

Het belangrijkste advies bewaren we voor het laatst. Leer de programmeertaal Go.

Kubernetes is geschreven in Go, alle extensies zijn geschreven in Go, en de officiƫle clientlibrary client-go wordt ook ondersteund.

Het kan voor verschillende en interessante dingen worden gebruikt. Bijvoorbeeld om het Kubernetes-systeem naar eigen wens uit te breiden. Zo kunt u uw eigen programma's gebruiken voor dataverzameling, het implementeren van applicaties of simpelweg het opruimen van containers.

De programmeertaal Go leren en client-go beheersen is misschien wel het belangrijkste advies dat je nieuwe Kubernetes-gebruikers kunt geven.

Vertaald met de steun van Mail.ru Cloud Solutions

Wat nog meer te lezen:

  1. Drie niveaus van autoscaling in Kubernetes en hoe deze effectief te gebruiken.
  2. Kubernetes-worker nodes: veel kleine of een paar grote?
  3. 25 nuttige tools voor het implementeren en beheren van Kubernetes.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster