【问题标题】:Why Kubernetes Pod gets into Terminated state giving Completed reason and exit code 0?为什么 Kubernetes Pod 进入 Terminated 状态并给出 Completed 原因和退出代码 0?
【发布时间】:2017-08-20 01:41:51
【问题描述】:

我很难在 Kubernetes 文档中找到任何答案。场景如下:

  • 基于 AWS 的 Kubernetes 版本 1.4
  • 8 个运行 NodeJS API (Express) 的 pod,部署为 Kubernetes 部署
  • 其中一个 pod 在深夜无故重启(没有流量、没有 CPU 峰值、没有内存压力、没有警报...)。因此,重新启动的次数会增加。
  • 日志未显示任何异常(运行 kubectl -p 以查看以前的日志,其中没有任何错误)
  • 资源消耗正常,看不到任何关于 Kubernetes 将 pod 重新调度到另一个节点或类似的事件
  • 描述 pod 会返回 TERMINATED 状态,返回 COMPLETED 原因和退出代码 0。我没有来自 kubectl 的确切输出,因为此 pod 已被多次替换。

pod 是 NodeJS 服务器实例,它们无法完成,它们总是在运行等待请求。

这会是 Kubernetes 内部对 pod 的重新排列吗?有什么方法可以知道什么时候发生这种情况?不应该是某处的事件说明它发生的原因吗?

更新

这只是发生在我们的 prod 环境中。描述有问题的 pod 的结果是:

api: Container ID: docker://7a117ed92fe36a3d2f904a882eb72c79d7ce66efa1162774ab9f0bcd39558f31 Image: 1.0.5-RC1 Image ID: docker://sha256:XXXX Ports: 9080/TCP, 9443/TCP State: Running Started: Mon, 27 Mar 2017 12:30:05 +0100 Last State: Terminated Reason: Completed Exit Code: 0 Started: Fri, 24 Mar 2017 13:32:14 +0000 Finished: Mon, 27 Mar 2017 12:29:58 +0100 Ready: True Restart Count: 1

更新 2

这里是使用的deployment.yaml 文件:

apiVersion: "extensions/v1beta1"
kind: "Deployment"
metadata:
  namespace: "${ENV}"
  name: "${APP}${CANARY}"
  labels:
    component: "${APP}${CANARY}"
spec:
  replicas: ${PODS}
  minReadySeconds: 30
  revisionHistoryLimit: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  template:
    metadata:
      labels:
        component: "${APP}${CANARY}"
    spec:
      serviceAccount: "${APP}"

${IMAGE_PULL_SECRETS}

      containers:
      - name: "${APP}${CANARY}"
        securityContext:
          capabilities:
            add:
              - IPC_LOCK
        image: "134078050561.dkr.ecr.eu-west-1.amazonaws.com/${APP}:${TAG}"
        env:
        - name: "KUBERNETES_CA_CERTIFICATE_FILE"
          value: "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
        - name: "NAMESPACE"
          valueFrom:
            fieldRef:
              fieldPath: "metadata.namespace"
        - name: "ENV"
          value: "${ENV}"
        - name: "PORT"
          value: "${INTERNAL_PORT}"
        - name: "CACHE_POLICY"
          value: "all"
        - name: "SERVICE_ORIGIN"
          value: "${SERVICE_ORIGIN}"
        - name: "DEBUG"
          value: "http,controllers:recommend"
        - name: "APPDYNAMICS"
          value: "true"
        - name: "VERSION"
          value: "${TAG}"
        ports:
        - name: "http"
          containerPort: ${HTTP_INTERNAL_PORT}
          protocol: "TCP"
        - name: "https"
          containerPort: ${HTTPS_INTERNAL_PORT}
          protocol: "TCP"

上述部署清单中引用的镜像的 Dockerfile:

FROM ubuntu:14.04
ENV NVM_VERSION v0.31.1
ENV NODE_VERSION v6.2.0
ENV NVM_DIR /home/app/nvm
ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/v$NODE_VERSION/bin:$PATH
ENV APP_HOME /home/app

RUN useradd -c "App User" -d $APP_HOME -m app
RUN apt-get update; apt-get install -y curl
USER app

# Install nvm with node and npm
RUN touch $HOME/.bashrc; curl https://raw.githubusercontent.com/creationix/nvm/${NVM_VERSION}/install.sh | bash \
    && /bin/bash -c 'source $NVM_DIR/nvm.sh; nvm install $NODE_VERSION'

ENV NODE_PATH $NVM_DIR/versions/node/$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/versions/node/$NODE_VERSION/bin:$PATH

# Create app directory
WORKDIR /home/app
COPY . /home/app

# Install app dependencies
RUN npm install

EXPOSE 9080 9443
CMD [ "npm", "start" ]

npm start 是常规 node app.js 命令的别名,该命令在端口 9080 上启动 NodeJS 服务器。

【问题讨论】:

  • 请发布您的部署或 rc yaml 文件。另外,请查看此故障排除指南:kubernetes.io/docs/tasks/debug-application-cluster/…
  • 已发布。此时我们无法修改正在运行的 pod 以打印终止消息,但在未来的部署中肯定会这样做。
  • 我没有看到发布的 cmd,你的入口点/命令是什么?
  • 对不起@jaxxstorm,我没有意识到部署清单不包含实际的Dockerfile,它只是引用要使用的图像。我刚刚发布了 Dockerfile。谢谢。
  • @DavidFernandez 我知道这是很久以前的事了,但你找到解决方案了吗?

标签: kubernetes kubernetes-health-check


【解决方案1】:

检查您运行的 docker 版本,以及在此期间是否重新启动了 docker 守护进程。

如果重新启动 docker 守护程序,所有容器都将终止(除非您使用 1.12 中新的“实时恢复”功能)。在 一些 docker 版本中,docker 可能会错误地为在这种情况下终止的所有容器报告“退出代码 0”。有关详细信息,请参阅https://github.com/docker/docker/issues/31262

【讨论】:

    【解决方案2】:

    如果这仍然相关,我们只是在集群中遇到了类似的问题。

    我们通过检查 docker 本身的日志设法找到了更多信息。 ssh 到您的 k8s 节点并运行以下命令:

    sudo journalctl -fu docker.service

    【讨论】:

      猜你喜欢
      • 2019-01-11
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 2020-04-30
      • 2011-01-11
      • 1970-01-01
      • 2022-12-29
      • 2020-11-17
      相关资源
      最近更新 更多