生成容器引用信息
基于kubernetes v1.18.6
,关于基于windows
平台运行kubelet
的相关代码逻辑不作解析。
概述
kubelet
通过以下四个步骤,来启动pod
容器:
其中创建容器
又分为以下子步骤:
本文主要解析创建容器/生成容器引用信息
阶段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
作为索引,以容器的信息(所属pod
的uid
、名称、命名空间,以及容器在pod
内的域等信息)为value
RefManager对象解析
RefManager
管理容器的引用,是一个线程安全对象,调用者不需要锁。引用用于报告事件,如创建、失败等。
结构体数据结构
type RefManager struct {
sync.RWMutex
containerIDToRef map[ContainerID]*v1.ObjectReference
}
ContainerID对象解析
ContainerID
是容器引用对象的key
,ContainerID
为一个结构体类型对象,ContainerID
根据运行时(如docker
、containered
)类型与容器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
字段,其他字段均取自所属Pod
(pod
是k8s
下最小调度资源)
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"`
}