拉出本地图像以在Kubernetes中运行一个pod

时间:2016-10-20 01:42:45

标签: docker kubernetes

我有一个Dockerfile创建的以下图像:

REPOSITORY   TAG      IMAGE ID       CREATED       SIZE 
ruby/lab     latest   f1903b1508cb   2 hours ago   729.6 MB

我有以下YAML文件:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ruby-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: ruby
    spec:
      containers:
      - name: ruby-app
        image: ruby/lab
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 4567

当我创建部署时,我在pod中获得了以下信息:

ruby-deployment-3830038651-sa4ii   0/1       ImagePullBackOff   0          7m
ruby-deployment-3830038651-u1tvc   0/1       ImagePullBackOff   0          7m

以下错误Failed to pull image "ruby/lab:latest": Error: image ruby/lab not found

 8m            2m              6       {kubelet minikube}      spec.containers{ruby}   Normal          Pulling         pulling image "ruby/lab:latest"
 8m            2m              6       {kubelet minikube}      spec.containers{ruby}   Warning         Failed          Failed to pull image "ruby/lab:latest": Error: image ruby/lab not found
 8m            2m              6       {kubelet minikube}                              Warning         FailedSync      Error syncing pod, skipping: failed to "StartContainer" for "ruby" with ErrImagePull: "Error: image ruby/lab not found"

真的有必要在docker中使用注册表吗?我只是想在本地进行测试并将我的代码/ repo传递给朋友进行测试

由于

5 个答案:

答案 0 :(得分:62)

您可以通过运行

将docker客户端指向VM的docker守护程序
eval $(minikube docker-env)

然后,您可以正常构建图像并使用kubectl创建kubernetes资源。确保你有

imagePullPolicy: IfNotPresent

在您的YAML或JSON规范中。

此外,还有一个标志可以将不安全的注册表传递给minikube VM。但是,必须在第一次创建机器时指定。

minikube start --insecure-registry

使用私有注册表时,您可能还想阅读此内容 http://kubernetes.io/docs/user-guide/images/

答案 1 :(得分:17)

AFAIR minikube在VM中运行,因此它不会看到您在主机上本地构建的图像,但是......如https://github.com/kubernetes/minikube/blob/master/docs/reusing_the_docker_daemon.md中所述,您可以eval $(minikube docker-env)实际使用def interval_point(a, b, x): return (b - a) * x + a 利用在minikube上运行的docker守护进程,从此在minikubes docker上构建你的图像,从而期望它可以在没有从外部注册表中拉出的情况下被minikubes k8s引擎使用

答案 2 :(得分:1)

要使用图像而不上传图像,可以按照以下步骤操作: 重要的是,由于要设置环境变量,因此必须位于同一外壳中!

  1. 使用eval $ {minikube docker-env)设置环境变量
  2. 构建映像(例如docker build -t my-image)
  3. 在pod规范中将图像设置为build标签(例如my-image)
  4. 将imagePullPolicy设置为“从不”,否则,Kubernetes将尝试下载图像。

答案 3 :(得分:0)

docker pull,在每个节点中手动拉所有图像 要么 运行DaemonSet提取所有图像

答案 4 :(得分:0)

我在Centos 8.1.1911上遇到了minikube v1.9.2,Kubernetes v1.18.0,Docker 19.03.2的类似问题。所有这些都在用于开发的一台机器上,我选择了本地不安全的Docker注册表。

以下步骤对我与本地kubernetes / minikube env共享本地不安全的docker注册表并允许kube节点(以及minikube)访问Internet很有用:

  1. 禁用防火墙以使DNS解析在内部起作用 具有(需要重新引导)的Docker容器:
    systemctl disable firewalld

    否则,在minikube启动期间会提示以下内容:
    VM可能无法解析外部DNS记录
    VM无法访问k8s.gcr.io,您可能需要配置代理或设置--image-repository。

    我在此浪费了几天。
  2. 检索创建和使用的网络接口的IP 对于我来说,我有docker0接口名称和IP 172.17.0.1。本地不安全的注册表将在此IP上暴露于minikube。
  3. 通过添加以下内容来配置Docker以从不安全的注册表中进行读取/写入 /etc/docker/daemon.json中的以下内容:
    {"insecure-registries" : ["172.17.0.1:5000"]}
  4. 重新启动Docker:
    systemctl restart docker.service
  5. 使用
    运行minikube minikube start --insecure-registry="172.17.0.1:5000"
    (如果已经运行或尚未启动,请在运行之前运行minikube delete
  6. 在本地不安全的注册表中生成,标记和推送您的应用程序:
    docker build -t mydemo/demo .
    docker tag mydemo/demo 172.17.0.1:5000/myminikubedemo
    docker push 172.17.0.1:5000/myminikubedemo
  7. 现在,当您为应用程序创建deployment.yaml描述符时,请放置正确的 图片路径,然后应用:
    kubectl create deployment mydemo --image=172.17.0.1:5000/myminikubedemo --dry-run=client -o=yaml > deployment.yaml
    kubectl apply -f deployment.yaml