Het verwijderen van Kubernetes-objecten is niet zo eenvoudig als ze lijken op de oppervlakte. Het verwijderen van een object is een betrokken proces waarbij voorwaardelijke controles worden uitgevoerd om te bepalen of veilige verwijdering mogelijk is. Dit wordt bereikt door API-objecten die Finalizers worden genoemd.
In dit artikel zullen we kijken naar wat Finalizers zijn, hoe ze worden beheerd en de uitdagingen die ze kunnen veroorzaken wanneer u een object. Als u het verwijderingsproces beter begrijpt, kunt u problemen oplossen waarbij resources niet tijdig lijken te worden beëindigd.
Wat zijn finalizers?
Wat zijn finalizers?
h2>
Finalizers zijn een mechanisme om af te dwingen dat aan bepaalde voorwaarden wordt voldaan voordat een object kan worden verwijderd. Wanneer u een opdracht uitvoert zoals kubectl delete namespace/example, controleert Kubernetes de Finalizers die zijn gedefinieerd voor het object waarnaar wordt verwezen. Deze worden vermeld in het veld metadata.finalizers. Elke Finalizer krijgt de kans om het verwijderen uit te stellen totdat het zijn acties heeft voltooid.
Het daadwerkelijke verwijderingsproces ziet er uiteindelijk als volgt uit:
- Geef een verwijderopdracht. – Kubernetes markeert het object als in afwachting van verwijdering. Hierdoor blijft de bron in de alleen-lezen “Terminating” staat.
- Voer elk van de acties uit die zijn gekoppeld aan de Finalizers van het object. – Elke keer dat een Finalizer-actie wordt voltooid, wordt die Finalizer losgekoppeld van het object, zodat deze niet langer wordt weergegeven in het veld metadata.finalizers.
- Kubernetes blijft de Finalizers die aan het object zijn gekoppeld, controleren . – Het object wordt verwijderd zodra het veld metadata.finalizers leeg is, omdat alle Finalizers zijn verwijderd na het voltooien van hun acties.
Finalizers worden vaak gebruikt om opruim- en afvalverzamelingsprocedures uit te voeren voordat een object uit het cluster wordt verwijderd. U kunt uw eigen Finalizers toevoegen met behulp van de Kubernetes API; ingebouwde Finalizers worden ook automatisch toegepast op sommige typen objecten.
PersistentVolume-bronnen worden bijvoorbeeld geleverd met een kubernetes.io/pv-protection Finalizer die het per ongeluk verwijderen van volumes die actief door Pods worden gebruikt, voorkomt. De Finalizer zorgt ervoor dat het PersistentVolume niet uit het cluster kan worden verwijderd totdat er geen pods zijn die het gebruiken. Als u een verwijderingsopdracht geeft terwijl er nog een actieve Pod is, wordt het volume gemarkeerd als Beëindigend; het blijft in deze staat zolang de pod het volume nodig heeft en wordt daarna zo snel mogelijk automatisch verwijderd.
Finalizer-uitdagingen
Langlopende Finalizers die wachten op een voorwaarde waarbij andere bronnen betrokken zijn, kunnen ervoor zorgen dat verwijderingen vast blijven zitten in de Beëindigingsstatus. U kunt ook problemen tegenkomen waarbij een Finalizer de verwijdering van afhankelijke objecten blokkeert, waardoor de bovenliggende objecten niet succesvol kunnen worden beëindigd.
Advertentie
Deze problemen veroorzaken regelmatig verwarring – ontwikkelaars en operators hebben de neiging om verwijderingen te zien als eenvoudige procedures, terwijl het proces eigenlijk genuanceerd en variabel is. De vereisten voor succesvolle verwijdering zijn afhankelijk van de relaties van de bron en hun Finalizers, evenals van het doelobject zelf.
Als een object te lang is beëindigd, controleert u de Finalizers door het veld metadata.finalizers in de YAML te inspecteren:
kubectl get pod example-pod –namespace example -o json | jq
Zodra u weet welke finalizers zijn gedefinieerd, kunt u beginnen met het identificeren van degenen die een verwijdering waarschijnlijk zullen blokkeren. Het bekijken van de gebeurtenissen en toestandsveranderingen van het object kan helpen bij het debuggen door acties weer te geven die hebben plaatsgevonden sinds het verwijderingscommando is gegeven. Voorwaarden worden weergegeven in het veld spec.status.conditions van YAML; gebeurtenissen zijn zichtbaar bij het uitvoeren van kubectl description pod example-pod.
Je kunt de Finalizers van een object handmatig verwijderen door het veld spec.finalizers naar null te patchen. Deze techniek mag alleen worden gebruikt als het absoluut noodzakelijk is. Finalizers zijn beveiligingen die bedoeld zijn om uw cluster te beschermen; het negeren ervan kan leiden tot verweesde objecten en verbroken afhankelijkheidsketens.
kubectl patch pod example-pod -p '{“metadata: {“finalizers”: null}}'
Eigenaren en verspreidingsbeleid
Een gerelateerd onderwerp is objecteigenaren en beleid voor het doorvoeren van verwijderingen. Eigenaarsreferenties definiëren de relaties tussen objecten. Ze worden gebruikt om volledige objectbomen te verwijderen wanneer een bovenliggend item wordt verwijderd. Als u bijvoorbeeld een implementatie verwijdert, moet Kubernetes ook de pods binnenin vernietigen. die implementatie.
Eigenaarreferenties worden gedefinieerd via het veld metadata.ownerReferences op objecten. Elke verwijzing bevat het soort en de naam van het object waaraan de huidige bron moet worden toegevoegd.
Advertentie
Als eigenaarsverwijzingen worden gebruikt, worden bij het verwijderen van een bovenliggende bron automatisch alle onderliggende items verwijderd. Dit wordt trapsgewijze verwijdering genoemd. Het is mogelijk om de cascade uit te schakelen door de –cascade=orphan vlag toe te voegen aan kubectl delete. Kubernetes zorgt ervoor dat de onderliggende objecten van het object in het cluster blijven, waardoor ze beschikbaar blijven, maar verweesd blijven.
Kubernetes ondersteunt ook verschillende verwijderingsbeleidsregels voor 'propagatie'. Deze bepalen of de bovenliggende of de onderliggende eerst worden verwijderd. Met het standaard Foreground-beleid worden de onderliggende en vervolgens de bovenliggende verwijderd, zodat er geen weesgedrag optreedt. Achtergrond keert de volgorde om, zodat de bovenliggende eerst wordt verwijderd. Het derde beleid, Orphan, instrueert Kubernetes om eigenaarsreferenties helemaal te negeren.
De opdracht kubectl delete ondersteunt geen propagatiebeleid. U moet een direct API-verzoek indienen als u het beleid voor een verwijderingsbewerking wilt wijzigen:
curl -X DELETE localhost/api/v1/namespaces/default/deployments/example -d '{“apiVersion”: “v1”, “kind”: “DeleteOptions”, “propagationPolicy”: “Background”}' -H “Content-Type: application/json”
Finalizers worden gerespecteerd wanneer een verwijdering wordt gepropageerd of gecascadeerd naar gerelateerde objecten. In het geval van het Foreground-beleid betekent dit dat alle Finalizers voor alle kinderen moeten worden voltooid voordat de ouder kan beëindigen. Voor het Achtergrondbeleid blijven kinderen in leven totdat de Finalizers van hun ouders klaar zijn.
Finalizers implementeren
U kunt uw eigen Finalizers implementeren met de Kubernetes API en Go SDK. Finalizers worden gemaakt door hooks te registreren in de Reconcile-methode van een controller.
De methode moet controleren of het af te stemmen object een waarde heeft in het DeletionTimestamp-veld. Dit betekent dat het in afwachting is van verwijdering en zich in de beëindigingsstatus bevindt. Kies een id voor uw finalizer en controleer of het object de waarde in het veld metadata.finalizers bevat. Als dit het geval is, moet u de nodige acties uitvoeren en vervolgens de Finalizer van het object loskoppelen. Een voorbeeldimplementatie is opgenomen in de Kubebuilder-handleiding voor het schrijven van uw eigen Kubernetes-objecttypen met behulp van CRD's (aangepaste resourcedefinities).
Finalizers worden altijd geïmplementeerd als code in een controllermethode. Het veld metadata.finalizers werkt in dezelfde hoedanigheid als annotaties en labels, en geeft de Finalizers weer die op dat object moeten worden toegepast zonder de uit te voeren code direct te definiëren.
Conclusie
Finalizers regelen de levenscyclus van een Kubernetes-object nadat het verwijderen is gestart. Ze worden gebruikt om afvalverzameling te implementeren, controllers op de hoogte te stellen van op handen zijnde verwijderingen en te voorkomen dat objecten per ongeluk worden verwijderd waarnaar nog steeds wordt verwezen door andere bronnen.
Advertentie
Omdat Finalizers het verwijderen van objecten kunnen blokkeren voor willekeurig lange tijdsperioden, ze zijn een veelvoorkomende bron van frustratie wanneer operatieteams niet begrijpen waarom een object vastzit. beëindigen. In deze situatie is het het beste om de getroffen bronnen te inspecteren, te zien welke Finalizers actief zijn en relaties tussen objecten te onderzoeken die kunnen werken als blokkerende afhankelijkheden. Het geforceerd verwijderen van een Finalizer zou uw laatste redmiddel moeten zijn als u een Terminating-object onmiddellijk moet verwijderen of als u al uw andere opties hebt uitgeput.