【问题标题】:Kubernetes fails to deploy valid container imageKubernetes 无法部署有效的容器镜像
【发布时间】:2018-01-19 18:48:26
【问题描述】:

我有一个包含 NodeJS 应用程序的 docker 映像。 Dockerfile 是:

FROM node:8
WORKDIR /app
ADD . /app
RUN npm install
EXPOSE 80
ENTRYPOINT [ "/bin/sh", "./start.sh" ]

start.sh 脚本是:

#!/bin/bash
...
echo "Starting application"
npm start

我可以手动启动和测试映像:

$ gcloud docker -- run -it --rm my-container
...
Starting application
...
> node index.js
...

Kubernetes 部署使用相同的容器:

apiVersion: extensions/v1beta1
kind: Deployment
...
spec:
  ...
  template:
    ...
    spec:
      containers:
      - image: my-container
...

容器启动,start.sh 脚本正确执行,但它终止,容器进入CrashLoopBackOff 循环。

手动检查 pod 后:

kubectl exec -ti my-pod -- bash
I have no name!@my-pod:/app# cat /etc/passwd
... empty response

-> 不知何故,容器上似乎没有系统用户,这使得大多数命令(如npm)静默失败并终止容器

我也试过了,没有成功:

  • 删除 pod
  • 删除并重新创建部署
  • 使用node 用户运行node 映像-> unable to find user node: no matching entries in passwd file

最后一点:我实际上有很多部署(使用相同的模板,只是名称不同),使用几天前构建的映像运行良好使用相同的源代码

对于某些部署,它实际上是在手动删除 pod 并让 kubernetes 重新创建它之后工作的。

有什么想法吗?

2018 年 1 月 18 日编辑 我尝试使用与旧工作图像相同的源代码重建图像,但没有成功。我还尝试了一个更简单的 Dockerfile:

FROM node:8
USER node

但我仍然收到与似乎没有用户在场有关的错误:

Error response from daemon: {"message":"linux spec user: unable to find user node: no matching entries in passwd file"}

我已经检查了 docker-node 的家伙,图像最近没有改变。会不会和 Kubernetes 的变化有关?请记住,当我使用 docker 命令手动运行图像时,我的图像确实会运行

【问题讨论】:

  • 日志是怎么说的?
  • @DavidSteiman pod 日志显示 Starting application,但随着 pod 终止,接下来什么也没有发生。正如我所解释的,当直接查看容器时,我发现没有系统用户,因此像 npm startnode --version 这样的命令根本没有效果(甚至没有输出错误)。
  • 直接启动脚本怎么样,这里提到:kubernetes.io/docs/tutorials/stateless-application/…
  • 我需要在npm start 之前运行一些逻辑,所以我不能直接使用CMD 指令,如果这是你的建议
  • 为什么不在 npm 任务中实现该逻辑?

标签: node.js docker kubernetes


【解决方案1】:

我试图重现您的问题,但没有让它以同样的方式失败。我创建了一个dummy express app 并将其粘贴在与您上面的示例匹配的 github 上,然后将其调用到我拥有的本地 minikube 实例中。基本图像尺寸相当大,但它启动时很好。

我不得不为您的示例解释 npm start 中发生的事情,因为您没有指定,但您可以看到我的 package.json,根据描述,我怀疑这与您正在做的事情非常接近。

当我启动它时:

git clone https://github.com/heckj/dummyexpress
cd dummyexpress
kubectl apply -f deploy/

我马上就有了一个正在运行的实例:

NAME                            READY     STATUS    RESTARTS   AGE
dummynodeapp-7788b95497-tkw2s   1/1       Running   0          1d

日志显示了您所期望的内容:

**kubectl log dummynodeapp-7788b95497-tkw2s**
W0117 19:41:00.986498   20648 cmd.go:353] log is DEPRECATED and will be removed in a future version. Use logs instead.
Starting application

> blah@1.0.0 start /app
> node index.js

Example app listening on port 3000!

我的猜测是您的 npm start 执行过程中出现了问题,因此我建议您调整部署的这方面,看看您是否无法通过这种方式解决。

【讨论】:

  • 嗨@heckj,感谢您抽出宝贵时间。查看我编辑的问题,没有脚本我仍然有问题,而且它似乎与我的应用程序源代码无关。
  • 我使用您的确切dummynodeapp.yaml 创建了一个部署,但我仍然得到CrashLoopBackOffStarting application 作为唯一的日志!
  • 挖掘您看到的特定错误,它与a closed moby bug - #22323 匹配,但显然将其映射到 docker 问题。基于此,我怀疑您的 kubernetes 集群中的 docker 上出现了严重问题。您已验证 docker 在本地运行,但您是否在集群中裸节点上的 docker 上尝试过相同的操作?
【解决方案2】:

正如@heckj 指出的那样,这是我的 kubernetes 集群上的 Docker 问题。我将集群从1.6.13-gke.1 更新为v1.7.12-gke.0,Pod 再次正常工作。我不确定使用的是什么 Docker 版本,因为 another kubernetes bug 阻止我看到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2016-12-29
    • 2020-03-20
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多