And*_*son 15 kubernetes kubernetes-pod kubernetes-cronjob kubernetes-jobs
我有一个 k8s cronjob,它由一个 init 容器和一个 pod 容器组成。如果 init 容器失败,主容器中的 Pod 永远不会启动,并无限期地停留在“PodInitializing”中。
如果 init 容器失败,我的目的是让作业失败。
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: job-name
namespace: default
labels:
run: job-name
spec:
schedule: "15 23 * * *"
startingDeadlineSeconds: 60
concurrencyPolicy: "Forbid"
successfulJobsHistoryLimit: 30
failedJobsHistoryLimit: 10
jobTemplate:
spec:
# only try twice
backoffLimit: 2
activeDeadlineSeconds: 60
template:
spec:
initContainers:
- name: init-name
image: init-image:1.0
restartPolicy: Never
containers:
- name: some-name
image: someimage:1.0
restartPolicy: Never
Run Code Online (Sandbox Code Playgroud)
pod 上的 kubectl 卡住会导致:
Name: job-name-1542237120-rgvzl
Namespace: default
Priority: 0
PriorityClassName: <none>
Node: my-node-98afffbf-0psc/10.0.0.0
Start Time: Wed, 14 Nov 2018 23:12:16 +0000
Labels: controller-uid=ID
job-name=job-name-1542237120
Annotations: kubernetes.io/limit-ranger:
LimitRanger plugin set: cpu request for container elasticsearch-metrics; cpu request for init container elasticsearch-repo-setup; cpu requ...
Status: Failed
IP: 10.0.0.0
Controlled By: Job/job-1542237120
Init Containers:
init-container-name:
Container ID: docker://ID
Image: init-image:1.0
Image ID: init-imageID
Port: <none>
Host Port: <none>
State: Terminated
Reason: Error
Exit Code: 1
Started: Wed, 14 Nov 2018 23:12:21 +0000
Finished: Wed, 14 Nov 2018 23:12:32 +0000
Ready: False
Restart Count: 0
Requests:
cpu: 100m
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-wwl5n (ro)
Containers:
some-name:
Container ID:
Image: someimage:1.0
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: PodInitializing
Ready: False
Restart Count: 0
Requests:
cpu: 100m
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-wwl5n (ro)
Conditions:
Type Status
Initialized False
Ready False
ContainersReady False
PodScheduled True
Run Code Online (Sandbox Code Playgroud)
Ton*_*oni 35
由于多种原因,Pod 可能会陷入 Init 状态。
\nPodInitializing 或 Init Status 意味着 Pod 包含尚未最终确定的Init 容器(Init 容器:在 Pod 中的应用程序容器之前运行的专用容器,init 容器可以包含实用程序或设置脚本)。如果 pod 状态为 \xc2\xb4Init:0/1\xc2\xb4 则表示有一个 init 容器尚未最终确定;init:N/M
表示Pod有M个Init容器,目前N个已经完成。
对于这些情况,最好是收集信息,因为每个 PodInitializing 问题的根本原因可能不同。
\nkubectl describe pods pod-XXX
通过这个命令你可以获得pod的很多信息,你也可以检查是否有任何有意义的事件。保存初始化容器名称
kubectl logs pod-XXX
此命令打印 Pod 中容器或指定资源的日志。
kubectl logs pod-XXX -c init-container-xxx
这是最准确的,因为可以打印初始化容器的日志。您可以获取描述 pod 的 init 容器名称,以便将“init-container-XXX”替换为“copy-default-config”,如下所示:
的输出kubectl logs pod-XXX -c init-container-xxx
可以抛出有意义的问题信息,参考:
在上图中我们可以看到根本原因是init容器无法从jenkins下载插件(超时),现在我们可以检查连接配置,代理,dns;或者只修改 yaml 以部署不带插件的容器。
\n额外的:
\nkubectl describe node node-XXX
描述 pod 将为您提供其节点的名称,您也可以使用此命令检查该名称。
kubectl get events
列出集群事件。
journalctl -xeu kubelet | tail -n 10
kubelet 登录 systemd(journalctl -xeu docker | tail -n 1
对于 docker)。
解决方案
\n一旦找到根本原因,解决方案就取决于所收集的信息。
\n当您找到深入了解根本原因的日志时,您可以调查该特定的根本原因。
\n一些例子:
\n1 > 删除 init 容器时会发生这种情况,可以通过删除 pod 来修复它,以便重新创建它或重新部署它。1.1中的情况相同。
\n2 > 如果您发现“错误地址\'kube-dns.kube-system\'”PVC可能无法正确回收,请运行2/opt/kubernetes/bin/kube-restart.sh
中提供的解决方案。
3 > 那里没有找到sh文件,解决办法是修改yaml文件或者如果不需要的话删除容器。
\n4 > 发现FailedSync,在节点上重启docker解决。
\n一般来说,您可以修改 yaml,例如避免使用过时的 URL、尝试重新创建受影响的资源,或者只是从部署中删除导致问题的 init 容器。然而,具体的解决方案将取决于具体的根本原因。
\najt*_*rds 21
为了尝试解决这个问题,我将运行以下命令:
kubectl get pods
- 如果需要,添加命名空间参数。
然后复制 pod 名称并运行:
kubectl describe pod {POD_NAME}
这应该会为您提供一些有关为什么它停留在初始化状态的信息。
我认为您可能会错过这是初始化容器的预期行为。规则是,在 initContainers 失败的情况下,如果 restartPolicy 设置为 Never,则 Pod 将不会重新启动,否则 Kubernetes 将继续重新启动它,直到成功为止。
还:
如果 init 容器失败,主容器中的 Pod 永远不会启动,并无限期地停留在“PodInitializing”状态。
根据文档:
在所有 Init 容器都成功之前,Pod 无法就绪。Init Container 上的端口不会聚合在服务下。正在初始化的 Pod 处于 Pending 状态,但应将条件 Initializing 设置为 true。
*我可以看到你试图改变这种行为,但我不确定你是否可以用 CronJob 做到这一点,我看到了乔布斯的例子。但我只是在理论上,如果这篇文章不能帮助您解决问题,我可以尝试在实验室环境中重新创建它。
归档时间: |
|
查看次数: |
33599 次 |
最近记录: |