图解kubernetes容器探活机制核心实现

在k8s中通过kubelet拉起一个容器之后,用户可以指定探活的方式用于实现容器的健康性检查,目前支持TCP、Http和命令三种方式,今天介绍其整个探活模块的实现, 了解其周期性探测、计数器、延迟等设计的具体实现

1. 探活的整体设计

1.1 线程模型

探活的线程模型设计相对简单一些,其通过worker来进行底层探活任务的执行,并通过Manager来负责worker的管理, 同时缓存探活的结果

1.2 周期性探活

根据每个探活任务的周期,来生成定时器,则只需要监听定时器事件即可

1.3 探活机制的实现

探活机制的实现除了命令Http和Tcp都相对简单,Tcp只需要直接通过net.DialTimeout链接即可,而Http则是通过构建一个http.Transport构造Http请求执行Do操作即可

相对复杂的则是exec, 其首先要根据当前container的环境变量生成command,然后通过容器、命令、超时时间等构建一个Command最后才是调用runtimeService调用csi执行命令 

2.探活接口实现

2.1 核心成员结构

type prober struct {
	exec execprobe.Prober
    // 我们可以看到针对readiness/liveness会分别启动一个http Transport来进行链接
	readinessHTTP httpprobe.Prober
	livenessHTTP  httpprobe.Prober
	startupHTTP   httpprobe.Prober
	tcp           tcpprobe.Prober
	runner        kubecontainer.ContainerCommandRunner

    // refManager主要是用于获取成员的引用对象
	refManager *kubecontainer.RefManager
    // recorder会负责探测结果事件的构建,并最终传递回 apiserver
	recorder   record.EventRecorder
}

2.2 探活主流程

探活的主流程主要是位于prober的probe方法中,其核心流程分为三段

2.2.1 获取探活的目标配置

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.ReadinessProbe
	case liveness:
		probeSpec = container.LivenessProbe
	case startup:
		probeSpec = container.StartupProbe
	default:
		return results.Failure, fmt.Errorf("unknown probe type: %q", probeType)
	}

2.2.2 执行探活记录错误信息

如果返回的错误,或者不是成功或者警告的状态,则会获取对应的引用对象,然后通过 recorder进行事件的构造,发送结果返回apiserver

// 执行探活流程	
result, output, err := pb.runProbeWithRetries(probeType, probeSpec, pod, status, container, containerID, maxProbeRetries)
	
	if err != nil || (result != probe.Success && result != probe.Warning) {
		// // 如果返回的错误,或者不是成功或者警告的状态
        // 则会获取对应的引用对象&
  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes是一个用于容器编排和管理的开源平台。它可以帮助您在分布式系统中自动化部署、扩展和管理容器化的应用程序。 以下是一个简单的Kubernetes架构图解: ``` +---------------------------------------+ | | | Master节点 | | | +---------------------------------------+ | | | | +---------------------------------------+ | | | Node节点(工作节点) | | | +---------------------------------------+ | | | | +---------------------------------------+ | | | Pod(容器组) | | | +---------------------------------------+ | | | | +---------------------------------------+ | | | 容器(Docker等) | | | +---------------------------------------+ ``` 在这个架构中,Kubernetes集群由一个Master节点和多个Node节点组成。Master节点负责整个集群的管理和控制,而Node节点是实际运行应用程序容器的工作节点。 每个Node节点上可以运行多个Pod(容器组),而每个Pod可以包含一个或多个容器。这些容器可以是使用Docker等容器技术创建的。 Kubernetes通过Master节点上的控制平面组件来管理整个集群。这些组件包括: - API Server:提供集群的API接口,用于与集群进行交互; - Scheduler:负责将Pod调度到合适的Node节点上运行; - Controller Manager:负责监控和管理集群中的各种资源和控制器; - etcd:分布式键值存储,用于保存集群的状态信息。 Node节点上的工作平面组件包括: - Kubelet:负责与Master节点通信,并在Node节点上运行和管理Pod; - Container Runtime:负责管理容器的生命周期,例如Docker。 这个架构图简单地展示了Kubernetes的基本组件和层级关系,帮助您理解Kubernetes的工作原理和部署架构。请注意,实际的Kubernetes集群可能更加复杂,具体的配置和组件数量可能会有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值