Ik gebruik kubernetes op een enkele machine om te testen, ik heb een aangepaste afbeelding gemaakt van de nginx docker-afbeelding, maar wanneer ik de afbeelding in kubernetes probeer te gebruiken, krijg ik een afbeeldingsfout?????
MIJN POD YAML
kind: Pod
apiVersion: v1
metadata:
name: yumserver
labels:
name: frontendhttp
spec:
containers:
- name: myfrontend
image: my/nginx:latest
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: mypd
imagePullSecrets:
- name: myregistrykey
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim-1
MIJN KUBERNETES-COMMANDO
kubectl create -f pod-yumserver.yaml
DE FOUT
kubectl describe pod yumserver
Name: yumserver
Namespace: default
Image(s): my/nginx:latest
Node: 127.0.0.1/127.0.0.1
Start Time: Tue, 26 Apr 2016 16:31:42 +0100
Labels: name=frontendhttp
Status: Pending
Reason:
Message:
IP: 172.17.0.2
Controllers: <none>
Containers:
myfrontend:
Container ID:
Image: my/nginx:latest
Image ID:
QoS Tier:
memory: BestEffort
cpu: BestEffort
State: Waiting
Reason: ErrImagePull
Ready: False
Restart Count: 0
Environment Variables:
Conditions:
Type Status
Ready False
Volumes:
mypd:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: myclaim-1
ReadOnly: false
default-token-64w08:
Type: Secret (a secret that should populate this volume)
SecretName: default-token-64w08
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
13s 13s 1 {default-scheduler } Normal Scheduled Successfully assigned yumserver to 127.0.0.1
13s 13s 1 {kubelet 127.0.0.1} Warning MissingClusterDNS kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
12s 12s 1 {kubelet 127.0.0.1} spec.containers{myfrontend} Normal Pulling pulling image "my/nginx:latest"
8s 8s 1 {kubelet 127.0.0.1} spec.containers{myfrontend} Warning Failed Failed to pull image "my/nginx:latest": Error: image my/nginx:latest not found
8s 8s 1 {kubelet 127.0.0.1} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "myfrontend" with ErrImagePull: "Error: image my/nginx:latest not found"
Antwoord 1, autoriteit 100%
Dus je hebt de afbeelding op je machinegebied. Het probeert echter nog steeds de afbeelding van Docker Hub te halen, wat waarschijnlijk niet is wat u wilt in uw installatie met één machine. Dit gebeurt omdat de nieuwste tag de imagePullPolicy impliciet instelt op Always. U kunt proberen het expliciet in te stellen op IfNotPresent of te wijzigen in een andere tag dan de laatste. – Timo Reimann 28 april om 7:16
Om de een of andere reden heeft Timo Reimann dit hierboven alleen als commentaar geplaatst, maar het zou zeker het officiële antwoord op deze vraag moeten zijn, dus ik plaats het opnieuw.
Antwoord 2, autoriteit 68%
Voer eval $(minikube docker-env) uit voordat u uw afbeelding maakt.
Volledig antwoord hier: https://stackoverflow.com/a/40150867
Antwoord 3, autoriteit 44%
Dit zou moeten werken, ongeacht of je minikube gebruikt of niet:
- Start een lokale registercontainer:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
- Doe
docker images
om de REPOSITORY en TAG van uw lokale afbeelding te achterhalen. Maak vervolgens een nieuwe tag voor uw lokale afbeelding:
docker tag <local-image-repository>:<local-image-tag> localhost:5000/<local-image-name>
Als TAG voor uw lokale afbeelding <none>
is, kunt u eenvoudig het volgende doen:
docker tag <local-image-repository> localhost:5000/<local-image-name>
- Push naar lokaal register :
docker push localhost:5000/<local-image-name>
Hiermee wordt automatisch de tag latest
toegevoegd aan localhost:5000/<local-image-name>
.
Je kunt het opnieuw controleren door docker images
te doen.
- Stel in uw yaml-bestand
imagePullPolicy
in opIfNotPresent
:
...
spec:
containers:
- name: <name>
image: localhost:5000/<local-image-name>
imagePullPolicy: IfNotPresent
...
Dat is het. Nu zou uw ImagePullError moeten zijn opgelost.
Opmerking: als u meerdere hosts in het cluster heeft en u wilt een specifieke host gebruiken om het register te hosten, vervang dan gewoon localhost
in alle bovenstaande stappen door de hostnaam van de host waar de registercontainer wordt gehost. In dat geval moet u mogelijk HTTP-verbindingen (niet-HTTPS) met het register toestaan:
5 (optioneel). Sta verbinding met onveilig register in werkknooppunten toe:
sudo echo '{"insecure-registries":["<registry-hostname>:5000"]}' > /etc/docker/daemon.json
Antwoord 4, autoriteit 18%
voeg gewoon imagePullPolicy toe aan uw implementatiebestand
het werkte voor mij
spec:
containers:
- name: <name>
image: <local-image-name>
imagePullPolicy: Never
Antwoord 5, autoriteit 15%
De gemakkelijkste manier om ErrImagePull
-problemen verder te analyseren, is door naar het knooppunt te ssh-en en te proberen de afbeelding handmatig op te halen door docker pull my/nginx:latest
uit te voeren. Ik heb Kubernetes nog nooit op een enkele machine ingesteld, maar ik kan me voorstellen dat de Docker-daemon om de een of andere reden niet bereikbaar is vanaf het knooppunt. Een handzame trekpoging zou meer informatie moeten opleveren.
Antwoord 6, autoriteit 3%
Gebruik je minikube op linux? Je moet docker installeren (denk ik), maar je hoeft het niet te starten. Minikube zal dat doen. Probeer het KVM-stuurprogramma te gebruiken met deze opdracht:
minikube start --vm-driver kvm
Voer vervolgens de opdracht eval $(minikube docker-env)
uit om ervoor te zorgen dat u de minikube docker-omgeving gebruikt. bouw je container met een tag build -t mycontainername:version .
als je vervolgens docker ps
typt, zou je een aantal minikube-containers al moeten zien draaien.
kvm-hulpprogramma’s staan waarschijnlijk al op uw computer, maar ze kunnen als volgt worden geïnstalleerd op centos/rhel:
yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python
Antwoord 7, autoriteit 3%
Zorg ervoor dat uw “Kubernetes-context” in Docker Desktop daadwerkelijk een “docker-desktop” is (d.w.z. geen cluster op afstand).
(Klik met de rechtermuisknop op het Docker-pictogram en selecteer vervolgens “Kubernetes” in het menu)
Antwoord 8, autoriteit 3%
Het enige wat u hoeft te doen is een docker-build te maken vanuit uw dockerbestand, of alle afbeeldingen op de knooppunten van uw cluster te krijgen, een geschikte docker-tag te maken en het manifest te maken.
Kubernetes haalt niet rechtstreeks uit het register. Eerst zoekt het naar de afbeelding op de lokale opslag en vervolgens naar het docker-register.
-
Trek nieuwste nginx-afbeelding
docker pull nginx
docker-tag nginx:laatste test:test8970
-
Een implementatie maken
kubectl run test --image=test:test8970
Het gaat niet naar het docker-register om de afbeelding op te halen. Het zal de pod onmiddellijk oproepen.
-
En als image niet aanwezig is op lokale computer, zal het proberen om uit het docker-register te halen en mislukken met ErrImagePull-fout.
-
Ook als u het imagePullPolicy: Neverwijzigt. Het zal nooit naar het register zoeken om de afbeelding op te halen en zal mislukken als de afbeelding niet wordt gevonden met de fout ErrImageNeverPull.
kind: Deployment
metadata:
labels:
run: test
name: test
spec:
replicas: 1
selector:
matchLabels:
run: test
template:
metadata:
creationTimestamp: null
labels:
run: test
spec:
containers:
- image: test:test8070
name: test
imagePullPolicy: Never
Antwoord 9, autoriteit 3%
Als u een vm-stuurprogramma gebruikt, moet u Kubernetes vertellen dat het de Docker-daemon moet gebruiken die in het cluster met één knooppunt wordt uitgevoerd in plaats van de host.
Voer het volgende commando uit:
eval $(minikube docker-env)
Opmerking – Deze opdracht moet worden herhaald wanneer u de terminalsessie sluit en opnieuw start.
Daarna kunt u uw imago opbouwen:
docker build -t USERNAME/REPO .
Update uw pod-manifest zoals hierboven weergegeven en voer het volgende uit:
kubectl apply -f myfile.yaml
Antwoord 10
Het toevoegen van een ander antwoord zoals het bovenstaande gaf me genoeg om de oorzaak van mijn specifieke geval van dit probleem te achterhalen. Het bleek dat mijn bouwproces de tagging miste die nodig was om :latest
te laten werken. Zodra ik een sectie <tags>
toevoegde aan mijn docker-maven-plugin-configuratie in mijn pom.xml, was alles in orde- dory. Hier is een voorbeeldconfiguratie:
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.27.2</version>
<configuration>
<images>
<image>
<name>akka-cluster-demo:${docker.image.version}</name>
<build>
<from>openjdk:8-jre-alpine</from>
Dit toevoegen:
<tags>
<tag>latest</tag>
<tag>${git.commit.version}</tag>
</tags>
De rest gaat door zoals voorheen:
<ports>
<port>8080</port>
<port>8558</port>
<port>2552</port>
</ports>
<entryPoint>
<exec>
<args>/bin/sh</args>
<args>-c</args>
<args>java -jar /maven/cluster-sharding-kubernetes.jar</args>
</exec>
</entryPoint>
<assembly>
<inline>
<dependencySets>
<dependencySet>
<useProjectAttachments>true</useProjectAttachments>
<includes>
<include>akka-java:cluster-sharding-kubernetes:jar:allinone</include>
</includes>
<outputFileNameMapping>cluster-sharding-kubernetes.jar</outputFileNameMapping>
</dependencySet>
</dependencySets>
</inline>
</assembly>
</build>
</image>
</images>
</configuration>
</plugin>
Antwoord 11
Ik had te maken met een soortgelijk probleem. Afbeelding was aanwezig in lokaal, maar k8s kon het niet ophalen.
Dus ging ik naar terminal, verwijderde de oude afbeelding en voerde de opdracht eval $ (minikube -p minikube docker-env) uit.
Herbouwde de afbeelding en de herimplementatie yaml, en het werkte