Bagaimana cara menggunakan gambar buruh pelabuhan lokal dengan Minikube?


301

Saya memiliki beberapa gambar buruh pelabuhan yang ingin saya gunakan minikube. Saya tidak ingin terlebih dahulu harus mengunggah dan kemudian mengunduh gambar yang sama daripada hanya menggunakan gambar lokal secara langsung. Bagaimana saya melakukan ini?

Hal-hal yang saya coba:
1. Saya mencoba menjalankan perintah-perintah ini (secara terpisah, menghapus instance dari minikube dua kali dan mulai yang baru)

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

Output:

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

Itu hanya terjebak pada beberapa status tetapi tidak pernah mencapai status siap.


2. Saya mencoba membuat registri dan kemudian memasukkan gambar ke dalamnya tetapi itu tidak berhasil. Saya mungkin telah melakukan itu secara tidak benar tetapi saya tidak dapat menemukan instruksi yang tepat untuk melakukan tugas ini.

Harap berikan instruksi untuk menggunakan gambar buruh pelabuhan lokal dalam contoh kubernet lokal.
OS: ubuntu 16.04
Docker: Docker versi 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"}

Jika seseorang dapat membantu saya mendapatkan solusi yang menggunakan komposisi buruh pelabuhan untuk melakukan ini, itu akan luar biasa. Terima kasih.

Edit:

Gambar dimuat 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           

Jawaban:


408

Seperti yang dijelaskan README , Anda dapat menggunakan kembali daemon Docker dari Minikube dengan eval $(minikube docker-env).

Jadi untuk menggunakan gambar tanpa mengunggahnya, Anda dapat mengikuti langkah-langkah ini:

  1. Tetapkan variabel lingkungan dengan eval $(minikube docker-env)
  2. Bangun gambar dengan daemon Docker dari Minikube (mis. docker build -t my-image .)
  3. Atur gambar dalam spesifikasi pod seperti tag build (mis. my-image)
  4. Setel imagePullPolicyke Never, jika tidak, Kubernetes akan mencoba mengunduh gambar.

Catatan penting: Anda harus menjalankan eval $(minikube docker-env)pada setiap terminal yang ingin Anda gunakan, karena hanya mengatur variabel lingkungan untuk sesi shell saat ini.


1
AFAIS Anda hanya dapat melakukannya dengan minukube baru dengan minikube start --disk-size 100g. Solusi lain adalah menghapus gambar lama dengan docker imagesdan docker rmi.
svenwltr

6
Sangat penting untuk diingat untuk menjalankan eval $(minikube docker-env)setelah menutup terminal Anda bekerja di SEBELUM Anda mencoba untuk membangun kembali gambar ... hanya membakar 6 jam berkelahi dengan gambar yang tidak memperbarui di minikube ... tampak seperti paket tidak memperbarui .. benar-benar tidak memperbarui gambar yang direferensikan minikube.
Mike

1
Kebijakan tarikan standar adalah IfNotPresentyang berarti yang harus kita lakukan adalah mengatur variabel lingkungan.
Beygi

29
Jika Anda ingin kembali atau keluar dari minikube ..eval $(minikube docker-env -u)
Budi Mulyo

1
@nmxl lihat di sini
testuser

175

Apa yang berhasil untuk saya, berdasarkan solusi oleh @svenwltr:

# 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
Anda dapat menemukan versi yml dari baris perintah di atas (sehubungan dengan imagePullPolicy) di sini: kubernetes.io/docs/concepts/containers/images
granadaCoder

128

Jawaban ini tidak terbatas pada minikube!

Gunakan registri lokal:

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

Sekarang beri tag pada gambar Anda dengan benar:

docker tag ubuntu localhost:5000/ubuntu

Perhatikan bahwa localhost harus diubah menjadi nama mesin yang menjalankan register registri.

Sekarang dorong gambar Anda ke registri lokal:

docker push localhost:5000/ubuntu

Anda harus dapat menariknya kembali:

docker pull localhost:5000/ubuntu

Sekarang ubah file yaml Anda untuk menggunakan registri lokal.

Pikirkan tentang pemasangan volume di lokasi yang sesuai untuk mempertahankan gambar pada registri.

memperbarui:

seperti yang dinyatakan Eli, Anda harus menambahkan registri lokal sebagai tidak aman untuk menggunakan http (mungkin tidak berlaku saat menggunakan localhost tetapi berlaku jika menggunakan nama host lokal)

Jangan gunakan http dalam produksi, berusahalah untuk mengamankan segalanya.


2
| Sekarang ubah file yaml Anda untuk menggunakan registri lokal. Apakah Anda bisa menjelaskan ini sedikit? Saya mendorong ke registri lokal (trik keren) tapi saya punya masalah yang sama bahwa saya tidak bisa mendapatkan minikube untuk terhubung.
Zach Estela

3
@ZachEstela ubah nama gambar di yaml menjadi<registryIP>:5000/ubuntu
Farhad Farahi

@ FarhadFarahi Di mana saya dapat menemukan "nama dns dari mesin yang menjalankan register registry"?
Daan

1
@ FarhadFarahi Jika saya memberikan laptop saya kepada Anda, bagaimana Anda mengetahuinya? Saya hanya ingin mengetahuinya. Saya mengikuti langkah-langkah tutorial buruh pelabuhan untuk membuat buruh pelabuhan menjalankan windows.
Daan

1
@ FarhadFarahi: Silakan tambahkan ke jawaban Anda bahwa Anda harus menambahkan registri lokal sebagai tidak aman untuk menggunakan http: docs.docker.com/registry/insecure (mungkin tidak berlaku saat menggunakan localhost tetapi berlaku jika menggunakan nama host lokal ).
Eli Algranti

14

Menambahkan ke jawaban @ Farhad berdasarkan jawaban ini ,

Ini adalah langkah-langkah untuk mengatur registri lokal.

Pengaturan di mesin lokal

Atur nama host di mesin lokal: edit /etc/hostsuntuk menambahkan baris ini

docker.local 127.0.0.1

Sekarang mulai registry lokal (hapus -d untuk menjalankan mode non-daemon):

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

Sekarang beri tag pada gambar Anda dengan benar:

docker tag ubuntu docker.local:5000/ubuntu

Sekarang dorong gambar Anda ke registri lokal:

docker push docker.local:5000/ubuntu

Verifikasi bahwa gambar didorong:

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

Setup di minikube

ssh ke dalam minikube dengan: minukube ssh

edit /etc/hostsuntuk menambahkan baris ini

docker.local <your host machine's ip>

Verifikasi akses:

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

Sekarang jika Anda mencoba menarik, Anda mungkin mendapatkan kesalahan akses http.

Aktifkan akses tidak aman :

Jika Anda selalu berencana untuk menggunakan minkube dengan pengaturan lokal ini maka buatlah minikube untuk menggunakan registri tidak aman secara default (tidak akan berfungsi pada kluster yang ada).

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

ikuti langkah-langkah di bawah ini:

systemctl stop docker

edit file server buruh pelabuhan: dapatkan jalur dari systemctl status docker

mungkin :

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

tambahkan teks ini (ganti 192.168.1.4 dengan ip Anda)

--insecure-registry docker.local: 5000 --insecure-registry 192.168.1.4-5000

ke baris ini

ExecStart = / usr / bin / docker daemon -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 provider = virtualbox --insecure-registry 10.0.0.0/24

systemctl daemon-reload
systemctl start docker

coba tarik:

docker pull docker.local:5000/ubuntu

Sekarang ubah file yaml Anda untuk menggunakan registri lokal.

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

untuk

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

Jangan gunakan http dalam produksi, berusahalah untuk mengamankan segalanya.


12

Selain jawaban yang diterima, Anda juga dapat mencapai apa yang awalnya Anda inginkan (membuat penyebaran menggunakan runperintah) dengan perintah berikut:

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

Saya menemukan informasi tentang generator di forum Kubernetes-dev:

Jika Anda menggunakan kubectl run, itu menghasilkan manifes untuk Anda yang telah imagePullPolicydiatur Alwayssecara default. Anda dapat menggunakan perintah ini untuk mendapatkan imagePullPolicydari IfNotPresent, yang akan bekerja untuk minikube:

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

Dan Lorenc

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


9

Salah satu pendekatan adalah membangun gambar secara lokal dan kemudian melakukan:

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

minikube docker-envmungkin tidak mengembalikan info yang benar yang berjalan di bawah pengguna / sudo yang berbeda. Sebaliknya Anda bisa lari sudo -u yourUsername minikube docker-env.

Seharusnya mengembalikan sesuatu seperti:

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)

Perintah yang benar adalahdocker save imageNameGoesHere > pv | (eval $(minikube docker-env) && docker load)
salvador

1
docker save imageNameGoesHere | (eval $(minikube docker-env) && docker load)bekerja untuk saya
lhaferkamp


4

Dari kubernetes docs:

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

Kebijakan tarikan standar adalah IfNotPresent yang menyebabkan Kubelet melompat menarik gambar jika sudah ada. Jika Anda ingin selalu memaksakan tarikan, Anda dapat melakukan salah satu dari yang berikut:

  • atur imagePullPolicy wadah ke Selalu;
  • gunakan: terbaru sebagai tag untuk gambar untuk digunakan;
  • aktifkan pengontrol penerimaan AlwaysPullImages.

Atau baca cara lain: Menggunakan: tag terbaru memaksa gambar untuk selalu ditarik. Jika Anda menggunakan eval $(minikube docker-env)seperti yang disebutkan di atas, maka jangan gunakan tag apa pun, atau tetapkan tag ke gambar lokal Anda, Anda dapat menghindari Kubernetes yang mencoba menariknya dengan paksa.



3

Metode sederhana yang menjawab pertanyaan asli "Bagaimana cara menggunakan gambar buruh pelabuhan lokal dengan Minikube?", Adalah menyimpan gambar ke file tar dan memuatnya ke dalam minikube:

# 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

Kemudian menjalankan gambar melibatkan perintah seperti berikut. Pastikan untuk memasukkan parameter "--image-pull-policy = Never".

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

Dijelaskan dengan baik, bekerja seperti pesona. Aku hanya harus memanggil docker savedengan sudo, dan kemudian mengatur sudo chmod 664 my-image.taruntuk membuatnya tersedia untuk pengguna saya saat ini.
Meir Gabay

Ini harus menjadi pendekatan tercepat yang saya percaya.
Shiwakant Bharti

2

Untuk menambah jawaban sebelumnya, jika Anda memiliki gambar tarball, Anda cukup memuatnya kepada Anda set buruh pelabuhan lokal gambar. docker image load -i /path/image.tarHarap ingat untuk menjalankannya setelah eval $(minikube docker-env) , karena minikube tidak berbagi gambar dengan mesin docker yang dipasang secara lokal.


2

Jawaban lain misalkan Anda menggunakan minikube dengan VM, sehingga gambar lokal Anda tidak dapat diakses dari minikube VM.

Jika Anda menggunakan minikube with --vm-driver=none, Anda dapat dengan mudah menggunakan kembali gambar lokal dengan mengatur image_pull_policyke Never:

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

atau mengatur imagePullPolicybidang untuk cotainers dalam .yamlmanifes yang sesuai .


2

Satu ide adalah menyimpan gambar buruh pelabuhan secara lokal dan kemudian memuatnya ke dalam minikube sebagai berikut:

Katakanlah, misalnya, Anda sudah memiliki gambar aliran udara puckel / buruh pelabuhan.

  1. Simpan gambar itu ke disk lokal -

    docker save puckel/docker-airflow > puckel_docker_airflow.tar

  2. Sekarang masuk ke dalam minikube docker env -

    eval $(minikube docker-env)

  3. Muat gambar yang disimpan secara lokal -

    docker load < puckel_docker_airflow.tar

Sederhana dan bekerja seperti pesona.


Anda masih memerlukan tip jawaban yang diterima Set the imagePullPolicy to Never. Jika gambar Anda ditandai dengan alamat misalnya us.icr.io/mydiv/my-service:v0.0.1maka penyebaran akan mencoba untuk menarik gambar ini dari jarak jauh. Karena Anda sudah menyalin gambar secara manual, Anda perlu menekan k8 agar tidak menarik gambar dari alamat (registry kontainer) yang tidak dapat diakses.
colm.anseo

1

bagaimana jika Anda bisa menjalankan k8 di dalam dock dock? ada dukungan asli untuk ini dengan versi desktop docker yang lebih baru ... Anda hanya perlu mengaktifkan dukungan itu.

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

bagaimana saya menemukan ini:

saat membaca dokumen untuk helm, mereka memberi Anda tutorial singkat cara menginstal minikube. tutorial yang menginstal minikube di vm yang berbeda / terpisah dari buruh pelabuhan.

jadi ketika tiba saatnya untuk menginstal grafik helm saya, saya tidak bisa mendapatkan helm / k8 untuk menarik gambar yang saya buat menggunakan buruh pelabuhan. karena itulah saya tiba di sini untuk pertanyaan ini.

jadi ... jika Anda dapat hidup dengan versi k8 apa pun yang dilengkapi dengan desktop docker, dan Anda dapat menjalankannya dengan menjalankan apa pun yang dimiliki vm docker, maka mungkin solusi ini sedikit lebih mudah daripada yang lain.

disclaimer: tidak yakin bagaimana pergantian antar wadah windows / linux akan berdampak apa saja.


Saya pikir saya juga harus mengatur imagePullPolicies ke IfNotPresent juga
chad

1

Ada satu esai dan cara efektif untuk mendorong gambar Docker lokal Anda langsung ke minikube, yang akan menghemat waktu dari membangun gambar di minikube lagi.

minikube cache add <Image name>

Lebih detail di sini

Semua metode yang memungkinkan untuk mendorong gambar ke minikube disebutkan di sini: https://minikube.sigs.k8s.io/docs/handbook/pushing/


0

Anda dapat menggunakan kembali shell docker, dengan eval $(minikube docker-env), sebagai alternatif, Anda dapat memanfaatkan docker save | docker loadseluruh shell.


0
  1. setup minikube docker-env
  2. lagi membangun gambar buruh pelabuhan yang sama (menggunakan minikube docker-env)
  3. ubah imagePullPolicy menjadi Never di deployment Anda

sebenarnya apa yang terjadi di sini, Minikube Anda tidak dapat mengenali daemon buruh pelabuhan Anda karena ini adalah layanan independen. Anda harus terlebih dahulu mengatur lingkungan minikube-buruh pelabuhan menggunakan perintah di bawah ini untuk memeriksa

 "eval $(minikube docker-env)"

Jika Anda menjalankan perintah di bawah ini, itu akan menunjukkan di mana minikube Anda mencari buruh pelabuhan.

~$ 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)

Anda harus membangun kembali gambar setelah Anda memasang minikube docker-env yang lain itu akan gagal.



0

langkah-langkah untuk menjalankan gambar buruh pelabuhan lokal di kubernetes
1. eval $ (minikube -p minikube docker-env)
2. di file artifact, di bawah bagian spesifikasi -> wadah
tambahkan imagePullPolicy: IfNotPresent
atau imagePullPolicy: Never

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. lalu jalankan kubectl create -f <filename>

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.