containerd 源码分析:创建 container(一)

前言 Kubernetes:kubelet 源码分析之 pod 创建流程 介绍了 kubelet 创建 pod 的流程,containerd 源码分析:kubelet 和 containerd 交互 介绍了 kubelet 通过 cri 接口和 containerd 交互的过程,containerd 源码分析:启动注册流程 介绍了 containerd 作为高级容器运行时的启动流程。通过这三篇文章熟悉了 kubelet 和 containerd 的行为,对于 containerd 如何通过 OCI 接口创建容器 container 并没有涉及。 ...

2024-06-04 · xhy

containerd 源码分析:kubelet 和 containerd 交互

前言 Kubernetes:kubelet 源码分析之创建 pod 流程 介绍了 kubelet 创建 pod 的流程,其中介绍了 kubelet 调用 runtime cri 接口创建 pod。containerd 源码分析:启动注册流程 介绍了 containerd 作为一种行业标准的高级运行时的启动注册流程。那么,kubelet 是怎么和 containerd 交互的呢? 本文会带着这个问题分析 kubelet 和 containerd 的交互。 ...

2024-05-22 · xhy

containerd 源码分析:启动注册流程

前言 containerd 是一个行业标准的容器运行时,其强调简单性、健壮性和可移植性。本文将从 containerd 的代码结构入手,查看 containerd 的启动注册流程。 启动注册流程 containerd 首先以调试模式运行 containerd: 1// containerd/cmd/containerd/main.go 2package main 3 4import ( 5 ... 6 _ "github.com/containerd/containerd/v2/cmd/containerd/builtins" 7) 8 9... 10func main() { 11 app := command.App() 12 if err := app.Run(os.Args); err != nil { 13 fmt.Fprintf(os.Stderr, "containerd: %s\n", err) 14 os.Exit(1) 15 } 16} 在启动 containerd 时,导入匿名包 github.com/containerd/containerd/v2/cmd/containerd/builtins 注册插件。 ...

2024-05-21 · xhy

containerd 源码分析:kubelet 和 containerd 交互

前言 kubelet 是运行在 Kubernetes 节点上的“节点代理”,用来管理节点。 kubelet 主要负责所在节点上的资源对象的管理,例如 Pod 资源对象的创建,删除,监控,驱逐及生命周期管理等。 ...

2024-05-20 · xhy

Kubernetes:kubelet 源码分析之探针

前言 kubernetes 提供三种探针,配置探针(Liveness),就绪探针(Readiness)和启动(Startup)探针判断容器健康状态。其中,存活探针确定什么时候重启容器,就绪探针确定容器何时准备好接受流量请求,启动探针判断应用容器何时启动。 ...

2024-05-20 · xhy

Kubernetes: kube-controller-manager 源码分析

前言 在 Kubernetes 架构中,controller manager 是一个永不休止的控制回路组件,其负责控制集群资源的状态。通过监控 kube-apiserver 的资源状态,比较当前资源状态和期望状态,如果不一致,更新 kube-apiserver 的资源状态以保持当前资源状态和期望状态一致。 ...

2024-03-11 · xhy

Kubernetes leader election 源码分析

前言 Kubernetes:kube-scheduler 源码分析 介绍了 kube-scheduler 调度 Pod 的逻辑。文中有一点未提的是,在 Kubernetes 集群中,kube-scheduler 组件是多副本,单实例运行。仅有一个副本作为 leader 运行,当发生故障时,其它副本会抢占为 leader 继续运行。这种机制通过 leader election 实现,本文将从源码角度分析 leader election 选举的实现。并且,在此基础上,在回头看 kube-scheduler 是怎么结合 leader elction 实现多副本,单实例运行的。 ...

2024-02-23 · xhy

Kubernetes:kube-scheduler 源码分析

前言 [译] kubernetes:kube-scheduler 调度器代码结构概述 介绍了 kube-scheduler 的代码结构。本文围绕代码结构,从源码角度出发,分析 kube-scheduler 的调度逻辑。 启动 kube-scheduler kube-scheduler 使用 Cobra 框架初始化参数,配置和应用。 1// kubernetes/cmd/kube-scheduler/scheduler.go 2func main() { 3 // 启动 kube-scheduler 入口 4 command := app.NewSchedulerCommand() 5 ... 6} 7 8// kubernetes/cmd/kube-scheduler/app/server.go 9func NewSchedulerCommand(registryOptions ...Option) *cobra.Command { 10 // 创建 kube-scheduler 选项 11 opts := options.NewOptions() 12 13 cmd := &cobra.Command{ 14 Use: "kube-scheduler", 15 ... 16 RunE: func(cmd *cobra.Command, args []string) error { 17 return runCommand(cmd, opts, registryOptions...) 18 }, 19 ... 20 } 21 ... 22} 23 24// 运行 kube-scheduler 25func runCommand(cmd *cobra.Command, opts *options.Options, registryOptions ...Option) error { 26 ... 27 // 创建 kube-scheduler 配置 cc 28 // 创建 kube-scheduler 实例 sched 29 cc, sched, err := Setup(ctx, opts, registryOptions...) 30 if err != nil { 31 return err 32 } 33 ... 34 return Run(ctx, cc, sched) 35} 从启动命令来看,这里重点关注的是 Setup 函数。在该函数内,创建 kube-scheduler 配置 cc 和调度器实例 sched。 ...

2024-02-01 · xhy