kubernetes - 后退重新启动失败的容器,事件或日志中没有信息
问题描述
使用以下自定义:
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 在本地容器中运行它时,日志充满了输出。
所以我想知道,我调试这个的下一步应该是什么?
解决方案
一旦你发现它,答案是显而易见的。重要的部分是;当一个正常的 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>
推荐阅读
- facebook - Facebook 用户无法登录,出现错误“来自 facebook.com 的远程站点 5XX for USER_INFO”
- php - 如何在 Laravel 上传时返回随机 S3 文件名?
- python - 我的代码不会完全在我的字典中运行,我不知道为什么
- c++ - 问题4.9 Ctci的C++代码(破解编码inteview 6th edition)不起作用?
- c# - 是否可以在视图中显示视图的一部分?
- javascript - 如何在 layoutRedux 文件中通过 AsyncStorage 访问保存的 json 文件?
- angular - 使用 Angular 应用程序进行身份验证的 AWS 用户池
- gradle - 使用命令行在 gradle 中设置时区
- teraterm - 即使使用 flushrecv,Wait 和 waitln 也只能工作一次
- html - HTML 输入在开始输入时变大,因为高度设置为 100%