生成容器引用信息

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

概述

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

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

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

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

本文主要解析创建容器/生成容器引用信息阶段kubelet所做工作,首先我们先看下生成容器引用信息阶段的代码逻辑

源码解析

流程很简单:生成容器引用信息并赋值给kubeGenericRuntimeManager.containerRefManager

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) {
...
    ref, err := kubecontainer.GenerateContainerRef(pod, container)
...
    if ref != nil {
        m.containerRefManager.SetRef(kubecontainer.ContainerID{
            Type: m.runtimeName,
            ID:   containerID,
        }, ref)
    }
...
}

容器引用解析

容器引用是什么?

本质就是一个map类型集合,以容器ID+运行时类型为key作为索引,以容器的信息(所属poduid、名称、命名空间,以及容器在pod内的域等信息)为value

RefManager对象解析

RefManager管理容器的引用,是一个线程安全对象,调用者不需要锁。引用用于报告事件,如创建、失败等。

结构体数据结构

type RefManager struct {
    sync.RWMutex
    containerIDToRef map[ContainerID]*v1.ObjectReference
}

ContainerID对象解析

ContainerID是容器引用对象的keyContainerID为一个结构体类型对象,ContainerID根据运行时(如dockercontainered)类型与容器id生成

type ContainerID struct {
    // The type of the container runtime. e.g. 'docker'.
    Type string
    // The identification of the container, this is comsumable by
    // the underlying container runtime. (Note that the container
    // runtime interface still takes the whole struct as input).
    ID string
}

v1.ObjectReference对象解析

通过以下字段描述容器索引属性,除FieldPath字段,其他字段均取自所属Podpodk8s下最小调度资源)

type ObjectReference struct {
    Kind string `json:"kind,omitempty" protobuf:"bytes,1,opt,name=kind"`
    Namespace string `json:"namespace,omitempty" protobuf:"bytes,2,opt,name=namespace"`
    Name string `json:"name,omitempty" protobuf:"bytes,3,opt,name=name"`
    UID types.UID `json:"uid,omitempty" protobuf:"bytes,4,opt,name=uid,casttype=k8s.io/apimachinery/pkg/types.UID"`
    APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,5,opt,name=apiVersion"`
    ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,6,opt,name=resourceVersion"`
    FieldPath string `json:"fieldPath,omitempty" protobuf:"bytes,7,opt,name=fieldPath"`
}
Copyright © weiliang 2021 all right reserved,powered by Gitbook本书发布时间: 2024-04-22 16:03:41

results matching ""

    No results matching ""