【问题标题】:Pull a local image to run a pod in Kubernetes拉取本地镜像以在 Kubernetes 中运行 Pod
【发布时间】:2021-11-13 04:26:15
【问题描述】:

我有以下由 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 中有注册表吗?我只想在本地进行测试并将我的代码/仓库传递给朋友进行测试

谢谢

【问题讨论】:

    标签: docker kubernetes


    【解决方案1】:

    您可以通过运行将 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/

    【讨论】:

    • @CPB 如果它解决了你的问题,你能把它标记为答案吗?
    • 在没有minikube start --insecure-registry 的情况下对我有用。我不清楚将 imagePullPolicy 放在哪里,但我发现了。那应该在你的 deployment.yaml .spec.template.containers.imagePullPolicy
    • 如果我不使用 minikube 但想将镜像上传到远程集群怎么办? kubectl 可以上传图片吗?
    • 否 @PeterDotchev,您必须使用 docker CLI 来执行此操作。而且您必须配置一个 docker 镜像注册表,因为它不包含在 vanilla kubernetes 集群中。
    • @MattRickard :我不使用 minikube,我使用 kubectl、kubernetes 集群,我没有 docker 镜像注册表。我可以使用本地映像进行部署吗?
    【解决方案2】:

    AFAIR minikube 在虚拟机中运行,因此它不会看到您在主机上本地构建的映像,但是...如https://github.com/kubernetes/minikube/blob/master/docs/reusing_the_docker_daemon.md 中所述,您可以使用eval $(minikube docker-env) 实际利用在 minikube 上运行的 docker 守护进程,然后在 minikubes docker 上构建你的镜像,因此期望它可以在 minikubes k8s 引擎上使用,而无需从外部注册表中提取

    【讨论】:

    • 我不使用 minikube,我使用 kubectl、kubernetes。我该如何解决这个问题?
    • 我这样做了,但仍然找不到本地图像。
    • 如果您使用 SBT 发布映像,并且 SBT 作为在另一个进程空间中生成的现有守护进程运行,则它不会继承 minikube docker-env 定义的环境
    【解决方案3】:

    要在不上传图片的情况下使用图片,您可以按照以下步骤操作: 由于您正在设置环境变量,因此您必须在同一个 shell 中!

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

    【讨论】:

      【解决方案4】:

      我在 Centos 8.1.1911 上使用 minikube v1.9.2、Kubernetes v1.18.0、Docker 19.03.2 遇到了类似的问题。全部在用于开发的单台机器上,我选择了本地不安全的 docker 注册表。

      以下步骤有助于我与本地 kubernetes/minikube 环境共享本地不安全的 docker 注册表,并允许 kube 节点(以及 minikube)访问 Internet:

      1. 禁用防火墙以使 DNS 解析在内部工作 Docker 容器(需要重新启动):
        systemctl disable firewalld

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

        我为此浪费了几天时间。
      2. 检索创建和使用的网络接口的 IP 通过 docker,在我的情况下,我有 docker0 接口名称和 IP 172.17.0.1。本地不安全的注册表将暴露给此 IP 上的 minikube。
      3. 通过添加 关注/etc/docker/daemon.json:
        {"insecure-registries" : ["172.17.0.1:5000"]}
      4. 重启Docker:
        systemctl restart docker.service
      5. 使用
        minikube start --insecure-registry="172.17.0.1:5000"
        运行 minikube (如果已经运行或尚未启动,请在启动前运行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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2016-08-20
          • 2018-10-04
          • 1970-01-01
          • 2023-03-23
          • 2018-08-09
          • 2018-04-13
          • 2015-08-04
          • 2019-11-26
          相关资源
          最近更新 更多