在k8s中通过kubelet拉起一个容器之后,用户可以指定探活的方式用于实现容器的健康性检查,目前支持TCP、Http和命令三种方式,今天介绍其整个探活模块的实现, 了解其周期性探测、计数器、延迟等设计的具体实现
探活的线程模型设计相对简单一些,其通过worker来进行底层探活任务的执行,并通过Manager来负责worker的管理, 同时缓存探活的结果
根据每个探活任务的周期,来生成定时器,则只需要监听定时器事件即可
探活机制的实现除了命令Http和Tcp都相对简单,Tcp只需要直接通过net.DialTimeout链接即可,而Http则是通过构建一个http.Transport构造Http请求执行Do操作即可
相对复杂的则是exec, 其首先要根据当前container的环境变量生成command,然后通过容器、命令、超时时间等构建一个Command最后才是调用runtimeService调用csi执行命令
type prober struct {exec execprobe.Prober// 我们可以看到针对readiness/liveness会分别启动一个http Transport来进行链接readinessHTTP httpprobe.ProberlivenessHTTP httpprobe.ProberstartupHTTP httpprobe.Probertcp tcpprobe.Proberrunner kubecontainer.ContainerCommandRunner// refManager主要是用于获取成员的引用对象refManager *kubecontainer.RefManager// recorder会负责探测结果事件的构建,并最终传递回 apiserverrecorder record.EventRecorder
}
探活的主流程主要是位于prober的probe方法中,其核心流程分为三段
func (pb *prober) probe(probeType probeType, pod *v1.Pod, status v1.PodStatus, container v1.Container, containerID kubecontainer.ContainerID) (results.Result, error) {
var probeSpec *v1.Probe
// 根据探活的类型来获取对应位置的探活配置switch probeType {case readiness:probeSpec = container.ReadinessProbecase liveness:probeSpec = container.LivenessProbecase startup:probeSpec = container.StartupProbedefault:return results.Failure, fmt.Errorf("unknown probe type: %q", probeType)}
如果返回的错误,或者不是成功或者警告的状态,则会获取对应的引用对象,然后通过 recorder进行事件的构造,发送结果返回apiserver
// 执行探活流程
result, output, err := pb.runProbeWithRetries(probeType, probeSpec, pod, status, container, containerID, maxProbeRetries)if err !
本文发布于:2024-01-28 19:57:47,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064430709899.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |