Kubelet是Kubernetes集群中的一个重要组件,它运行在每个节点上,负责在节点上管理容器和Pod。Kubelet的作用Kubelet的主要作用是在节点上管理容器和Pod。 Kubelet还负责监视节点的状态,并向API Server汇报节点状态和健康状况。Kubelet还可以配置和管理容器的存储和网络等资源。 Kubelet的组成部分Kubelet包含以下组成部分:PodSpec:Pod的规范定义,包括容器和卷等信息。Kubelet API:Kubelet提供的API,用于管理Pod和容器。 Kubelet的工作原理Kubelet工作的基本流程如下:Kubelet通过API Server获取需要在节点上运行的Pod清单。 Kubelet通过Container runtime创建和管理容器,并在容器中运行Pod中指定的应用程序。Kubelet定期检查容器的状态,并向API Server汇报状态和健康状况。
Kubelet参数的示例以下是一些常见的Kubelet参数示例:启动Kubelet并使用默认参数:kubelet指定Kubelet使用的配置文件:kubelet --config=/etc/kubernetes /kubelet.yaml指定Kubelet使用的容器运行时:kubelet --container-runtime=docker指定Kubelet使用的Pod CIDR:kubelet --pod-cidr =10.0.0.0/24指定Kubelet使用的TLS证书和私钥文件:kubelet --tls-cert-file=/etc/kubernetes/certs/kubelet.crt --tls-private-key-file =/etc/kubernetes/certs/kubelet.key指定Kubelet使用的网络插件:kubelet --network-plugin=cni指定Kubelet使用的云提供程序:kubelet 注册节点到Kubernetes API Server::kubelet --register-node=true --kubeconfig=/etc/kubernetes/kubelet.conf --
kubelet入口函数kubelet 在 Node 节点上负责 Pod 的创建、销毁、监控上报等核心流程,通过 Cobra 命令行解析参数启动二进制可执行文件,Cobra启动入口在kubernetes/ cmd/kubelet/kubelet.go文件中,经过封装后,实际的入口如下:...// kubernetes/cmd/kubelet/app/server.go func run(ctx context.Context // kubernets/cmd/kubelet/app/server.gofunc startKubelet(k kubelet.Bootstrap, podCfg *config.PodConfig // kubernets/pkg/kubelet/kubelet.gofunc (kl *Kubelet) Run(updates <-chan kubetypes.PodUpdate) {if kl.logServer klog.InfoS("Starting kubelet main sync loop")// syncTicker唤醒kubelet检查是否需要同步,同步间隔默认为10s。
一、概要 kubelet 是运行在每个节点上的主要的“节点代理”,每个节点都会启动 kubelet进程,用来处理 Master 节点下发到本节点的任务,按照 PodSpec 描述来管理Pod 和其中的容器 二、kubelet 的主要功能 1、kubelet 默认监听四个端口,分别为 10250 、10255、10248、4194。 三、kubelet 组件中的模块 ? 上图展示了 kubelet 组件中的模块以及模块间的划分。 12、containerManager 负责 node 节点上运行的容器的 cgroup 配置信息,kubelet 启动参数如果指定 --cgroups-per-qos 的时候,kubelet 会启动 参考: 微软资深工程师详解 K8S 容器运行时 kubernetes 简介: kubelet 和 pod Kubelet 组件解析
名称:Virtual Kubelet 类型:无节点 说明:Virtual Kubelet(VK)是一个开源的Kubernetes kubelet实现,将Kubernetes连接到其他API,伪装成一个kubelet 有关谁参与以及Virtual Kubelet扮演角色的详细信息,请阅读Virtual Kubelet CNCF项目建议书(https://github.com/cncf/toc/blob/master/ 网站/代码: https://github.com/virtual-kubelet/virtual-kubelet 文档: https://github.com/virtual-kubelet/virtual-kubelet 错误和功能请求: https://github.com/virtual-kubelet/virtual-kubelet/issues 即时交流: https://kubernetes.slack.com tab=newest&q=virtual%20kubelet
author: garnett.wang@gmail.com kubernetes version: 1.6.2 Kubelet Configurations We Should Care About kube-api-qps int32 5 --kube-reserved mapStringString cpu=200m,memory=16G --kubeconfig string /var/lib/kubelet /volume/exec/ --volume-stats-agg-period duration 1m0s Kubelet Configuration Best Practicies 下面是我最终梳理的 ,认为需要真正显示设置的flag,如下: /usr/bin/kubelet —address=0.0.0.0 --port=10250 --allow-privileged=false --cluster-dns /sys/fs/cgroup/hugebtl/system.slice/kubelet.service 这个工作可以放到kubelet.service的ExecStartPre中做。
Virtual Kubelet是Kubernetes kubelet的一个实现,它伪装成一个kubelet,用于将Kubernetes集群连接到其他API。 架构 kubelets通常如何工作 一般来讲,Kubernetes kubelet为每个Kubernetes节点(Node)实现Pod和容器操作。 Virtual Kubelet的工作原理 从Kubernetes API服务器的角度来看,Virtual Kubelet看起来像普通的kubelet,但其关键区别在于它们在其他地方调度容器,例如在云无服务器 下面显示了一个Kubernetes集群,其中包含一系列标准kubelet和一个Virtual Kubelet: ? 简介:Virtual Kubelet 深入了解:Virtual Kubelet Virtual Kubelet项目最近更新了网页,快来了解一下!
一、概要 kubelet 是运行在每个节点上的主要的“节点代理”,每个节点都会启动 kubelet进程,用来处理 Master 节点下发到本节点的任务,按照 PodSpec 描述来管理Pod 和其中的容器 二、kubelet 的主要功能 1、kubelet 默认监听四个端口,分别为 10250 、10255、10248、4194。 三、kubelet 组件中的模块 [kubelet 组件中的模块] 上图展示了 kubelet 组件中的模块以及模块间的划分。 12、containerManager 负责 node 节点上运行的容器的 cgroup 配置信息,kubelet 启动参数如果指定 --cgroups-per-qos 的时候,kubelet 会启动 参考: 微软资深工程师详解 K8S 容器运行时 kubernetes 简介: kubelet 和 pod Kubelet 组件解析
xidianwangtao@gmail.com 摘要:PLEG(Pod Lifecycle Event Generator)是kubelet的核心模块,在kubelet/docker相关的许多问题定位时 (*Kubelet, error) { ... pkg/kubelet/kubelet.go:1326 // Run starts the kubelet reacting to config updates func (kl *Kubelet) kubelet syncLoop是kubelet来维护Pod状态的核心逻辑,每次sync都会检查Pod的状态并进行修复。 pkg/kubelet/kubelet.go:1796 func (kl *Kubelet) syncLoopIteration(configCh <-chan kubetypes.PodUpdate
容器健康检查 cAdvisor 资源监控 Kubelet Eviction(驱逐) 回收节点资源 驱逐用户 Pod kubelet 与 Container Runtime kubectl 简介 每个Node 和容器运行时进行交互以收集容器和节点 metrcis ---- Kubelet 组件架构图 Kubelet API,包括 10250 端口的认证 API、4194 端口的 cAdvisor API、 Kubelet 监听 etcd,所有针对 Pod 的操作都将会被 Kubelet 监听到。如果发现有新的绑定到本节点的 Pod,则按照 Pod 清单的要求创建该 Pod。 cAdvisor 是一个开源的分析容器资源使用率和性能特性的代理工具,集成到 Kubelet中,当Kubelet启动时会同时启动cAdvisor,且一个cAdvisor只监控一个Node节点的信息。 ---- Kubelet Eviction(驱逐) Kubelet 会监控资源的使用情况,并使用驱逐机制防止计算和存储资源耗尽。
nodefs:保存 kubelet 的卷和守护进程日志等。 imagefs:在容器运行时,用于保存镜像以及可写入层。 如果 imagefs 触发了驱逐,Kubelet 会根据 Pod 中所有容器的消耗的可写入层进行排序。 这就导致了 kubelet 反复触发驱逐阈值。另外回收资源例如磁盘资源,是需要消耗时间的。 要缓和这种状况,Kubelet 能够对每种资源定义 minimum-reclaim。 kubelet 一旦发现了资源压力,就会试着回收至少 minimum-reclaim 的资源,使得资源消耗量回到期望范围。 如果是 nodefs.available,Kubelet 就要想法子让 nodefs.available 回到至少 1.5Gi。
上篇文章(kubelet 架构浅析 )已经介绍过 kubelet 在整个集群架构中的功能以及自身各模块的用途,本篇文章主要介绍 kubelet 的启动流程。 kubernetes 版本: v1.12 kubelet 启动流程 kubelet 代码结构: ➜ kubernetes git:(release-1.12) ✗ tree cmd/kubelet cmd 2 directories, 22 files [kubelet 启动流程时序图] 1、kubelet 入口函数 main(cmd/kubelet/kubelet.go) func main() { 4、初始化 kubelet 组件内部的模块(cmd/kubelet/app/server.go) RunKubelet() 主要功能: 1、初始化 kubelet 组件中的各个模块,创建出 kubelet 参考: kubernetes node components – kubelet Kubelet 源码分析(一):启动流程分析 kubelet 源码分析:启动流程 kubernetes 的 kubelet
本来这篇文章会继续讲述 kubelet 中的主要模块,但由于网友反馈能不能先从 kubelet 的启动流程开始,kubelet 的启动流程在很久之前基于 v1.12 写过一篇文章,对比了 v1.16 中的启动流程变化不大 Kubelet 启动流程 kubernetes 版本:v1.16 kubelet 的启动比较复杂,首先还是把 kubelet 的启动流程图放在此处,便于在后文中清楚各种调用的流程: ? 主要逻辑为: 1、解析命令行参数; 2、为 kubelet 初始化 feature gates 参数; 3、加载 kubelet 配置文件; 4、校验配置文件中的参数; 5、检查 kubelet 是否启用动态配置功能 kubelet 的启动做一些基本的配置及检查工作,主要逻辑为: 1、为 kubelet 设置默认的 FeatureGates,kubelet 所有的 FeatureGates 可以通过命令参数查看,k8s 的启动流程,可以看到 kubelet 启动流程中的环节非常多,kubelet 中也包含了非常多的模块,后续在分享 kubelet 源码的文章中会先以 Run 方法中启动的所有模块为主,各个击破。
二、用于集群 Kubelet 组件证书 Kubernetes 集群中 Kubelet 组件坑 我们在搭建 Kubernetes 集群时,一般只声明用于集群 Master、Etcd等通信的证书 为 10年 或者 更久,但未声明集群 Kubelet 组件证书 ,Kubelet 组件证书 默认有效期为1年。 服务 $ systemctl restart kube-controller-manager # 进入到ssl配置目录,删除 kubelet 证书 $ rm -f kubelet-client-current.pem kubelet-client-2019-05-10-09-57-21.pem kubelet.key kubelet.crt # 重启启动,启动正常后会颁发有效期10年的ssl证书 $ systemctl restart kubelet # 进入到ssl配置目录,查看证书有效期 $ openssl x509 -in kubelet-client-current.pem -noout -text |
上篇文章(kubelet 架构浅析 )已经介绍过 kubelet 在整个集群架构中的功能以及自身各模块的用途,本篇文章主要介绍 kubelet 的启动流程。 kubernetes 版本: v1.12 kubelet 启动流程 kubelet 代码结构: ➜ kubernetes git:(release-1.12) ✗ tree cmd/kubelet 1、kubelet 入口函数 main(cmd/kubelet/kubelet.go) func main() { rand.Seed(time.Now().UTC().UnixNano()) command 4、初始化 kubelet 组件内部的模块(cmd/kubelet/app/server.go) RunKubelet() 主要功能: 1、初始化 kubelet 组件中的各个模块,创建出 kubelet 参考: kubernetes node components – kubelet Kubelet 源码分析(一):启动流程分析 kubelet 源码分析:启动流程 kubernetes 的 kubelet
配置kubelet的cpu管理策略 kubelet 通过 --cpu-manager-policy参数指定管理策略, 支持两种策略: none:默认策略,表示现有的调度行为(即CFS)。 同步频率通过新增的 Kubelet 配置参数 --cpu-manager-reconcile-period 来设置。 所以我们在配置 --kube-reserved和 --system-reserved后,可以通过CPUSET进行绑核心,让系统进程 和容器进程分开运行, 假如操作系统有12个核心,CPU预留策略如下,为系统和kubelet 是主板上插CPU的槽的数量 Core 每个CPU上的核数 Thread 是每个core上的硬件线程数,即超线程 cpumanager会先获取numa的节点配置,然后先根据这三个维度进行尝试分配 测试 kubelet
在前面的文章中已经介绍过 kubelet 的架构以及启动流程,本章会继续介绍 kubelet 中的核心功能,kubelet 中包含数十个 manager 以及对 CNI、CRI、CSI 的调用。 k8s.io/kubernetes/pkg/kubelet/kubelet.go:335 func NewMainKubelet() (*Kubelet, error) { ...... // statusManager k8s.io/kubernetes/pkg/kubelet/kubelet.go:1397 func (kl *Kubelet) Run(updates <-chan kubetypes.PodUpdate 端 pod 已被完全删除; k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go:900 func (kl *Kubelet) PodResourcesAreReclaimed %q for pod %q. "+ "But it is not owned by kubelet
在安装kubernetes的过程中,经常会遇见如下错误 failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs " is different from docker cgroup 原因是docker的Cgroup Driver和kubelet的Cgroup Driver不一致。 Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf -- kubeconfig=/etc/kubernetes/kubelet.conf --cgroup-driver=cgroupfs" 重启kubelet systemctl daemon-reload systemctl restart kubelet
现象 harbor镜像平台服务器出现内部错误,请求无法完成 排查 登陆dashboard发现node节点状态都为not ready,然后登陆node节点 看到确实都为not ready ,本能反应是把kubelet 这时细看nodes节点状态age为368d,感觉应该是什么过期了,之前还特意申请证书为10年,应该不是证书的问题,后来查阅部署文档发现kubelet也需要证书授权。 AGE REQUESTOR CONDITION node-csr-d8End93rQqSFRHpV65KA2yL-4CnYHT4te6D85lzO5QA 18m kubelet-bootstrap Pending node-csr-iuBw7qxuiCeyiQ1x5WqTASgqVheII-KpTX0L-S8Md8Y 10m kubelet-bootstrap Pending [ Approved,Issued node-csr-iuBw7qxuiCeyiQ1x5WqTASgqVheII-KpTX0L-S8Md8Y 11m kubelet-bootstrap Approved
整个kubelet可以按照上图所示的模块进行划分,模块之间相互配合完成Kubelet的所有功能.下面对上图中的模块进行简要的介绍. Kubelet对外暴露的端口,通过该端口可以获取到kubelet的状态 10250 kubelet API –kublet暴露出来的端口,通过该端口可以访问获取node资源以及状态,另外可以配合kubelet /server.go:149 10248 /healthz –kubelet健康检查,通过访问该url可以判断Kubelet是否正常work, 通过kubelet的启动参数–healthz-port – 深入分析 下面进一步的深入分析kubelet的代码 Kubelet负责pod的创建,pod的来源kubelet当前支持三种类型的podSource - FileSource: 通过kubelet 静态static pod 静态POD直接由某个节点上的kubelet程序进行管理,不需要api server介入,静态POD也不需要关联任何RC,完全是由kubelet程序来监控,当kubelet