kubelet工作原理

girl1314 girl1314     2022-11-30     747

关键词:

在调度这一步完成后,Kubernetes 就需要负责将这个调度成功的 Pod,在宿主机上创建出来,并把它所定义的各个容器启动起来。这些,都是 kubelet 这个核心组件的主要功能。

kubelet 本身,也是按照“控制器”模式来工作的。它实际的工作原理,可以用如下所示的一幅示意图来表示清楚。

技术图片

kubelet 的工作核心,就是一个控制循环,即:SyncLoop(图中的大圆圈)。而驱动这个控制循环运行的事件,包括四种:

1、Pod 更新事件;

2、Pod 生命周期变化;

3、kubelet 本身设置的执行周期;

4、定时的清理事件。

kubelet 启动的时候,要做的第一件事情,就是设置 Listers,也就是注册它所关心的各种事件的 Informer。这些 Informer,就是 SyncLoop 需要处理的数据的来源。

此外,kubelet 还负责维护着很多很多其他的子控制循环(也就是图中的小圆圈)。这些控制循环的名字,一般被称作某某 Manager,比如 Volume Manager、Image Manager、Node Status Manager 等等。这些控制循环的责任,就是通过控制器模式,完成 kubelet 的某项具体职责。比如 Node Status Manager,就负责响应 Node 的状态变化,然后将 Node 的状态收集起来,并通过 Heartbeat 的方式上报给 APIServer。再比如 CPU Manager,就负责维护该 Node 的 CPU 核的信息,以便在 Pod 通过 cpuset 的方式请求 CPU 核的时候,能够正确地管理 CPU 核的使用量和可用量。

 

SyncLoop,又是如何根据 Pod 对象的变化,来进行容器操作的呢?

kubelet 也是通过 Watch 机制,监听了与自己相关的 Pod 对象的变化。当然,这个 Watch 的过滤条件是该 Pod 的 nodeName 字段与自己相同。kubelet 会把这些 Pod 的信息缓存在自己的内存里。

而当一个 Pod 完成调度、与一个 Node 绑定起来之后, 这个 Pod 的变化就会触发 kubelet 在控制循环里注册的 Handler,也就是上图中的 HandlePods 部分。此时,通过检查该 Pod 在 kubelet 内存里的状态,kubelet 就能够判断出这是一个新调度过来的 Pod,从而触发 Handler 里 ADD 事件对应的处理逻辑。

在具体的处理过程当中,kubelet 会启动一个名叫 Pod Update Worker 的、单独的 Goroutine 来完成对 Pod 的处理工作。

比如,如果是 ADD 事件的话,kubelet 就会为这个新的 Pod 生成对应的 Pod Status,检查 Pod 所声明使用的 Volume 是不是已经准备好。然后,调用下层的容器运行时(比如 Docker),开始创建这个 Pod 所定义的容器。

而如果是 UPDATE 事件的话,kubelet 就会根据 Pod 对象具体的变更情况,调用下层容器运行时进行容器的重建工作。

kubelet 调用下层容器运行时的执行过程,并不会直接调用 Docker 的 API,而是通过一组叫作 CRI(Container Runtime Interface,容器运行时接口)的 gRPC 接口来间接执行的。Kubernetes 项目之所以要在 kubelet 中引入这样一层单独的抽象,当然是为了对 Kubernetes 屏蔽下层容器运行时的差异。

 

如何将 kubelet 工作目录更改为其他位置

】如何将kubelet工作目录更改为其他位置【英文标题】:howtochangekubeletworkingdirtosomewhereelse【发布时间】:2018-02-1305:11:57【问题描述】:kubernetes1.7.xkubelet将一些数据存储在/var/lib/kubelet中,如何将其更改到其他位置?因为我的/var非... 查看详情

工作节点上的 Kubernetes - kubelet.service 未启动

】工作节点上的Kubernetes-kubelet.service未启动【英文标题】:Kubernetesonworkernode-kubelet.servicenotstarting【发布时间】:2021-03-1408:37:01【问题描述】:我正在尝试使用以下命令在CentOS-7.9上设置一个新的工作节点。#setenforce0#sed-i--follow-symli... 查看详情

kubelet的工作流程

...worker对容器进行生命周期的管理,这个worker程序就是 kubelet。简单地说,kubelet 的主要功能就是定时从某个地方获取节点上pod/container的期望状态(运行什么容器、运行的副本数量、网络或者存储如何配置等等),并调用对... 查看详情

kubelet原理解析二:pleg

...方PLEG示意图中红色的部分:以nodenotready这个场景为例:Kubelet中的NodeStatus机制会定期检查集群节点状况,并把节点状况同步到APIServer。而NodeStatus判断节点就绪状况的一个主要依据,就是PLEG。PLEG定期检查节点上Pod运行情况,并且... 查看详情

kube-apiserver 如何知道 kubelet 服务/进程在工作节点中运行的位置?

】kube-apiserver如何知道kubelet服务/进程在工作节点中运行的位置?【英文标题】:Howkube-apiserverknowswhereiskubeletservice/processrunninginworkernode?【发布时间】:2020-04-1907:30:18【问题描述】:我已经在虚拟盒子中引导(通过kelseyhightower艰难... 查看详情

当 Kubelet 停止时,Docker 可以自动杀死 Kubernetes 工作人员上的容器吗?

】当Kubelet停止时,Docker可以自动杀死Kubernetes工作人员上的容器吗?【英文标题】:CanDockerautomaticallykillcontainersonaKubernetesworkerwhenKubeletstopped?【发布时间】:2021-07-0902:14:48【问题描述】:我在Kubernetes中尝试使用default-not-ready-tolerat... 查看详情

Kubelet 服务未启动 - KUBELET_EXTRA_ARGS (code=exited, status=255)

】Kubelet服务未启动-KUBELET_EXTRA_ARGS(code=exited,status=255)【英文标题】:Kubeletservicenotstartingup-KUBELET_EXTRA_ARGS(code=exited,status=255)【发布时间】:2018-12-2409:27:56【问题描述】:我正在尝试在工作节点(第3个工作节点)上启动kubelet服务....... 查看详情

kubernetes控制器(代码片段)

...制器的必要性自主POD调度绑定至节点若主程序崩溃则节点kubelet能够自动重启容器,但若是非主进程崩溃类的容器kubelet无从感知。这便需要依赖于POD对象定义的存活探测,以便kubelet能够探知到此类故障,但若pod被删除或者工作节... 查看详情

Kubelet 停止发布节点状态 (Kubernetes)

】Kubelet停止发布节点状态(Kubernetes)【英文标题】:Kubeletstoppedpostingnodestatus(Kubernetes)【发布时间】:2019-07-2402:17:12【问题描述】:我在EKS上运行具有两个工作节点的kubernetes集群。两个节点都显示NotReady状态,当我检查两个节点上... 查看详情

k8s常见故障

故障排查思路节点处于NotReady节点是由kubelet管理的,所以要先检查kubelet的相关情况排查思路:查看kubelet和docker服务是否正常systemctlstatuskubectlsystemctlstatusdocker查看kubelet的日志或者重启kubelet并查看日志systemctlrestartkubectl#查看日志... 查看详情

kubelet和cri设计

kubelet组件  Pod调度完成后,Kubernetes就需要负责将这个调度成功的Pod在宿主机上创建出来,并把它所定义的各个容器启动起来.这些,都是kubelet这个核心组件的主要功能  kubelet本身也是按照“控制器”模式来工作... 查看详情

kubelet 在普罗米修斯目标中失败

】kubelet在普罗米修斯目标中失败【英文标题】:kubeletisdowninprometheustarget【发布时间】:2019-07-2000:58:49【问题描述】:我已经使用helm安装了prometheus-operator。一切正常,但后来我将工作组更改为t2.large。现在我在grafana仪表板和prome... 查看详情

kubernetes组件原理(代码片段)

...配任务ETCD:数据库存储k8s集群所以重要信息(持久化)Kubelet:直接跟容器引擎交换实现容器的生命周期管理Kube-proxy:负责写入规则至IPTABLES、IPVS实现服务映射访问Flannel:让集群中不同节点主机创建的docker容器都具有全集群唯一的... 查看详情

kube apiserver 如何与 kubelet 和 kube-proxy 通信?

】kubeapiserver如何与kubelet和kube-proxy通信?【英文标题】:Howdoeskubeapiservercommunicateswithkubeletandkube-proxy?【发布时间】:2020-06-1606:57:18【问题描述】:如果我可以在防火墙后面的网络中使用公开可用的控制平面和工作节点运行k8s(这... 查看详情

k8s系统部署kubelet服务

参考技术Akubelet是在每个Node节点上运行的主要“节点代理”。它可以使用以下之一向apiserver注册:主机名(hostname);覆盖主机名的参数;某云驱动的特定逻辑。kubelet是基于PodSpec来工作的。每个PodSpec是一个描述Pod的YAML或JSON对... 查看详情

[k8s]k8s的控制层kubelet+docker配合调度机制(k8架构)

意外停掉一台node的kubelet,发现调度有问题,研究了下调度的细节k8s架构控制层-kubelet(配合节点docker工作)数据层-kube-proxy逻辑图:测试pod调度停掉n1的kubelet,等几min后kubectlgetnode显示n1notready在等几min后kubectlgetno-owideAGE字段显示unkown.在... 查看详情

kubelet启动流程解析(一)启动方式及初始化解析

参考技术A我们一般以systemd系统守护进程的方式启动kubelet我们看下service配置其中启动部分执行了/usr/local/bin/kubelet二进制文件,启动的参数我们暂且不关注。/usr/local/bin/kubelet二进制文件是由kubernetes源码编译而来,接下来让我们... 查看详情

kubelet 实现的最低要求是啥?

】kubelet实现的最低要求是啥?【英文标题】:Whataretheminimumkubeletimplementationrequirements?kubelet实现的最低要求是什么?【发布时间】:2021-08-0718:29:03【问题描述】:我正在寻找kubelet实现的最低要求的细分。诸如序列图/描述和API之... 查看详情