
Er is veel naslagwerk op internet, maar soms zijn de eenvoudigste tips de meest waardevolle. Het team heeft vertaald , 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 .
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 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 (). 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 .
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.
Wat nog meer te lezen:
- .
- ?
- .
Bron: habr.com
