Minikube ile yerel liman işçisi resimleri nasıl kullanılır?


302

Kullanmak istediğim birkaç liman işçisi resmim var minikube. Öncelikle yerel görüntüyü doğrudan kullanmak yerine aynı görüntüyü yüklemek ve indirmek zorunda kalmak istemiyorum. Bunu nasıl yaparım?

Denediğim
şeyler : 1. Bu komutları çalıştırmayı denedim (ayrı ayrı, minikube örneklerini iki kez silerek ve yeni başlayarak)

kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989
kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 imagePullPolicy=Never

Çıktı :

NAME                    READY     STATUS              RESTARTS   AGE
hdfs-2425930030-q0sdl   0/1       ContainerCreating   0          10m

Sadece bir statüde takılı kalır ama asla hazır durumuna ulaşmaz.


2. Bir kayıt defteri oluşturmayı ve sonra görüntüleri içine koymayı denedim ama bu da işe yaramadı. Bunu yanlış yapmış olabilirim ama bu görevi yerine getirmek için uygun talimatları bulamıyorum.

Lütfen yerel kubernetes örneğinde yerel docker görüntülerini kullanma talimatlarını sağlayın.
İşletim Sistemi: ubuntu 16.04
Docker: Docker sürüm 1.13.1, build 092cba3
Kubernetes:

Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.3", GitCommit:"029c3a408176b55c30846f0faedf56aae5992e9b", GitTreeState:"clean", BuildDate:"2017-02-15T06:40:50Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"08e099554f3c31f6e6f07b448ab3ed78d0520507", GitTreeState:"clean", BuildDate:"1970-01-01T00:00:00Z", GoVersion:"go1.7.1", Compiler:"gc", Platform:"linux/amd64"}

Birisi bunu yapmak için docker-compose kullanan bir çözüm elde etmeme yardımcı olabilirse, bu harika olurdu. Teşekkürler.

Düzenle :

Görüntüler yüklendi eval $(minikube docker-env:

REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
fluxcapacitor/jupyterhub                              latest              e5175fb26522        4 weeks ago         9.59 GB
fluxcapacitor/zeppelin                                latest              fe4bc823e57d        4 weeks ago         4.12 GB
fluxcapacitor/prediction-pmml                         latest              cae5b2d9835b        4 weeks ago         973 MB
fluxcapacitor/scheduler-airflow                       latest              95adfd56f656        4 weeks ago         8.89 GB
fluxcapacitor/loadtest                                latest              6a777ab6167c        5 weeks ago         899 MB
fluxcapacitor/hdfs                                    latest              00fa0ed0064b        6 weeks ago         1.16 GB
fluxcapacitor/sql-mysql                               latest              804137671a8c        7 weeks ago         679 MB
fluxcapacitor/metastore-1.2.1                         latest              ea7ce8c5048f        7 weeks ago         1.35 GB
fluxcapacitor/cassandra                               latest              3cb5ff117283        7 weeks ago         953 MB
fluxcapacitor/apachespark-worker-2.0.1                latest              14ee3e4e337c        7 weeks ago         3.74 GB
fluxcapacitor/apachespark-master-2.0.1                latest              fe60b42d54e5        7 weeks ago         3.72 GB
fluxcapacitor/package-java-openjdk-1.8                latest              1db08965289d        7 weeks ago         841 MB
gcr.io/google_containers/kubernetes-dashboard-amd64   v1.5.1              1180413103fd        7 weeks ago         104 MB
fluxcapacitor/stream-kafka-0.10                       latest              f67750239f4d        2 months ago        1.14 GB
fluxcapacitor/pipeline                                latest              f6afd6c5745b        2 months ago        11.2 GB
gcr.io/google-containers/kube-addon-manager           v6.1                59e1315aa5ff        3 months ago        59.4 MB
gcr.io/google_containers/kubedns-amd64                1.9                 26cf1ed9b144        3 months ago        47 MB
gcr.io/google_containers/kube-dnsmasq-amd64           1.4                 3ec65756a89b        5 months ago        5.13 MB
gcr.io/google_containers/exechealthz-amd64            1.2                 93a43bfb39bf        5 months ago        8.37 MB
gcr.io/google_containers/pause-amd64           

Yanıtlar:


410

Gibi README açıklanır sizinle Minikube gelen Docker cini yeniden kullanabilirsiniz eval $(minikube docker-env).

Bir resmi yüklemeden kullanmak için aşağıdaki adımları uygulayabilirsiniz:

  1. Ortam değişkenlerini eval $(minikube docker-env)
  2. Görüntüyü Minikube Docker arka plan programı ile oluşturun (ör. docker build -t my-image .)
  3. Pod belirtimindeki görüntüyü derleme etiketi gibi ayarlayın (ör. my-image)
  4. Set imagePullPolicyiçin Never, aksi Kubernetes görüntü indirmek için çalışacağız.

Önemli not:eval $(minikube docker-env) Yalnızca geçerli kabuk oturumu için ortam değişkenlerini ayarladığından, kullanmak istediğiniz her terminalde çalıştırmanız gerekir .


1
AFAIS bunu sadece yeni bir minukube ile yapabilirsiniz minikube start --disk-size 100g. Başka bir çözüm eski görüntüleri docker imagesve ile silmek olacaktır docker rmi.
svenwltr

6
eval $(minikube docker-env)Görüntüleri yeniden oluşturmaya çalışmadan ÖNCE çalıştığınız terminali kapattıktan sonra çalıştırmayı hatırlamak çok önemli ... sadece 6 saat minikube'de güncellenmeyen bir görüntü ile kavga ... bir paket güncellenmiyor gibi görünüyordu .. gerçekten sadece minikube başvurulan görüntü güncelleme değil.
Mike

1
Varsayılan çekme ilkesi, IfNotPresenttek yapmamız gereken ortam değişkenlerini ayarlamaktır.
Beygi

29
Eğer u geri dönmek veya minikube env çıkmak ..eval $(minikube docker-env -u)
Budi Mulyo

1
@nmxl buraya
testuser

175

@Svenwltr'in çözümüne dayanarak benim için ne işe yaradı:

# Start minikube
minikube start

# Set docker env
eval $(minikube docker-env)

# Build image
docker build -t foo:0.0.1 .

# Run in minikube
kubectl run hello-foo --image=foo:0.0.1 --image-pull-policy=Never

# Check that it's running
kubectl get pods

3
Yukarıdaki komut satırının yml sürümünü (imagePullPolicy ile ilgili olarak) burada bulabilirsiniz: kubernetes.io/docs/concepts/containers/images
granadaCoder

128

Bu Yanıt minikube ile sınırlı değildir!

Yerel bir kayıt defteri kullanın:

docker run -d -p 5000:5000 --restart=always --name registry registry:2

Şimdi resminizi doğru şekilde etiketleyin:

docker tag ubuntu localhost:5000/ubuntu

Localhost'un kayıt defteri kapsayıcısını çalıştıran makinenin dns adı olarak değiştirilmesi gerektiğini unutmayın.

Şimdi resminizi yerel kayıt defterine aktarın:

docker push localhost:5000/ubuntu

Geri çekebilmelisiniz:

docker pull localhost:5000/ubuntu

Şimdi yaml dosyanızı yerel kayıt defterini kullanacak şekilde değiştirin.

Kayıt defterinde görüntüleri devam ettirmek için birimi uygun bir yere monte etmeyi düşünün.

Güncelleme:

Eli'nin belirttiği gibi, http'yi kullanabilmek için yerel kayıt defterini güvensiz olarak eklemeniz gerekir (localhost kullanırken geçerli olmayabilir, ancak yerel ana bilgisayar adını kullanırken geçerlidir)

Üretimde http kullanmayın, işleri güvence altına almak için çaba gösterin.


2
| Şimdi yaml dosyanızı yerel kayıt defterini kullanacak şekilde değiştirin. Bunu biraz açıklayabilir misiniz? Yerel kayıt (serin hile) itti ama ben bağlanmak için minikube alamıyorum aynı sorun var.
Zach Estela

3
@ZachEstela, yaml dosyasındaki resim adını değiştir<registryIP>:5000/ubuntu
Farhad Farahi

@FarhadFarahi "Kayıt defteri kapsayıcısını çalıştıran makinenin dns adını" nereden bulabilirim?
Daan

1
@FarhadFarahi Dizüstü bilgisayarımı sana verirsem nasıl öğrenirsin? Sadece bilmek istiyorum. Windows için docker'ı almak için docker öğretici adımlarını izledim.
Daan

1
@FarhadFarahi: http: docs.docker.com/registry/insecure kullanmak için yerel kayıt defterini güvensiz olarak eklemeniz gerekeceğini lütfen cevabınıza ekleyin (localhost kullanırken geçerli olmayabilir, ancak yerel ana bilgisayar adını kullanırken geçerlidir ).
Eli Algranti

14

Bu cevaba dayanarak @ Farhad'ın cevabına ekleyerek ,

Bu, yerel bir kayıt defteri ayarlama adımlarıdır.

Yerel makinede kurulum

Yerel makinede ana makine adını ayarla: /etc/hostsbu satırı eklemek için düzenle

docker.local 127.0.0.1

Şimdi yerel bir kayıt defteri başlatın (arka plan programı olmayan modu çalıştırmak için -d öğesini kaldırın):

docker run -d -p 5000:5000 --restart=always --name registry registry:2

Şimdi resminizi doğru şekilde etiketleyin:

docker tag ubuntu docker.local:5000/ubuntu

Şimdi resminizi yerel kayıt defterine aktarın:

docker push docker.local:5000/ubuntu

Görüntünün aktarıldığını doğrulayın:

curl -X GET http://docker.local:5000/v2/ubuntu/tags/list

Minikube'de kurulum

şununla ssh içine minikube: minukube ssh

/etc/hostsbu satırı eklemek için düzenle

docker.local <your host machine's ip>

Erişimi doğrulayın:

curl -X GET http://docker.local:5000/v2/ubuntu/tags/list

Şimdi çekmeye çalışırsanız, bir http erişim hatası alabilirsiniz.

Güvenli olmayan erişimi etkinleştir :

Her zaman bu yerel kurulum ile minkube kullanmayı planlıyorsanız, varsayılan olarak güvenli olmayan kayıt defterini kullanmak için bir minikube oluşturun (mevcut kümede çalışmaz).

minikube start --insecure-registry="docker.local:5000"

aksi takdirde aşağıdaki adımları izleyin:

systemctl stop docker

docker serice dosyasını düzenleyin: get path from systemctl status docker

olabilir :

/etc/systemd/system/docker.service.d/10-machine.conf veya /usr/lib/systemd/system/docker.service

bu metni ekleyin (192.168.1.4'ü ipinizle değiştirin)

--insecure-kayıt defteri docker.local: 5000 --insecure-kayıt defteri 192.168.1.4:5000

bu hatta

ExecStart = / usr / bin / docker arka plan programı -H tcp: //0.0.0.0: 2376 -H unix: ///var/run/docker.sock --tlsverify --tlscacert /etc/docker/ca.pem - tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label sağlayıcı = virtualbox --insecure-kayıt 10.0.0.0/24

systemctl daemon-reload
systemctl start docker

çekmeyi deneyin:

docker pull docker.local:5000/ubuntu

Şimdi yaml dosyanızı yerel kayıt defterini kullanacak şekilde değiştirin.

  containers:
    - name: ampl-django
      image: dockerhub/ubuntu

için

  containers:
    - name: ampl-django
      image: docker.local:5000/nymbleup

Üretimde http kullanmayın, işleri güvence altına almak için çaba gösterin.


12

Kabul edilen cevaba ek olarak, asıl istediğinizi ( runkomutu kullanarak bir dağıtım oluşturma ) aşağıdaki komutla da gerçekleştirebilirsiniz:

kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 --generator=run-pod/v1 

Jeneratör hakkındaki bilgileri Kubernetes-dev forumunda buldum:

Kullanıyorsanız, sizin için varsayılan olarak ayarlanmış kubectl runbir bildirim oluşturur . Bir almak için bu komutu kullanabilirsiniz OF için çalışacak, :imagePullPolicyAlwaysimagePullPolicyIfNotPresentminikube

kubectl run --image=<container> --generator=run-pod/v1

Dan Lorenc

https://groups.google.com/forum/#!topic/kubernetes-dev/YfvWuFr_XOM


9

Bir yaklaşım, görüntüyü yerel olarak oluşturmak ve daha sonra yapmaktır:

docker save imageNameGoesHere | pv | (eval $(minikube docker-env) && docker load)

minikube docker-envfarklı bir kullanıcı / sudo altında çalışan doğru bilgileri döndürmeyebilir. Bunun yerine koşabilirsinsudo -u yourUsername minikube docker-env .

Bunun gibi bir şey döndürmelidir:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/chris/.minikube/certs"
export DOCKER_API_VERSION="1.23"
# Run this command to configure your shell:
# eval $(minikube docker-env)

Doğru komutdocker save imageNameGoesHere > pv | (eval $(minikube docker-env) && docker load)
Salvador

1
docker save imageNameGoesHere | (eval $(minikube docker-env) && docker load)benim için çalıştı
lhaferkamp


4

Kubernetes dokümanlarından:

https://kubernetes.io/docs/concepts/containers/images/#updating-images

Varsayılan çekme ilkesi, Kubelet'in zaten varsa bir görüntüyü çekmeyi atlamasına neden olan IfNotPresent'tir. Her zaman bir çekme zorlamak istiyorsanız, aşağıdakilerden birini yapabilirsiniz:

  • kabın imagePullPolicy öğesini Her Zaman olarak ayarlayın;
  • use: en son kullanılacak resmin etiketi;
  • AlwaysPullImages giriş denetleyicisini etkinleştirin.

Ya da başka bir şekilde okuyun:: latest etiketinin kullanılması görüntüleri daima çekilmeye zorlar. Eğer kullanırsanız eval $(minikube docker-env), yukarıda belirtildiği gibi, ardından ya herhangi etiketi kullanmak veya yerel Görüntüye etiket atamazsanız zorla onu çekmeye çalışıyorum Kubernetes önleyebilirsiniz.



3

"Yerel docker görüntüleri Minikube ile nasıl kullanılır?" Sorusunu yanıtlayan daha basit bir yöntem, görüntüyü bir tar dosyasına kaydetmek ve minikube'ye yüklemek:

# export the docker image to a tar file
docker save --output my-image.tar the.full.path.to/the/docker/image:the-tag
# set local environment variables so that docker commands go to the docker in minikube
eval $(minikube docker-env)
# or if on windows: @FOR /f "tokens=*" %i IN ('minikube docker-env') DO @%i
# import the docker image from the tar file into minikube
docker load --input my-image.tar
# cleanup - put docker back to normal
eval $(minikube docker-env -u)
# or if on windows: @FOR /f "tokens=*" %i IN ('minikube docker-env -u') DO @%i

Sonra görüntüyü çalıştırmak aşağıdaki gibi bir komut içerir. "--İmage-pull-policy = Asla" parametresini eklediğinizden emin olun.

kubectl run my-image --image=the.full.path.to/the/docker/image:the-tag --image-pull-policy=Never --port=80

İyi açıkladı, bir cazibe gibi çalıştı. Ben sadece aramak zorunda docker saveile sudove daha sonra set sudo chmod 664 my-image.tarbenim şimdiki kullanıcı için kullanılabilir hale getirmek için.
Meir Gabay

Bu inandığım en hızlı yaklaşım olmalı.
Shiwakant Bharti

2

Eğer bir tarball görüntü varsa, sadece size görüntülerin yerel liman işçisi seti yükleyebilirsiniz, önceki cevaplara eklemek için docker image load -i /path/image.tarçalıştırmak için hatırlamak hatırlatırız sonra eval $(minikube docker-env) minikube yerel olarak yüklü liman işçisi motoruyla görüntüleri paylaşmak olmadığından,.


2

Diğer yanıtlar VM ile minikube kullandığınızı varsayar, böylece yerel resimlerinize minikube VM'den erişilemez.

İle minikube kullanıyorsanız --vm-driver=none, image_pull_policyAsla olarak ayarlayarak yerel görüntüleri kolayca yeniden kullanabilirsiniz:

kubectl run hello-foo --image=foo --image-pull-policy=Never

veya imagePullPolicyilgili .yamlmanifestlerdeki kaplayıcılar için ayar alanı .


2

Bir fikir, liman işçisi görüntüsünü yerel olarak kaydetmek ve daha sonra minikube'ye aşağıdaki gibi yüklemek olacaktır:

Diyelim ki, zaten puckel / docker-airflow resminiz var.

  1. Bu görüntüyü yerel diske kaydedin -

    docker save puckel/docker-airflow > puckel_docker_airflow.tar

  2. Şimdi minikube docker env'ye girin -

    eval $(minikube docker-env)

  3. Yerel olarak kaydedilen resmi yükle -

    docker load < puckel_docker_airflow.tar

Bu kadar basit ve bir cazibe gibi çalışıyor.


Hala kabul edilen yanıtın ipucuna ihtiyacınız var Set the imagePullPolicy to Never. Resminiz bir adresle etiketlenmişse, us.icr.io/mydiv/my-service:v0.0.1konuşlandırma bu resmi uzaktan çekmeye çalışır. Görüntüyü zaten manuel olarak kopyaladığınızdan, k8'lerin görüntüyü erişemediği bir adresten (kapsayıcı kayıt defteri) çekmesini engellemeniz gerekir.
colm.anseo

1

ya docker'ın vm içinde k8s çalıştırabilirseniz? docker masaüstünün daha yeni sürümleriyle bunun için yerel destek var ... sadece bu desteği etkinleştirmeniz gerekiyor.

https://www.docker.com/blog/kubernetes-is-now-available-in-docker-desktop-stable-channel/ https://www.docker.com/blog/docker-windows-desktop-now- Kubernetes /

bunu nasıl buldum:

dümen için belgeleri okurken, minikube'nin nasıl kurulacağı konusunda kısa bir eğitim verir. bu öğretici minikube'yu docker'dan farklı / ayrı bir vm'ye yükler.

dümen çizelgelerimi kurmanın zamanı geldiğinde, docker kullanarak oluşturduğum görüntüleri çekmek için dümen / k8'ler alamadım. Bu soruya bu şekilde geldim.

yani ... Eğer k8s docker masaüstü ile birlikte gelen herhangi bir sürümü ile yaşayabilir ve vm docker ne olursa olsun çalışan ile yaşayabilir, o zaman belki bu çözüm diğerlerinden biraz daha kolay.

yasal uyarı: windows / linux kapları arasında geçişin herhangi bir şeyi nasıl etkileyeceğinden emin değilim.


Ben de imagePullPolicies IfNotPresent için ayarlamak zorunda düşünüyorum
chad

1

Yerel Docker görüntünüzü doğrudan minikube'ye aktarmanın bir denemesi ve etkili bir yolu var, bu da görüntüleri minikube'de tekrar oluşturmaktan zaman kazandıracak.

minikube cache add <Image name>

Daha fazla ayrıntı burada

Görüntüleri miniküp'e göndermek için tüm olası yöntem burada belirtilmiştir: https://minikube.sigs.k8s.io/docs/handbook/pushing/


0

docker kabuğunu tekrar kullanabilirsiniz eval $(minikube docker-env), alternatif docker save | docker loadolarak kabuklardan da yararlanabilirsiniz .


0
  1. minikube docker-env kurulumu
  2. aynı docker görüntüsünü tekrar oluşturun (minikube docker-env kullanarak)
  3. dağıtımınızda imagePullPolicy öğesini Asla olarak değiştir

aslında burada olan şey, Minikube'ünüz docker arka plan programınızı bağımsız bir hizmet olduğu için tanıyamaz.

 "eval $(minikube docker-env)"

Aşağıdaki komutu çalıştırırsanız, minikube'ünüzün liman işçisini nerede aradığını gösterecektir.

~$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.37.192:2376"
export DOCKER_CERT_PATH="/home/ubuntu/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

**# To point your shell to minikube's docker-daemon, run:**
# eval $(minikube -p minikube docker-env)

Minikube docker-env kurulumunu yaptıktan sonra tekrar görüntü oluşturmanız gerekir, aksi takdirde başarısız olur.



0

yerel docker görüntülerini kubernetes'de çalıştırma adımları
1. eval $ (minikube -p minikube docker-env)
2. yapı dosyasında, spec bölümü altında -> kapsayıcılar
eklemek imagePullPolicy: IfNotPresent
veya imagePullPolicy: Asla

apiVersion: "v1"
kind: Pod
metadata:
    name: web
    labels:
        name: web
        app: demo
spec:
    containers:
        - name: web
          image: web:latest
          imagePullPolicy: IfNotPresent
          ports:
              - containerPort: 5000
                name: http
                protocol: TCP


3. sonra çalıştırın kubectl create -f <filename>


0

bu çalışıyor

 minikube cache add <image>:<tag> 

6
Bu kod soruyu cevaplayabilirken, bu kodun soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini arttırır.
n1colas.m
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.