k8sailor - 17 Pod 的运行状态 阶段(phase)与状态(status) 探究
2023-02-18 16:39:37 时间
Pod 的生命周期 https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/
Pod 的 Status 不是 Phase。
Pod 的 Status 需要根据 Pod 中的 ContainerStatuses
进行计算得到。
Phase
Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间,
其中 Running
阶段包含了很多行为, 如 1. 下载镜像,2. 启动并初始化,3. 对外提供服务, 而通常认为的 Pod 处于正常服务状态(1. 能接受请求或发送请求, 2. pod 不退出) 只能该阶段的一部分,算 3.对外提供服务。
虽然 kubectl
工具使用 kubectl get pod
可以查看到 Status
这个状态。
→ kgp
NAME READY STATUS RESTARTS AGE
my-nginx-6-5f55fd588f-pzn5m 1/1 Running 0 2d3h
new-nginx-04-5f94fffcdc-2gkbd 1/1 Running 0 44h
new-nginx-04-5f94fffcdc-wbnnw 1/1 Running 0 44h
new-nginx-05-799c589bdc-84tf2 1/2 CrashLoopBackOff 527 44h
new-nginx-03-69bd55dc6d-5c8d6 1/2 CrashLoopBackOff 472 40h
但 k8s api
中并没有直接给出 Pod 的实际状态, 虽然 Pod 的 Status 字段中有 Reason 和 Message 两个字段,但其内容一直为空,暂时没有发现有什么用处。
// k8s.io/api@v0.21.4/core/v1/types.go
type PodStatus struct {
// A human readable message indicating details about why the pod is in this condition.
// +optional
Message string `json:"message,omitempty" protobuf:"bytes,3,opt,name=message"`
// A brief CamelCase message indicating details about why the pod is in this state.
// e.g. 'Evicted'
// +optional
Reason string `json:"reason,omitempty" protobuf:"bytes,4,opt,name=reason"`
}
因此, 如果要实现类似 kubectl 展示 Pod Status 的情况, 就需要自己去 PodConditions
中去 获取所有 Container 状态 并分析、计算、返回。顺便提一句, 这里并不知道 kubectl 是怎么实现的, interface 太多,不知道怎么追踪。真失败 T.T 。
根据 Container 状态获取 Pod 状态
// extractPod 转换成业务本身的 Pod
func extractPod(item corev1.Pod) *Pod {
reason := ""
message := ""
// 计算 Pod 在 Phase Running 时候的真实 Status
for _, status := range item.Status.ContainerStatuses {
if !status.Ready && status.State.Waiting != nil {
reason = status.State.Waiting.Reason
message = status.State.Waiting.Message
break
}
}
return &Pod{
Name: item.Name,
Namespace: item.Namespace,
Images: PodImages(item.Spec),
NodeName: item.Spec.NodeName,
NodeIp: item.Status.HostIP,
CreateTime: item.CreationTimestamp.Time,
PodIP: item.Status.PodIP,
Status: PodStatus{
Phase: item.Status.Phase,
Message: message,
Reason: reason,
},
Labels: item.Labels,
}
}
相关文章
- 详解JAVA线程问题诊断工具Thread Dump
- 还在手动发早安吗?教你用java实现每日给女友微信发送早安
- Java开发如何通过IoT边缘ModuleSDK进行进程应用的开发?
- 解读Java内存模型中Happens-Before的8个原则
- Java7提供的Fork/Join框架实现高并发程序,你会使用吗?
- Java开发如何通过IoT边缘ModuleSDK进行协议转换?
- 0停机迁移Nacos?Java字节码技术来帮忙
- 视频 | ZYNQ开发板深度评测:高性能FPGA和双核ARM的强强联合!
- I²C协议官方标准文档2021最新版本下载
- 国产FPGA开发板上手体验:不足百元,集成ARM硬核处理器!
- 业内首发!感芯MC3172硬实时RISC-V芯片,还用啥RTOS!
- 从汇率转换通用解决方案到可复用设计思想
- 顶流选手专访 - 最具推广价值作品 - 背后故事
- 顶流选手专访 - 最佳展现创意作品 - 背后故事
- 【精华】顶流选手专访-最佳可视化展现作品(冠军)
- 冠军作品背后的故事会是什么呢
- IBM 人力资源综合分析案例
- 世界五百强财务高管数字化战群雄经典案例
- ZebraBI 6.0 发布,更高更快更强大
- DAX 引擎之父揭秘 DAX 引擎内部细节