永久调试处于完成状态的kubernetes Pod,但尚未准备好

时间:2019-12-06 14:22:41

标签: kubernetes azure-aks

如果我试图在永远保持“已完成”状态但从未处于就绪状态“ Ready 0/1”的k8s集群上运行Pod,会有任何理由吗? dns,kube-proxy pods等成功调度到分配给k8s集群的节点池中的每个节点下...所有工作节点似乎都处于健康状态

3 个答案:

答案 0 :(得分:2)

这听起来好像pod生命周期已经结束,并且大多数原因可能是因为您的pod已经完成了它打算完成的任务。

类似下一个示例的操作不会执行任何操作,它将成功创建然后启动,将拉出图像,然后将其标记为完成。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: test-pod
    image: busybox
    resources:

这是它的外观:

NAMESPACE     NAME                                                             READY   STATUS      RESTARTS   AGE
default       my-pod                                                       0/1     Completed   1          3s
default       testapp-1                                                        0/1     Pending     0          92m
default       web-0                                                            1/1     Running     0          3h2m
kube-system   event-exporter-v0.2.5-7df89f4b8f-mc7kt                           2/2     Running     0          7d19h
kube-system   fluentd-gcp-scaler-54ccb89d5-9pp8z                               1/1     Running     0          7d19h
kube-system   fluentd-gcp-v3.1.1-gdr9l                                         2/2     Running     0          123m
kube-system   fluentd-gcp-v3.1.1-pt8zp                                         2/2     Running     0          3h2m
kube-system   fluentd-gcp-v3.1.1-xwhkn                                         2/2     Running     5          172m
kube-system   fluentd-gcp-v3.1.1-zh29w                                         2/2     Running     0          7d19h

对于这种情况,我建议您检查yaml,检查您正在运行哪种pod?这是什么意思?

即使出于测试目的,您也可以添加命令参数以使其运行。

command: ["/bin/sh","-c"]
args: ["command one; command two && command three"]

类似:

args: ["-c", "while true; do echo hello; sleep 10;done"]

添加了命令的yaml看起来像这样:

 apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: test-pod
    image: busybox
    resources:
    command: ["/bin/sh","-c"]
    args: ["-c", "while true; do echo hello; sleep 10;done"]

这是它的外观:

NAMESPACE     NAME                                                             READY   STATUS    RESTARTS   AGE
default       my-pod                                                       1/1     Running   0          8m56s
default       testapp-1                                                        0/1     Pending   0          90m
default       web-0                                                            1/1     Running   0          3h
kube-system   event-exporter-v0.2.5-7df89f4b8f-mc7kt                           2/2     Running   0          7d19h
kube-system   fluentd-gcp-scaler-54ccb89d5-9pp8z                               1/1     Running   0          7d19h
kube-system   fluentd-gcp-v3.1.1-gdr9l                                         2/2     Running   0          122m

kubectl describe pod $POD_NAME将有助于进一步分析。

答案 1 :(得分:1)

此问题与k8s群集或设置无关。它主要与您的Dockerfile有关。

要使Pod处于运行状态,您需要将容器作为可执行文件,因为通常使用Entrypoint来指定指令可以解决您面临的问题。

解决此问题或调试此特定问题的更好方法是,在将本地docker容器部署到k8s集群之前,先在本地计算机上运行相应的docker容器。

答案 2 :(得分:1)

消息Completed很可能暗示着k8启动了您的容器,然后容器又退出了。 在Dockerfile中,ENTRYPOINT用pid 1定义了Docker容器应持有的进程,否则它将终止,因此无论pod试图做什么,您都需要检查ENTRYPOINT命令是否在循环,并不会死。

要注意的是,一旦Kubernetes终止,Kubernetes将尝试重新启动Pod,但几次尝试后Pod的状态可能会变成CrashLoopBackOff,并且您会看到类似于Back-off restarting failed container的消息。