Kubernetes heeft veel complexiteit achter een simpel idee, dat bekend is als een pod, en fouten oplossen die horen bij een pod is één van de moeilijke taken. We gaan twee fouten bespreken: ContainerCreateError en Init Container Fouten.
Wat je gaat leren
- Diepe kijk in ContainerCreateError en Init Container Fouten.
- Begrijpen van de oorzaken.
- Debugging gebruik case.
1. Diepe kijk in ContainerCreateError en Init Container Fouten.
Tijdens de levenscyclus van een pod doet de kubelet bepaalde acties op de target node:
- Maak Pod Sandbox.
- Trek de images voor de container.
- Maak de container, init container (als er is, dan app container).
- Start de container en draai de probes.
Ook al kunnen fouten gebeuren bij elke stap, ContainerCreateError en Init Container Fouten komen meestal bij de derde stap.
ContainerCreateError: Deze fout laat zien dat de kubelet niet kan maken een container voor een pod op de target node. Deze fout komt in de eerste fase, voor de applicatie start.
Init Container Fout: De init container draait voor de hoofdapplicatie container. Het is goed voor taken zoals draaien van afhankelijkheden, halen van config bestanden, maken van een database schema, of andere taken die eerst nodig zijn voor de hoofdapplicatie om te starten.
Als de init container faalt, zal de pod een status Init:0/1 laten zien, wat zegt dat de init container uitvoering is mislukt; de hoofdapp container zal niet starten tot de fout opgelost is.
2. Begrijpen van de oorzaken.
ContainerCreateError
1. Entrypoint/commando problemen: Verkeerde entrypoints en commando’s binnen het imago maken fouten. Bijv.: Binary niet gevonden (/app/start.sh: bestand of map bestaat niet).
2. Bestandssysteem/mounting: Verkeerde HostPath, mounten van niet bestaande configmap of secret, mount pad al in gebruik. Dit stopt dat de container kan worden gemaakt.
3. Security context beperkingen: Verkeerde security context instellen, zoals: Missende Linux mogelijkheden, runAsNonRoot terwijl image user is root (of andersom).
4. Node problemen: De node kan niet genoeg resources hebben (CPU, Geheugen) om een nieuwe container te draaien. Dit kan ook de OOMKilled fout geven tijdens het maken van de container.
Init Container Fouten
1. Initialisatie taak fout: Het script of commando dat is gegeven aan de init container faalde om te draaien of stopte met code nul status.
2. Afhankelijkheid is niet klaar: Als de init container is gemaakt om te wachten op een afhankelijkheid (bijv. database) die nog niet beschikbaar is, of de database service zelf maakt het pending, zoals een verbinding timeout of weigering. Dit maakt dat de init container steeds opnieuw start in een loop.
3. Verkeerde configuratie: Een verkeerde config file, environment variabele, of een verkeerd commando argument maakt dat de init container faalt.
3. Debuggen gebruik case
Stel dat je een applicatie hebt uitgerold en het gebruikt:
- Init container: die een shell script draait om te wachten op een database service.
- Hoofd container: die de hoofdapplicatie image draait.
Wanneer je uitrolt, zie je eerst de init container init:0/1, gevolgd door de ContainerCreateError voor de hoofdapplicatie.
DockerFile
# Simple base image
FROM alpine:latest
USER fakeuser
CMD ["sleep", "3600"]
YAML File
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
initContainers:
- name: wait-for-db
image: busybox:1.36
command: ['sh', '-c', 'until nc -z db-service 5432; do echo "waiting for db"; sleep 2; done']
containers:
- name: myapp
image: aqualyte/alpine-test:latest
ports:
- containerPort: 80
Na het toepassen van het YAML-bestand blijft de init container in de init:0/1 status, dat is omdat er geen draaiende db-service is.
Nu gaan we de db-service maken.
kubectl run db-pod \
--image=postgres:15 \
--port=5432 \
--env="POSTGRES_USER=admin" \
--env="POSTGRES_PASSWORD=admin123" \
--env="POSTGRES_DB=mydb"
kubectl expose pod db-pod \
--name=db-service \
--port=5432 \
--target-port=5432
Na het maken van de db-service zal de hoofdapplicatie container starten, maar zoals je kan zien, het blijft vast in CreateContainerError.
Wanneer je kubectl describe doet, kun je in de events de fout boodschap zien zoals hieronder:
In de fout staat dat geen users gevonden zijn, wat betekent dat het probeert te draaien als een verkeerde user die niet bestaat. Of in de security context of in het imago zelf is de verkeerde user genoemd.
In dit gebruik case is er een verkeerde user in het imago. Dus laten we het imago corrigeren.
Dockerfile
# Simple base image
FROM alpine:latest
CMD ["sleep", "3600"]
In de Dockerfile hierboven kun je of de user weghalen of je kunt een geldige user toevoegen.
Na het maken van veranderingen in de Dockerfile, push het imago naar de repository en pas het YAML-bestand opnieuw toe.
Conclusie
Omgaan met CreateContainerError en init container fouten met de juiste aanpak wordt eenvoudig om op te lossen. Door te begrijpen waar de fout komt, de Events en logs te kijken, en gestructureerde debuggen toe te passen, ga je snel van brand blussen naar zeker problemen oplossen. Bouw sterke init containers, en controleer specs zodat het uren van downtime en frustratie zal sparen. Kort gezegd, deze fouten zijn geen blokkades, maar kansen om de betrouwbaarheid en sterkte van jouw Kubernetes workloads te verbeteren.
Over mij
Ik ben Shubh Dadhich, een Kubernetes expert met interesse in DevOps, Cloud en Automatisering. Ik werk graag aan het maken van moeilijke problemen tot makkelijke, schaalbare oplossingen, en ik deel informatie via blogs en mentorschap.Ik ben open voor consultatie, training en mentorschap in Kubernetes, DevOps en Cloud. Of je net begint of je vaardigheden wilt verbeteren.
🔗 Verbinden met mij op LinkedIn: Shubh Dadhich
Top comments (0)