pod 的完整生命周期
pod 生命周期管理 Pod phase
Pod 状态详解
k8s Pod状态详解
在 Kubernetes 中,Pod 是最小的可部署的计算单元,它是一组容器的集合,共享同一个网络命名空间、存储卷等资源。
Kubernetes 中的 Pod 有以下几种状态:
- Pending(挂起):Pod 已经被 Kubernetes API 接受,但它的容器镜像还没有被拉取,或者 Pod 所需的节点资源(CPU、内存等)还没有满足。在这个状态中,Pod 是不可调度的。
- Running(运行):Pod 已经调度到了节点上并且所有容器都已经创建,至少有一个容器仍在运行中或者在启动过程中。
- Succeeded(成功):Pod 中的所有容器都已经正常终止,并且不会再重启。
- Failed(失败):Pod 中至少有一个容器已经以非零状态退出。
- Unknown(未知):无法获取 Pod 的状态。这种状态通常是由于与 Pod 相关的 API 调用失败或者 Pod 控制器处于错误状态导致的。
除了上述状态之外,Pod还有一些特殊的条件状态,它们记录了 Pod 的一些细节信息,例如 Pod 是否处于调度中、容器镜像是否拉取成功等。这些状态和条件状态可以通过 kubectl describe pod 命令获取,这些条件状态:
- PodScheduled:表示 Pod 是否已经被调度到了节点上。
- ContainersReady:表示 Pod 中的所有容器是否已经准备就绪。
- Initialized:表示 Pod 中的所有容器是否已经初始化。
- Ready:表示 Pod 是否已经准备就绪,即所有容器都已经启动并且可以接收流量。
- CrashLoopBackOff: 容器退出,kubelet正在将它重启
- InvalidImageName: 无法解析镜像名称
- ImageInspectError: 无法校验镜像
- ErrImageNeverPull: 策略禁止拉取镜像
- ImagePullBackOff: 正在重试拉取
- RegistryUnavailable: 连接不到镜像中心
- ErrImagePull:通用的拉取镜像出错
- CreateContainerConfigError: 不能创建kubelet使用的容器配置
- CreateContainerError: 创建容器失败
- m.internalLifecycle.PreStartContainer 执行hook报错
- RunContainerError: 启动容器失败
- PostStartHookError: 执行hook报错
- ContainersNotInitialized: 容器没有初始化完毕
- ContainersNotReady: 容器没有准备完毕
- ContainerCreating:容器创建中
- PodInitializing:pod 初始化中
- DockerDaemonNotReady:docker还没有完全启动
- NetworkPluginNotReady: 网络插件还没有完全启动
- Evicte: pod被驱赶
如何确保Pod的高可用
合理设置Qos
Pod 的QoS分类
[Qos & Quota] Guaranteed, Burstable and BestEffort
当reousrces 的limits 和requests 设置的不一致时, 在资源紧张的时候可能会造成资源抢占
当计算节点检测到内存压力时,Kubernetes 会按照 BestEffort -> Burstable -> Guarantted 的顺序一次驱逐Pod
获取pod qosClass
1 | kubectl get pod test-vfgg6 -oyaml | grep qosClass |
质量保证-通过Qos
延长Pod 的Toleration
健康探针
探针属性
ReadinessGates
通过外部控制器控制让Pod容器进入ready状态
Post-start & Pre-Stop Hook
terminationGracePeriodSeconds: 是 Pre-Stop 执行多久后 发送 kill -SIGKILL 信号
Termination Pod 的经验
数据的保存方式
高可用部署
更新策略
- maxSurge: 滚动更新新版本的时候, 每次新起多少个Pod
- maxUnabaliable: 多少个Pod失败会终止滚动升级
微服务架构下的高可用
集中式负载均衡 服务发现
进程内LB服务发现
独立进程服务发现
DNS负载均衡
负载均衡相关技术
网络地址转换(NAT)
NAT
新建TCP连接
链路层负载均衡
必须在同一个子网内