预启动容器

基于kubernetes v1.18.6,关于基于windows平台运行kubelet的相关代码逻辑不作解析。

概述

kubelet通过以下四个步骤,来启动pod容器:

  1. 拉取镜像
  2. 创建容器
  3. 启动容器
  4. 执行容器启动后的钩子

其中创建容器又分为以下子步骤:

  1. 设置容器重启次数
  2. 生成创建容器所需配置
  3. 创建容器
  4. 预启动容器
  5. 生成容器引用信息

本文主要解析创建容器/预启动容器阶段kubelet所做工作,首先我们先看下预启动容器阶段的代码逻辑

预启动逻辑分析

该阶段没有动作发生,也是针对启动关联配置的赋值

预启动容器入口函数源码

kubernetes\pkg\kubelet\kuberuntime\kuberuntime_container.go

func (m *kubeGenericRuntimeManager) startContainer(podSandboxID string, podSandboxConfig *runtimeapi.PodSandboxConfig, spec *startSpec, pod *v1.Pod, podStatus *kubecontainer.PodStatus, pullSecrets []v1.Secret, podIP string, podIPs []string) (string, error) {
...
    containerID, err := m.runtimeService.CreateContainer(podSandboxID, containerConfig, podSandboxConfig)
    if err != nil {
        s, _ := grpcstatus.FromError(err)
        m.recordContainerEvent(pod, container, containerID, v1.EventTypeWarning, events.FailedToCreateContainer, "Error: %v", s.Message())
        return s.Message(), ErrCreateContainer
    }
    err = m.internalLifecycle.PreStartContainer(pod, container, containerID)
    if err != nil {
        s, _ := grpcstatus.FromError(err)
        m.recordContainerEvent(pod, container, containerID, v1.EventTypeWarning, events.FailedToStartContainer, "Internal PreStartContainer hook failed: %v", s.Message())
        return s.Message(), ErrPreStartHook
    }
    m.recordContainerEvent(pod, container, containerID, v1.EventTypeNormal, events.CreatedContainer, fmt.Sprintf("Created container %s", container.Name))
...

透过源码我们发现,m.internalLifecycle.PreStartContainer(pod, container, containerID)预启动容器步骤主要逻辑

该阶段主要设置pod容器的cpu管理策略与拓扑管理策略。

  1. cpu管理策略分为:

  2. none: 默认策略,表示现有的调度行为。

  3. static: 该策略针对具有整数型CPU requestsGuaranteed Pod,它允许该类Pod中的容器访问节点上的独占CPU资源。 这种独占性是使用cpuset cgroup 控制器 来实现的

关于cpu管理策略请参考控制节点上的 CPU 管理策略

  1. 关于拓扑管理策略请参考控制节点上的拓扑管理策略

预启动容器源码实现

func (i *internalContainerLifecycleImpl) PreStartContainer(pod *v1.Pod, container *v1.Container, containerID string) error {
    if i.cpuManager != nil {
        err := i.cpuManager.AddContainer(pod, container, containerID)
        if err != nil {
            return err
        }
    }
    if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.TopologyManager) {
        err := i.topologyManager.AddContainer(pod, containerID)
        if err != nil {
            return err
        }
    }
    return nil
}
Copyright © weiliang 2021 all right reserved,powered by Gitbook本书发布时间: 2024-04-22 16:03:41

results matching ""

    No results matching ""