kubernetes kan geen lokale afbeelding ophalen

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:

  1. Start een lokale registercontainer:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
  1. Doe docker imagesom 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>
  1. Push naar lokaal register :
docker push localhost:5000/<local-image-name>

Hiermee wordt automatisch de tag latesttoegevoegd aan localhost:5000/<local-image-name>.
Je kunt het opnieuw controleren door docker imageste doen.

  1. Stel in uw yaml-bestand imagePullPolicyin op IfNotPresent:
...
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 localhostin 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:latestuit 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 pstypt, 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.

  1. Trek nieuwste nginx-afbeelding

    docker pull nginx

    docker-tag nginx:laatste test:test8970

  2. 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.
    voer hier de afbeeldingsbeschrijving in

  3. En als image niet aanwezig is op lokale computer, zal het proberen om uit het docker-register te halen en mislukken met ErrImagePull-fout.
    voer hier de afbeeldingsbeschrijving in

  4. 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.
    voer hier de afbeeldingsbeschrijving in

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 :latestte 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

Other episodes