Kubernetes CRI 分析 - kubelet 创建 Pod 分析

本文详细探讨了 kubelet 如何通过 CRI(Container Runtime Interface)来创建 Pod,重点分析了 kubelet 的 dockershim 组件如何调用 Docker 和 CNI 构建 Pod 网络。文章涵盖了 CRI 架构、kubelet 的调用流程以及 CRI shim 在创建 Pod sandbox 的具体步骤。
摘要由CSDN通过智能技术生成

kubelet CRI 创建 Pod 调用流程

本文以 kubelet dockershim 创建 Pod 调用流程为例做分析。
kubelet 通过调用 dockershim 来创建并启动容器,而 dockershim 则调用 Docker 来创建并启动容器,并调用 CNI 来构建 Pod 网络。

file
kubelet dockershim 创建 Pod 调用流程图

dockershim 属于 kubelet 内置 CRI shim,其余的 remote CRI shim 创建 Pod 调用流程其实与 dockershim 调用基本一致,只不过是调用了不同的容器引擎来操作容器,但一样由 CRI shim 调用 CNI 来构建 Pod 网络。

下面是详细的源码分析。

kubeGenericRuntimeManager 的 SyncPod 方法,调用 CRI 创建 Pod 的逻辑将在该方法里触发。

从该方法代码也可以看出,kubelet 创建一个 Pod 的逻辑为:

  1. 先创建并启动 Pod sandbox 容器,并构建好 Pod 网络。

  2. 创建并启动 ephemeral containers。

  3. 创建并启动 init containers。

  4. 最后创建并启动 normal containers(即普通业务容器)。

这里对调用 m.createPodSandbox 来创建 Pod sandbox 进行分析,用 m.startContainer 等调用分析可以参照该分析自动进行分析,调用流程几乎一致。

	// pkg/kubelet/kuberuntime/kuberuntime_manager.go
	// SyncPod syncs the running pod into the desired pod by executing following steps:
	//
	//  1. Compute sandbox and container changes.
	//  2. Kill pod sandbox if necessary.
	//  3. Kill any containers that should not be running.
	//  4. Create sandbox if necessary.
	//  5. Create ephemeral containers.
	//  6. Create init containers.
	//  7. Create normal containers.
	func (m *kubeGenericRuntimeManager) SyncPod(pod *v1.Pod, podStatus *kubecontainer.PodStatus, pullSecrets []v1.Secret, backOff *flowcontrol.Backoff) (result kubecontainer.PodSyncResult) {
	 ...
	 // Step 4: Create a sandbox for the pod if necessary.
	 podSandboxID := podContainerChanges.SandboxID
	 if podContainerChanges.CreateSandbox {
		var msg string
		var err error

		klog.V(4).Infof("Creating sandbox for pod %q", format.Pod(pod))
		createSandboxResult := kubecontainer.NewSyncResult(kubecontainer.CreatePodSandbox, format.Pod(pod))
		result.AddSyncResult(createSandboxResult)
		podSandboxID, msg, err = m.createPodSandbox(pod, podContainerChanges.Attempt)
		...
	}

m.createPodSandbox

**m.createPodSandbox **方法主要是调用 m.runtimeService.RunPodSandbox

runtimeService 即 RemoteRuntimeService,实现了 CRI shim 客户端-容器运行时接口 RuntimeService interface,持有与 CRI shim 容器运行时服务端通信的客户端。所以调用 m.runtimeService.RunPodSandbox,实际上等于调用了 CRI shim 服务端的 RunPodSandbox 方法,来进行 Pod sandbox 的创建。

	// pkg/kubelet/kuberuntime/kuberuntime_sandbox.go
	// createPodSandbox creates a pod sandbox and returns (podSandBoxID, message, error).
	func (m *kubeGenericRuntimeManager) createPodSandbox(pod *v1.Pod, attempt uint32) (string, string, error) {
	 podSandboxConfig, err := m.generatePodSandboxConfig(pod, attempt)
	 if err != nil {
		message := fmt.Sprintf("GeneratePodSandboxConfig for pod %q failed: %v", format.Pod(pod), err)
		klog.Error(message)
		return "", message, err
	 }

	 // Create pod logs directory
	 err = m.osInterface.MkdirAll(podSandboxConfig.LogDirectory, 0755)
	 if err != nil {
		message := fmt.Sprintf("Create pod log directory for pod %q failed: %v", format.Pod(pod), err)
		klog.Errorf(message)
		return ""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值