我使用Kubernetes API C#库尝试了ListPodForAllNamespaces((。使用Status.Phase属性获取pod的当前状态。当我尝试kubectl comman获取pod状态时,它显示为crashloop和error状态。
kubectl get pods -n api
NAME READY STATUS RESTARTS AGE
test-web-api-78777-2zlwl 1/1 Running 0 9m8s
jobapp1-878787-knt46 0/1 CrashLoopBackOff 5 4m53s
jobapp2-878787-knt46 0/1 Error 5 4m53s
但如果pod状态为错误状态,则Kubernetes api显示为正在运行。下面是我的代码
var config = KubernetesClientConfiguration.InClusterConfig();//for local testing BuildDefaultConfig && for cluster testing InClusterConfig
var client = new Kubernetes(config);
var namespaces = client.ListPodForAllNamespaces();
foreach (var ns in namespaces.Items){
Console.WriteLine(ns.Metadata.Name +" status - "+ns.Status.Phase);
}
输出是
test-web-api-78777-2zlwl状态-运行
jobapp1-878787-knt46状态-运行
jobapp2-878787-knt46状态-运行
您的kubectl
命令和C#
kubernetes api都不正确。
您可以看到最后两个pod重新启动了5次。在5次重启过程中,它们中的每一个都处于CCD_ 3状态一段时间。
当您运行C#
api时,所有的pod实际上都处于Running
阶段。
如果您在等待一段时间后运行C#
api,您会发现它们不在Running
阶段。
尝试
kubectl describe [-n namespace] pod [pod_id]
你可能会看到一些东西,告诉你为什么吊舱处于坠毁状态。。您还可以在谷歌云控制台中检查是否有任何报告。
如果在查询状态的时候,这个Main Status可能仍然显示正在运行,稍后它可能会变成其他东西,因此为了避免这个问题,我建议在C#中使用K8client中的pod对象(类型:V1PodList(的属性,如:
pod.Status.Conditions.Any(x=>x.Status== "False")
这将实际给出4个条件的状态,即Initialized ,Ready,ContainersReady & PodScheduled
。对于一个成功运行的pod,所有4个都将为true,否则至少有一个将为false。