使用kubernetes go-client(k8s.io/client-go/kubernetes
),我知道如何获得pod.Status
,并且发现pod.Status.Phase
有用(docs)。例如,我可以使用以下命令输出所有Pod的Pod Status Phase:
...
api := clientset.CoreV1()
pods, err := api.Pods("").List(metav1.ListOptions{})
for i, pod := range pods.Items {
podstatusPhase := string(pod.Status.Phase)
podCreationTime := pod.GetCreationTimestamp()
age := time.Since(podCreationTime.Time).Round(time.Second)
podInfo := fmt.Sprintf("[%d] Pod: %s, Phase: %s , Created: %s, Age: %s", i, pod.GetName(), podstatusPhase, podCreationTime, age.String())
fmt.Println(podInfo)
}
但是,phase
有点简化,因为它只显示5个值(Pending
,Running
,Succeeded
,Failed
,{{ 1}})。我希望获得Unknown
在状态列中提供的相同信息,例如:
kubectl get pods
我特别对$ kubectl get pods
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
moby-dick-cron-scheduler-1564578660-bg4sb 0/2 ContainerCreating 0 178m <none> ip-10-30-13-151.ec2.internal <none> <none>
notifications-missed-calls-1564564740-js762 0/2 Init:0/1 0 6h49m <none> ip-10-30-13-6.ec2.internal <none> <none>
antivirus-scanner-cron-1564576740-sd6hh 0/2 Completed 0 3h30m 10.30.13.169 ip-10-30-13-151.ec2.internal <none> <none>
和Init:0/1
状态感兴趣。使用PodInitializing
时,处于这些状态的Pod仅显示为“待处理”。
pod.Status.Phase
表示该Pod拥有1个Init容器,而0个容器已成功完成。 init containers在启动应用容器之前运行。Init:0/1
表示Pod已完成执行初始化容器。是否可以使用PodInitializing
获得诸如Init:0/1
之类的状态?还是没有捷径,我需要像kubectl一样重新计算?我猜它使用Pod Status Conditions和container statuses来构建信息。如果需要重新计算,也许可以使用the kubectl sourcecode?有人知道我在哪里可以找到相关的位吗? (我的golang经验非常有限)
答案 0 :(得分:4)
简短的答案通常是您不必在客户端上计算“状态”,因为它是在服务器级别计算的。
说明:
您尝试使用kubectl get pods
打印的标准方式,在Kubernetes代码库中称为Human Readable。此方法使用ServerPrint,默认为Kubernetes TablePrinter。 TablePrinter type is defined here。
如您所见,TablePrinter的PrintObj
函数被委派here,但是该委派来自配置HumanPrintFlags并保存原始的printer。
此外,您在humanreadable_glags.go中看到它包括k8s.io/kubernetes/pkg/printers
,并且看到它实例化了k8s.io/kubernetes/pkg/printers
中定义的printers.NewTablePrinter。
要调用的实际打印函数是此PrintObj,您可以看到它处理3种情况,因为在某些情况下服务器返回一个表,而在某些情况下则不返回(看起来像<1.16种情况)。
您还可以看到,在上述情况下,https://github.com/kubernetes/kubernetes/tree/master/pkg/printers/internalversion中的代码均未使用,因此calculation发生在kube-apiserver端后面。
请记住,这是人类可读的打印机,此处定义了其他类型的打印机(取决于选项):https://github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/cli-runtime/pkg/printers
答案 1 :(得分:1)
我认为您需要重新计算。参见this