J'utilise docker pour mac 18.05.0-ce-mac66 (24545) (Edge) avec le support Kubernetes et je lutte pour créer un déploiement de kubernetes faisant référence à une image construite localement.
Sortie de docker images
:
REPOSITORY TAG IMAGE
test latest 2c3bdb36a5ed
Mon deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloworld-deployment
spec:
selector:
matchLabels:
app: helloworld
replicas: 1
template:
metadata:
labels:
app: helloworld
spec:
containers:
- name: aaa
image: test:latest
ports:
- containerPort: 8080
Quand je lance kubectl apply -f deplyment.yaml
, les pods sont créés mais:
helloworld-deployment-764b8b85d8-2c4kl 0/1 ImagePullBackOff 0
helloworld-deployment-764b8b85d8-rzq7l 0/1 ImagePullBackOff 0
Décrivez l'une de ces cosses qui donne:
Normal Scheduled 20s default-scheduler Successfully assigned helloworld-deployment-79f66d97c6-7tj2x to docker-for-desktop
Normal SuccessfulMountVolume 19s kubelet, docker-for-desktop MountVolume.SetUp succeeded for volume "default-token-72f44"
Normal BackOff 16s kubelet, docker-for-desktop Back-off pulling image "test:latest"
Warning Failed 16s kubelet, docker-for-desktop Error: ImagePullBackOff
Normal Pulling 4s (x2 over 19s) kubelet, docker-for-desktop pulling image "test:latest"
Warning Failed 2s (x2 over 17s) kubelet, docker-for-desktop Failed to pull image "test:latest": rpc error: code = Unknown desc = Error response from daemon: pull access denied for test, repository does not exist or may require 'docker login'
Warning Failed 2s (x2 over 17s) kubelet, docker-for-desktop Error: ErrImagePull
Ce qui est intéressant, c’est que si j’essaie d’exécuter des images hébergées sur dockerhub, tout va bien, J’ai aussi essayé d’utiliser skaffold et cela fonctionne aussi comme un charme.
Je vois des problèmes similaires concernant minikube où la solution consiste à utiliser minikube docker deamon pour créer des images afin qu’elles puissent être référencées à partir du cluster Kubernetes. J'aimerais éviter de configurer un référentiel local, mais comment puis-je le faire fonctionner avec Docker Edge Kubernetes?
J'ai été en mesure d'exécuter une image locale en définissant la variable imagePullPolicy
sur Never
.
Par exemple:
apiVersion: v1
kind: Pod
metadata:
name: local-image-test
spec:
containers:
- name: local-image-container
image: local-image:latest
imagePullPolicy: Never
(Merci à https://github.com/kubernetes/kubernetes/issues/1293#issuecomment-357326426 pour cette solution)
Utilisez la version balisée de l'image plutôt que la dernière, car si vous envoyez des images Docker dans un environnement de production, vous devez simplement ignorer la dernière balise. Ne l'utilisez pas. Ne soyez pas tenté par ça. Il est facile de le regarder et de penser que votre script de déploiement doit simplement extraire «le plus récent» et que votre processus de construction garantira sa validité.
En plus de techtrainer comment et réponse, .__, je voudrais donner quelques exemples de la façon de le faire.
Règle générale. Vous devez utiliser la version de balise des images plutôt que latest
. Avec les balises Docker, plus vous êtes précis, mieux c'est. Soyez précis pour éviter d'utiliser la mauvaise image . Pensez-y si vous ne voulez pas que vos collègues ou d'autres utilisateurs de Docker affichent des images sans avoir la moindre idée de leur actualité . Soyez précis pour éviter de tels problèmes.
docker tag IMAGE ID image/TAG:version.d.m.y
Pour une meilleure gestion de vos images, vous devez avoir une convention intelligente de nommage .. Je préfère utiliser une scène, une version et une date de création de l'image. Par exemple:
docker tag 113a43faa138 ubuntu/prod:v1.8.6.2018
Cela signifie la phase de production, version 1, créée le 8 juin 2018.
Et c'est tout. Votre version est disponible et le nom est plus facile à comprendre pour vous et pour les autres utilisateurs de cette image.