首页 > 解决方案 > 后退重新启动失败的容器,事件或日志中没有信息

问题描述

使用以下自定义:

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 在本地容器中运行它时,日志充满了输出。

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

标签: kubernetesloggingcrashcontainerskustomize

解决方案


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

答案是,当一个健谈的容器不输出任何日志时,容器根本就没有启动。这可能有很多原因,但在我的情况下,原因是我指定了command这样的自定义:

command: ["postfix"]

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

我之所以设置 acommand是因为我误解了 Docker 和 Kubernetes 之间的命名差异;

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

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

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

<咆哮>

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

</rant>


推荐阅读