基于kubernetes v1.18.6
,关于基于windows
平台运行kubelet
的相关代码逻辑不作解析。
概述
kubelet
通过以下四个步骤,来启动pod
容器:
- 拉取镜像
- 创建容器
- 启动容器
- 执行容器启动后的钩子
其中创建容器
又分为以下子步骤:
- 设置容器重启次数
- 生成创建容器所需配置
- 创建容器
- 预启动容器
- 生成容器引用信息
本文主要解析创建容器/预启动容器
阶段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
管理策略与拓扑管理策略。
-
cpu
管理策略分为:
-
none
: 默认策略,表示现有的调度行为。 -
static
: 该策略针对具有整数型CPU requests
的Guaranteed Pod
,它允许该类Pod
中的容器访问节点上的独占CPU
资源。
这种独占性是使用cpuset cgroup 控制器 来实现的
关于cpu
管理策略请参考控制节点上的 CPU 管理策略
- 关于拓扑管理策略请参考控制节点上的拓扑管理策略
预启动容器源码实现
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
}
网友评论