【问题标题】:Back-off restarting failed container with no information in events or logs后退重新启动失败的容器,事件或日志中没有信息
【发布时间】:2021-09-23 21:02:58
【问题描述】:

使用以下自定义:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    service: postfix
  name: postfix
spec:
  replicas: 1
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      service: postfix
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        service: postfix
    spec:
      containers:
      - name: postfix
        image: fk-postfix-placeholder
        command: ["postfix"]
        imagePullPolicy: Always
        env:
          - name: SMTP_DOMAIN
            valueFrom:
              secretKeyRef:
                name: my-environment-config
                key: SMTP_DOMAIN
          - name: SMTP_USER
            valueFrom:
              secretKeyRef:
                name: my-environment-config
                key: SMTP_USER
          - name: SMTP_PASSWORD
            valueFrom:
              secretKeyRef:
                name: my-environment-config
                key: SMTP_PASSWORD
        ports:
        - containerPort: 25
        resources:
          requests:
            cpu: 1m
            memory: 50Mi
        volumeMounts:
        - mountPath:  /var/lib/postfix
          name: my-storage
          subPath: postfix
        - mountPath: /dev/shm
          name: dshm

      restartPolicy: Always
      volumes:
      - name: my-storage
        persistentVolumeClaim:
          claimName: my-storage-claim-postfix
      - name: dshm
        emptyDir:
          medium: Memory

我的 pod 没有出现:

$k get pods

NAME                          READY   STATUS             RESTARTS   AGE
...
postfix-5555558c74-2kcv5      0/1     CrashLoopBackOff   16         18m
...

当我检查它时,我在事件中看到以下内容

$k describe pods/postfix-5555558c74-2kcv5
...
Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Normal   Scheduled  28m                   default-scheduler  Successfully assigned my-test/postfix-5555558c74-2kcv5 to gke-xxxxxxxxx-us-central1-default-pool-xxxxxx61-29fq
  Normal   Pulled     28m (x2 over 28m)     kubelet            Successfully pulled image "registry.gitlab.com/octomy/postfix:1.0.0-test-development"
  Normal   Pulling    27m (x3 over 28m)     kubelet            Pulling image "registry.gitlab.com/octomy/postfix:1.0.0-test-development"
  Normal   Created    27m (x3 over 28m)     kubelet            Created container postfix
  Normal   Started    27m (x3 over 28m)     kubelet            Started container postfix
  Warning  BackOff    3m8s (x125 over 28m)  kubelet            Back-off restarting failed container

但是当我试图弄清楚日志中发生了什么时,我看到的是:

$k logs pods/postfix-5555558c74-2kcv5

是的,从字面上看,日志的内容没有任何内容。当我使用 docker-compose 在本地容器中运行它时,日志充满了输出。

所以我想知道,我调试这个的下一步应该是什么?

【问题讨论】:

  • Sahadat Hossain 的解决方案对您有帮助吗?
  • 不,我找到了一种明显的解决方案。我会发布一个答案。

标签: kubernetes logging crash containers kustomize


【解决方案1】:

一旦你发现它,答案就很明显了。重要的部分是; 当一个正常的 log-happy 容器退出时没有一行日志输出是什么意思?

答案是,当一个聊天容器不输出任何日志时,容器根本不会启动。这可能有很多原因,但就我而言,原因是我指定了一个自定义 command,如下所示:

command: ["postfix"]

容器内没有名为“postfix”的可执行文件,因此容器只是以退出代码 1 静默终止。

我之所以设置command首先是我误解了Docker和Kubernetes之间的命名差异;

Docker 中,endpoint 是要运行的可执行文件,command 是您传递给它的任何参数。两者都可以在图像本身内指定,并且都可以在运行时被覆盖(例如在命令行或docker-compose.yaml)。

Kubernetes 中,command 是要运行的可执行文件,args 是您传递给它的参数。

我想覆盖在 Docer 容器中指定的命令,所以我天真地将command: ["postfix"] 放入我的 kubernetes yaml 中,但当然在 kubernetes 中这将覆盖可执行文件而不是参数。解决方法是改用args: ["postfix"]

恕我直言,我认为这是 Kubernetes 工具可能改进的一个领域。在事件日志中或附加到空日志输出中至少应该有某种警告“指定的命令似乎不存在于容器中”。

【讨论】:

    猜你喜欢
    • 2019-10-30
    • 2020-05-21
    • 2022-01-15
    • 2021-01-13
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2023-02-09
    相关资源
    最近更新 更多