Docker for Mac - Kubernetes - 参考本地镜像

Docker for Mac - Kubernetes - reference local image

我在 Kubernetes 支持下使用 Docker for Mac,我正在努力创建引用本地构建映像的 Kubernetes 部署。

docker images 的输出:

REPOSITORY  TAG     IMAGE 
test        latest  2c3bdb36a5ed

我的 deployment.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 pods 被创建但是:

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

kubectl describe 其中之一 pods 给出:

  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 一起工作?

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

除了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日。

仅此而已。您的版本可用,并且命名对您和 此图片的更多用户。

通过将 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