kubelet-源码分析--启动篇

本文深入剖析 Kubernetes Kubelet 的启动流程,从架构、入口函数到RunKubelet的主要步骤,详细解释了配置加载、服务创建、客户端配置、监控功能初始化以及Pod管理等方面的内容,帮助理解Kubelet如何维护节点上的Pod和容器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Kubernetes集群中,每个Node节点(又称Minion)上都会启动一个Kubelet服务进行。该进程用于处理Master节点下发到本节点的任务,管理Pod及Pod中的容器。每个Kubelet进程会在API Server上注册节点自身信息,定期向Master节点汇报节点资源的使用情况,并通过cAdvise监控容器和节点资源。

此源码分析基于 K8s 1.14.6

Kubelet 架构

若想解读 Kubelet 源码,首先我们需要了解 Kubelet 的主要架构及组件。

启动入口

kubelet 的主函数入口在 cmd/kubelet/kubelet.go中,启动代码很简洁:

func main() {
    rand.Seed(time.Now().UnixNano())
    // 这里则是启动 kubelet 服务进程,返回一个*cobra.Command
    command := app.NewKubeletCommand(server.SetupSignalHandler())
    logs.InitLogs()
    defer logs.FlushLogs()

    if err := command.Execute(); err != nil {
        fmt.Fprintf(os.Stderr, "%v\n", err)
        os.Exit(1)
    }
}

app.NewKubeletCommand 函数则是对 kubelet 进行参数化配置并启动 kubelet,然后生成kubelet对象以及该kubelet维护pod所需要用到的服务。主要步骤如下

  1. 解析参数,加载当前flag,对参数的合法性进行判断。flag 包含两种:
    • kubeletFlags:kubelet -- 后追加的参数
    • kubeletConfig: 通过解析特定配置文件获取
  2. 构造 cobra.Command 对象,此对象用于执行用户输入的命令行交互。此对象结构体为
    {
        Use: componentKubelet,
        Long: ...,
        // The Kubelet has special flag parsing requirements to enforce flag precedence rules,
        // so we do all our parsing manually in Run, below.
        // DisableFlagParsing=true provides the full set of flags passed to the kubelet in the
        // `args` arg to Run, without Cobra's interference.
        DisableFlagParsing: true,
        Run: func(cmd *cobra.Command, args []string) {...
        },
    }

其中的 Run 则是用于具体执行用户命令的函数,这个函数的流程也就是 kubelet的主流程,创建 kubelet 对象,创建各种服务。

启动流程

这一部分解析一下 Run 函数。首先我们需要了解两个比较重要的配置结构体KubeletFlags kubeletconfig.KubeletConfiguration

启动流程如下:

  1. 新建一个watch的功能,主要是用来watch kubelet的配置文件是否改变,如果已经改变,那么就重新load kubelet的配置文件 用的是kubernetes常用到的Controller,也就是Informer的架构,watch ConfigMap对象
    > controller 相关代码在 `pkg/kubelet/kubeletconfig/controller.go`中 *//TODO 介绍下 controller informer 机制*
  1. 构造 Kubelet server对象,
    kubelet server 对象由 kubelet 各种配置
首先,你需要确保已经安装了Kubernetes集群和Dashboard。然后,按照以下步骤安装和配置kubelet-dashboard: 1. 将kubelet-dashboard的镜像文件下载到本地: ``` $ docker pull mirrorgooglecontainers/kubelet-dashboard-amd64:v1.10.1 ``` 2. 将镜像文件推送到Kubernetes集群中的所有节点: ``` $ docker save mirrorgooglecontainers/kubelet-dashboard-amd64:v1.10.1 > kubelet-dashboard-amd64.tar $ scp kubelet-dashboard-amd64.tar user@node1:/tmp/ $ scp kubelet-dashboard-amd64.tar user@node2:/tmp/ $ scp kubelet-dashboard-amd64.tar user@node3:/tmp/ $ ssh user@node1 "docker load < /tmp/kubelet-dashboard-amd64.tar" $ ssh user@node2 "docker load < /tmp/kubelet-dashboard-amd64.tar" $ ssh user@node3 "docker load < /tmp/kubelet-dashboard-amd64.tar" ``` 3. 创建kubelet-dashboard的ServiceAccount和ClusterRoleBinding: ``` $ kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml ``` 4. 创建kubelet-dashboard的ConfigMap: ``` $ kubectl create configmap kubelet-dashboard-config --from-literal=kubelet_url=https://localhost:10250 ``` 5. 创建kubelet-dashboard的Deployment: ``` $ kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml ``` 6. 将kubelet-dashboard的Service暴露出来,以便能够通过Web浏览器访问: ``` $ kubectl expose deployment kubernetes-dashboard --type=NodePort --port=443 --target-port=8443 ``` 7. 获取kubelet-dashboard的访问地址: ``` $ kubectl describe service kubernetes-dashboard ``` 8. 通过Web浏览器访问kubelet-dashboard的访问地址,使用创建的ServiceAccount登录即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值