拉一个当地的图像,在 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

当我创建部署时,我在吊舱中得到了以下信息:

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 传递给一个朋友以进行测试

谢谢

95997 次浏览

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

您可以通过运行

eval $(minikube docker-env)

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

imagePullPolicy: IfNotPresent

在 YAML 或 JSON 规范中。

此外,在不安全的注册中心中有一个标志要传递给 minikubeVM。但是,必须在第一次创建计算机时指定此值。

minikube start --insecure-registry

在使用私有注册表时,您可能还希望读取此内容 Http://kubernetes.io/docs/user-guide/images/

码头拉,在每个节点手动拉所有图像 或者 运行一个 DaemonSet 来获取所有图像

要使用图像而不上传它,你可以遵循以下步骤: 因为要设置环境变量,所以在相同的 shell 中是很重要的!

  1. 使用 eval $(minikube docker-env)设置环境变量
  2. 建立形象(如 Docker Build-t my-image)
  3. 在 pod 规格中设置图像,如 build 标签(如 my-image)
  4. 将 image PullPolicy 设置为 Never,否则,Kubernetes 将尝试下载图像。

我运行 minikube v1.9.2,Kubernetes v1.18.0,Docker 19.03.2 on Centos 8.1.1911时遇到过类似的问题。所有在一个单一的机器用于开发,我选择了一个本地不安全的船坞注册表。

下面的步骤对于我与本地 kubernetes/minikube env 共享本地不安全的 Docker 注册表并允许 kube 节点(以及 minikube)到达 Internet 非常有用:

  1. 禁用防火墙,以使 DNS 解析工作内 Docker 容器(需要重新启动) : < br > systemctl disable firewalld < br > < br > 否则在 minikube 启动时会出现以下提示: < br > VM 可能无法解析外部 DNS 记录
    VM 无法访问 k8s.gcr.io,您可能需要配置一个代理或 set —— image-itory。我在这上面浪费了好几天。
  2. 检索创建和使用的网络接口的 IP 通过 docker,在我的情况下,我有 docker0接口名与 IP 172.17.0.1。本地不安全的注册表将在这个 IP 上暴露给 minikube。
  3. 将 Docker 配置为从不安全的注册表读/写,方法是添加 以下是 /etc/docker/daemon.json:
    {"insecure-registries" : ["172.17.0.1:5000"]}
  4. 重新启动 Docker: < br > 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 < br >
  7. 现在,当您为您的应用程序创建 loyment.yaml 描述符时,请输入正确的 图像路径,然后应用:
    kubectl create deployment mydemo --image=172.17.0.1:5000/myminikubedemo --dry-run=client -o=yaml > deployment.yaml < br > kubectl apply -f deployment.yaml

在我的示例中,即使映像存储在本地并且 imagePullPolicy被设置为 NeverMinikube VM 也不能提取映像。

我的解决方案是创建一个本地 Docker 存储库,并将这些映像推送到该存储库。然后,按如下方式指定图像: localhost:5000/image/name。来源: https://minikube.sigs.k8s.io/docs/handbook/registry/#docker-on-macos