我如何在 Kubernetes 中使用本地的 Docker 镜像?

12

我有一个基本的Dockerfile:

FROM nginx
RUN apt-get -y update && apt install -y curl

在我的Kubernetes集群的主节点上,我构建了该镜像:
docker build -t cnginx:v1 . 

docker images 命令可以显示已经成功生成的镜像:

REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
cgninx                                     v1                  d3b1b19d069e        39 minutes ago      141MB

我使用这个自定义镜像进行部署:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 
  template: 
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: cnginx
        image: cnginx:v1
        imagePullPolicy: Never
        ports:
        - containerPort: 80
      nodeSelector:
        nodetype: webserver

然而,找不到该图像:
NAME                                READY     STATUS              RESTARTS   AGE
nginx-deployment-7dd98bd746-lw6tp   0/1       ErrImageNeverPull   0          4s
nginx-deployment-7dd98bd746-szr9n   0/1       ErrImageNeverPull   0          4s

描述pod信息:

Events:
  Type     Reason                 Age              From                Message
  ----     ------                 ----             ----                -------
  Normal   Scheduled              1m               default-scheduler   Successfully assigned nginx-deployment-7dd98bd746-szr9n to kubenode2
  Normal   SuccessfulMountVolume  1m               kubelet, kubenode2  MountVolume.SetUp succeeded for volume "default-token-bpbpl"
  Warning  ErrImageNeverPull      9s (x9 over 1m)  kubelet, kubenode2  Container image "cnginx:v1" is not present with pull policy of Never
  Warning  Failed                 9s (x9 over 1m)  kubelet, kubenode2  Error: ErrImageNeverPull

我曾尝试使用默认的imagePullPolicy,以及一些其他的方法,比如给镜像打上最新标签...

那么,我该如何让Kubernetes使用本地生成的Docker镜像呢?


你是在一个节点上构建,然后尝试在另一个节点上运行吗?还是所有操作都在同一个节点上进行? - johnharris85
集群由三个节点组成,一个主节点和两个工作节点。我正在主节点上构建镜像。 - codependent
没错,就像被采纳的答案指出的那样,这就是问题:p 你在一个地方构建它,然后试图在另一个不存在它的地方运行它。 - johnharris85
1
是的,呵呵,我的错 :-) - codependent
1个回答

16

您的 PODs 安排在工作节点上。由于您将 imagePullPolicy 设置为 Never,因此需要使您的映像对两个节点都可用。换句话说,您需要像在主节点上一样在两个节点上构建它。

顺带一提,从长远来看,如果您设置了自定义的 Docker 注册表并将映像推送到其中,可能会更容易些。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接