美文网首页
kubelet创建容器之预启动容器

kubelet创建容器之预启动容器

作者: 微凉哇 | 来源:发表于2021-12-01 10:53 被阅读0次

    基于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管理策略分为:
    • none: 默认策略,表示现有的调度行为。
    • 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
    }
    

    相关文章

      网友评论

          本文标题:kubelet创建容器之预启动容器

          本文链接:https://www.haomeiwen.com/subject/uwksxrtx.html