Een taint in Kubernetes is een kenmerk dat aan een node wordt toegevoegd. Het geeft aan dat bepaalde pods niet op die node mogen worden geplaatst (i.e. gescheduled), tenzij de pod een 'toleration' heeft voor die specifieke taint.
Taints worden gebruikt om de schedulering van pods op specifieke nodes te beheersen. Als een node bijvoorbeeld een taint heeft met de naam 'transip.nl/demo', kunnen alleen pods met een toleration voor deze taint op die node worden geplaatst.
Het is mogelijk om meerdere taints op een node te plaatsen en meerdere tolerations toe te voegen aan een enkele pod.
Tolerations maken en gebruiken
Toleration is het mechanisme dat wordt gebruikt om aan te geven dat een pod compatibel is met een bepaalde taint op een node. Als een pod een toleration heeft voor een specifieke taint, kan deze pod worden geplaatst op een node met die taint. Pods zonder de toleration worden geweigerd en kunnen niet op de node met de betreffende taint geplaatst worden.
De structuur van tolerations
Tolerations volgen afhankelijk van of je de operator Equal of Exists gebruikt de volgende structuur:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
of
tolerations:
- key: "key1"
operator: "Exists"
effect: "NoSchedule"
- key: Je bent helemaal vrij in de waarde die je achter 'key' opgeeft. Dit kan één woord zijn, maar mag bijvoorbeeld ook een domeinnaam bevatten, zoals transip.nl/demo-app.
- operator: Beschikbare opties zijn 'Equal' en 'Exists'. Bij het gebruik van 'Equal' moet je ook een 'value' opgeven. Bij Exists enkel een 'effect'.
- value: Een willekeurige waarde. Er is eigenlijk weinig reden om niet voor 'Exists' te kiezen en geen value te gebruiken.
-
effect: De manier waarop met de taint wordt omgegaan. Er zijn drie opties beschikbaar (hoofdletter gevoelig):
- "NoSchedule" Pods mogen niet op de node geplaatst worden, tenzij ze een toleration hebben voor deze taint.
- "PreferNoSchedule" Het cluster probeert de pod niet op de node te plaatsen, tenzij er geen andere optie is.
- "NoExecute" Bestaande pods worden onmiddellijk verwijdert van de node waaraan een taint met het NoExecute effect wordt toegevoegd. Dit is bij 'NoSchedule' en 'PreferNoSchedule' niet het geval.
Taints aanmaken
Er zijn twee plekken waar je een taint kunt aanmaken: het TransIP-controlepaneel of met Kubectl. Het TransIP-controlepaneel gebruik je om een taint in één keer aan een hele node pool toe te kennen. Kubectl is geschikter voor het toekennen van een taint aan specifieke nodes.
We raden aan om taints op je gehele nodepool toe te passen. Stel dat je drie nodes gebruikt, op één van drie nodes een taint hebt toegepast en dan je nodepool aanpast van drie naar twee nodes, dan is de kans op ongewenste resultaten groot.
Taints aanmaken in het TransIP-controlepaneel
In het TransIP-controlepaneel voeg je een taint toe door een key, value (optioneel) en effect op te geven met de syntax: key=value:effect (of zonder value key=effect).
Een in het controlepaneel aangemaakte taint verwijder je eenvoudig door op het kruis achter de taint te klikken.
Let op: het effect is hoofdletter gevoelig en taints die je hier toevoegt gelden voor de hele node pool.
Taints aanmaken en verwijderen met Kubectl
Kubectl volgt een vergelijkbare syntax als in het TransIP-controlepaneel maar geldt enkel voor individuele nodes:
kubectl taint nodes nodename key=value:effect
Een value is ook hier optioneel. Laat je de value weg, dan gaat Kubernetes er automatisch vanuit dat je de operator 'Exists' gebruikt (zie de paragraaf 'De structuur van tolerations').
De naam van je nodes zie je terug in het TransIP-controlepaneel of vraag je op met het commando:
kubectl get nodes
Om een taint te verwijderen, gebruik je een van de volgende opties:
- Verwijderen op basis van de key naam:
kubectl taint nodes nodename key-
- Verwijderen op basis van key en effect:
kubectl taint nodes nodename key:effect-
Let in beide gevallen op dat je een - toevoegt aan het eind van het commando. Hiermee geef je aan dat je de taint wil verwijderen.
Tolerations toevoegen aan een pod
Om een toleration voor een taint toe te voegen aan een pod, moet je de tolerations sectie definiëren in de pod-specificatie. Dit kan worden gedaan in het YAML-manifest van de betreffende pod, bijvoorbeeld:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:latest
tolerations:
- key: "transip.nl/demo-node"
operator: "Exists"
effect: "NoSchedule"
In dit voorbeeld heeft de pod de toleratie transip.nl/demo-node toegevoegd. Dit betekent dat de pod op nodes kan worden geplaatst die de taint transip.nl/demo-node en het effect NoSchedule hebben.
- De key geeft simpelweg de naam aan van de taint.
- De operator geeft aan hoe de toleratie moet worden geëvalueerd. In dit voorbeeld is dat 'Exists' en betekent dat de pod compatibel is als de taint aanwezig is. Een andere optie als operator is 'Equal' en vereist een 'value', zie eerder in dit artikel.
- Het effect geeft aan welke actie moet worden ondernomen als de taint van toepassing is op de node, zie de toelichting in de paragraaf 'De structuur van tolerations'.
Om meerdere tolerations toe te kennen voeg je simpelweg onder 'tolerations:' nog een blok toe zoals in het bovenstaande voorbeeld.