【问题标题】:Docker for Mac - Kubernetes - reference local imageDocker for Mac - Kubernetes - 参考本地镜像
【发布时间】:2018-11-17 06:16:13
【问题描述】:

我正在使用支持 Kubernetes 的 Mac 版 Docker,并且我正在努力创建一个引用本地构建的映像的 Kubernetes 部署。

docker images 的输出:

REPOSITORY  TAG     IMAGE 
test        latest  2c3bdb36a5ed

我的部署.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld-deployment
spec:
  selector:
    matchLabels:
      app: helloworld
  replicas: 1
  template:
    metadata:
      labels:
        app: helloworld
    spec:
      containers:
      - name: aaa
        image: test:latest
        ports:
        - containerPort: 8080

当我运行 kubectl apply -f deplyment.yaml 时创建了 pod,但是:

helloworld-deployment-764b8b85d8-2c4kl   0/1       ImagePullBackOff   0          
helloworld-deployment-764b8b85d8-rzq7l   0/1       ImagePullBackOff   0

kubectl describe 这些豆荚之一给出:

  Normal   Scheduled              20s               default-scheduler            Successfully assigned helloworld-deployment-79f66d97c6-7tj2x to docker-for-desktop
  Normal   SuccessfulMountVolume  19s               kubelet, docker-for-desktop  MountVolume.SetUp succeeded for volume "default-token-72f44"
  Normal   BackOff                16s               kubelet, docker-for-desktop  Back-off pulling image "test:latest"
  Warning  Failed                 16s               kubelet, docker-for-desktop  Error: ImagePullBackOff
  Normal   Pulling                4s (x2 over 19s)  kubelet, docker-for-desktop  pulling image "test:latest"
  Warning  Failed                 2s (x2 over 17s)  kubelet, docker-for-desktop  Failed to pull image "test:latest": rpc error: code = Unknown desc = Error response from daemon: pull access denied for test, repository does not exist or may require 'docker login'
  Warning  Failed                 2s (x2 over 17s)  kubelet, docker-for-desktop  Error: ErrImagePull

有趣的是,如果我尝试运行一些托管在 dockerhub 上的图像,那么一切都很好, 我也尝试过使用skaffold,它也很有魅力......

我看到一些关于 minikube 的类似问题,解决方案是使用 minikube docker 守护进程来构建镜像,以便可以从 Kubernetes 集群中引用它们。

我想避免设置本地存储库,那么如何使其与 Docker 的 Kubernetes 一起使用?

【问题讨论】:

  • 这可能会有所帮助:blog.hasura.io/…
  • @VishalBiyani thx 但我想避免设置 localhost:5000 存储库 - 它可以工作,但每次创建新版本的应用程序时我都需要推送它。 Skaffold 似乎找到了解决这个问题的办法……
  • 尝试使用图像的标记版本而不是最新版本。
  • @techtrainer 你似乎是对的。只要我给出一个有效的标记版本,一切都会正常。你知道这是为什么吗?我只是想将 Docker Edge Kubernetes 仅用于本地开发,并认为使用“最新”会是一个好主意..
  • 原因很简单,没人知道最新的。所以,docker 必须上网查看最新的值是多少。只要你标记它,它就可以看到标记版本的图像在本地存在并在线检查。

标签: kubernetes docker-for-mac


【解决方案1】:

通过将imagePullPolicy 设置为Never,我能够运行本地映像。

例如:

apiVersion: v1
kind: Pod
metadata:
  name: local-image-test
spec:
  containers:
  - name: local-image-container
    image: local-image:latest
    imagePullPolicy: Never

(此解决方案归功于https://github.com/kubernetes/kubernetes/issues/1293#issuecomment-357326426

【讨论】:

  • 不知道为什么“imagePullPolicy: Never”有效,但确实有效
  • B/C 在这里解释 kubernetes.io/docs/concepts/containers/images/#updating-images 使用“最新”标签将始终强制拉取,就像设置 imagePullPolicy:always 而默认值为 IfNotPresent。设置 imagePullPolicy:IfNotPresent 也应该可以。
  • 命令行等效项:kubectl run local-image-test --image=local-image --image-pull-policy=Never
【解决方案2】:

使用标记版本的映像而不是最新版本,因为如果您将 Docker 映像传送到生产环境,则应该忽略最新标记。不要使用它。不要被它诱惑。很容易看到它并认为您的部署脚本应该只是拉“最新”并且您的构建过程将确保它是有效的。

【讨论】:

  • 你是绝对正确的。我的想法是仅在 Docker Edge 上使用 Kubernetes 进行本地开发时使用“最新”标签。开发工作流程将是: 1. 修改应用程序代码。 2. 运行 docker build (以便始终使用最新的标签创建镜像) 3. 运行 kubectl apply -f deployment.yaml 。这样,每次我在我的应用程序中更改某事并且(更糟糕的是)在我的 deployment.yaml 中引用该“新标签”时,我都不需要新标签。这就是简化我的开发工作流程的全部想法
  • @user62058 如果这对您有用,请接受答案。
【解决方案3】:

除了techtrainer评论和回答, 我想提供一些例子来说明如何做到这一点。

一般规则。您必须使用图像的标签版本而不是latest。 使用 Docker 标签,您可以获得的越具体越好。获取具体以避免使用错误的图像。 如果您不希望您的同事或其他 Docker 用户下载图像并且不知道它们有多新,请考虑这一点。 详细说明以避免此类问题。

docker tag IMAGE ID image/TAG:version.d.m.y

为了更好地管理您的图像,您应该有一些巧妙的命名约定。 我更喜欢使用图像的阶段、版本和创建日期。例如:

docker tag 113a43faa138 ubuntu/prod:v1.8.6.2018

表示生产阶段,版本 1,创建于 2018 年 6 月 8 日。

仅此而已。您的版本可用,命名对您来说更容易理解,并且 此图片的更多用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2015-08-04
    • 2020-09-24
    • 1970-01-01
    • 2019-11-26
    • 2018-08-28
    • 2018-09-28
    • 2021-04-01
    相关资源
    最近更新 更多