kubelet 结构体阅读

kubelet 

kubelet 的声明

Kubelet struct {   

    kubeletConfiguration kubeletconfiginternal.KubeletConfiguration    // kubelet的配置详情

    hostname        string    // 机器名

    nodeName        types.NodeName    // 节点名

    runtimeCache    kubecontainer.RuntimeCache     // 运行时的缓存(pods)

    kubeClient      clientset.Interface    // 和master通信的客户端

    heartbeatClient   v1core.CoreV1Interface       // 心跳客户端

    iptClient      utilipt.Interface     // iptables

    rootDirectory  string    // kubelet的volume、mounts、配置目录路径。默认是/var/lib/kubelet

    podWorkers PodWorkers      // 响应事件,处理同步pods   

    resyncInterval time.Duration      // 同步间隔  

    sourcesReady config.SourcesReady      // 记录被kubelet看到的资源   

    podManager kubepod.Manager       // pod的管理对象

    evictionManager eviction.Manager     // 需要观察和响应可能影响节点稳定性的情况

    logServer http.Handler   // 日志服务, defaults to /logs/ from /var/log

    kubecontainer.ContainerCommandRunner   // 用来在容器中执行命令

    cadvisor cadvisor.Interface   // 用来获取容器信息

    registerNode bool     // 节点是否向 apiserver 注册自己

    registerWithTaints []api.Taint   // 当节点注册自己的时候,节点的污染情况

    registerSchedulable bool    // 节点是否注册自己被调度

    registrationCompleted bool     // 是否已经注册完毕

    dnsConfigurer *dns.Configurer     // 启动pod时候的dns配置

    masterServiceNamespace string    // master服务所在的namespace

   serviceLister serviceLister    //  根据标签返回服务列表 List (labels.Selector) ([]*v1.Service, error)

    nodeInfo predicates.NodeInfo     // 返回节点的详情信息

    nodeLabels map[string]string     // 要注册的节点的标签

    runtimeState *runtimeState     // 最近一次相应ping的时间戳

    volumePluginMgr *volume.VolumePluginMgr     // volume 插件

    probeManager prober.Manager    // 处理容器的探针检测

    livenessManager proberesults.Manager     // 记录探针检测的结果

    streamingConnectionIdleTimeout time.Duration     // 执行容器内命令空闲等待多久会被关闭 (command execution/port forwarding)

    recorder record.EventRecorder     // 记录事件

    containerGC kubecontainer.ContainerGC     // 处理死亡容器的gc策略

    imageManager images.ImageGCManager    // 处理镜像的gc

    containerLogManager logs.ContainerLogManager    // 处理容器的日志

    secretManager secret.Manager    // Secret manager

    configMapManager configmap.Manager    // ConfigMap manager

    machineInfo *cadvisorapi.MachineInfo    // 缓存从cadvisor 获取的机器信息

    rootfsInfo *cadvisorapiv2.FsInfo    // 缓存从 cadvisor 获取的rootfs 信息

    serverCertificateManager certificate.Manager    // Handles certificate rotations

    statusManager status.Manager    // 缓存pods的状态并同步给APIserver

    volumeManager volumemanager.VolumeManager    // 执行异步循环,根据这个节点上调度的pods,那些卷需要进行 attached/mounted/unmounted/detached 操作

    cloud cloudprovider.Interface    // 云的接口

    cloudproviderRequestMux sync.Mutex    // 锁下面的变量

    cloudproviderRequestParallelism chan int    // 并行处理的请求计数

    cloudproviderRequestSync chan int    // 同步已经完成的请求

    cloudproviderRequestTimeout time.Duration    // 请求超时时间

    externalCloudProvider bool    // 节点初始化发生在云上

    nodeRef *v1.ObjectReference    // 本节点的引用

    containerRuntimeName string    // 容器运行时的名字

    containerRuntime kubecontainer.Runtime    // 容器运行时(重要?)

    runtimeService internalapi.RuntimeService    // 容器运行时服务

    reasonCache *ReasonCache    //  生产容器状态时使用的,创建失败信息

    nodeStatusUpdateFrequency time.Duration    // 本节点信息汇报给master的频率,因为需要汇总节点信息,所以这个值不能设置的太少

    pleg pleg.PodLifecycleEventGenerator    // 生成pod事件

    podCache kubecontainer.Cache    // 缓存所有的pod状态

    os kubecontainer.OSInterface    //  调用 syscalls 时候的外观

    oomWatcher OOMWatcher    // 监视oom事件

    resourceAnalyzer serverstats.ResourceAnalyzer    // 资源监控器

    cgroupsPerQOS bool    // 

    cgroupRoot string    // 非空的时候需要传给容器运行时

    mounter mount.Interface    // 处理卷的安装

    writer kubeio.Writer    // 卷的writer

    containerManager cm.ContainerManager    // 非运行容器的管理对象

    maxPods int    // 能运行的最大pod数量

    syncLoopMonitor atomic.Value    // 同步循环的监控器?

    backOff *flowcontrol.Backoff    // 容器重启的重试时间间隔

    podKillingCh chan *kubecontainer.PodPair    // 送需要杀死的pod

    daemonEndpoints *v1.NodeDaemonEndpoints    // 守护进程的端口信息

    workQueue queue.WorkQueue    // 触发worker的队列

    oneTimeInitializer sync.Once    // 初始化

    nodeIP net.IP    // 非空的话,用这个来代替节点ip

    providerID string    // 外部数据库中的节点的唯一标识符

    clock clock.Clock    // 提供了使劲啊相关的接口,便于测试

    setNodeStatusFuncs []func(*v1.Node) error    // 在update节点时候需要调用的方法

    admitHandlers lifecycle.PodAdmitHandlers    // 

    softAdmitHandlers lifecycle.PodAdmitHandlers    // 

    lifecycle.PodSyncLoopHandlers     // pod循环同步的时候需要调用的方法

    lifecycle.PodSyncHandlers      // pod同步的时候需要调用的方法

    podsPerCore int       // 允许core的数量

    enableControllerAttachDetach bool     // 允许controller 来负责卷,不允许kubelet管理

    containerDeletor *podContainerDeletor    // 删除容器的触发器

    makeIPTablesUtilChains bool    // 是否使用配置iptables 规则

    iptablesMasqueradeBit int

    iptablesDropBit int

    appArmorValidator apparmor.Validator

    criHandler http.Handler

    experimentalHostUserNamespaceDefaulting bool

    dockerLegacyService dockershim.DockerLegacyService

    *stats.StatsProvider    // 提供节点和pod的状态信息

    keepTerminatedPodVolumes bool



container/runtime

// 用来描述一个容器的运行时信息

Container  struct {                    

    ID ContainerID                     // 容器ID

    Name string                         // 容器名称

    Image string                        // 镜像名字(包含TAG)

    ImageID string                    // 镜像ID

    Hash uint64                        // 容器的哈希值

    State ContainerState          // 容器的状态

}

// Pod 是一组容器

Pod struct {                           

    ID types.UID                      // pod 的ID

    Name      string

    Namespace string

    Containers []*Container    // 容器列表(包含正在跑的容器和死掉的容器)

}

// 缓存了一个pods的列表,它在更新时候记录了一个时间戳

runtimeCache struct {        

    sync.Mutex

    getter podsGetter          // 实际用来获取pods的容器运行时

    cacheTime time.Time    // 最近一次列表更新的时刻

    pods []*Pod                    // 缓存列表实体

}

ContainerCommandRunner interface {

    // 同步在容器中执行命令,并返回输出

    RunInContainer(id ContainerID, cmd []string, timeout time.Duration) ([]byte, error)

}

// 定义了运行时容器内执行命令的方法(exec/attach/port-forward)

DirectStreamingRuntime interface {    

    ExecInContainer(containerID ContainerID, cmd []string, stdin io.Reader, stdout, stderr io.WriteCloser, tty bool, resize <-chan remotecommand.TerminalSize, timeout time.Duration) error   

    PortForward(pod *Pod, port int32, stream io.ReadWriteCloser) error   

    ContainerAttacher(AttachContainer(id ContainerID, stdin io.Reader, stdout, stderr io.WriteCloser, tty bool, resize <-chan remotecommand.TerminalSize) (err error))

}

// 定义了镜像相关的操作

ImageService interface {

    PullImage(image ImageSpec, pullSecrets []v1.Secret) (string, error)    // 从网络拉取一个镜像到本地存储,返回一个镜像的引用(digest or ID)

    GetImageRef(image ImageSpec) (string, error)    // 返回一个本地镜像的引用,如果在本地找不到则返回空

    ListImages() ([]Image, error)    // 返回机器上的所有镜像

    RemoveImage(image ImageSpec) error    // 删除一个指定的镜像

    ImageStats() (*ImageStats, error)    // 返回一个镜像的详情

}


container/container_gc

// 定义了死亡容器的操作

ContainerGC interface {    

    GarbageCollect() error    // 容器gc操作

    DeleteAllUnusedContainers() error    // 删除所有不适用的容器,包括那些停掉的

}

// 详细定义了容器gc的策略

ContainerGCPolicy struct {

    MinAge time.Duration     // 一个容器可以被gc的最小时间(0就是没有限制)

    MaxPerPodContainer int     // 允许持有的最大死亡容器数量

    MaxContainers int     // 最大死亡容器总数

}



images/image_gc_manager

// 管理所有镜像的生命周期

ImageGCManager interface {  

    GarbageCollect() error     // 应用垃圾收集策略。错误包括无法根据垃圾收集策略释放足够的空间。

    Start()     // 开始执行异步的镜像gc操作。启动了两个goroutine, 一个负责侦测新的image(detectImages),另一个负责更新本地的镜像缓存(ListImages)

    GetImageList() ([]container.Image, error)     // 返回镜像列表

    DeleteUnusedImages() error     // 删除所有的未使用的镜像

}

// gc策略定义了可以被gc的范围

ImageGCPolicy struct { 

    HighThresholdPercent int     // 超过这个值一定会被gc

    LowThresholdPercent int     // 低于这个值一定不会被gc

    MinAge time.Duration     // 可以被gc的最小生命

}



pod  记录所有已经生成好的pod(以及镜像pod的对应关系)

// MirrorClient 负责在APIserver上创建/删除镜像节点 

MirrorClient interface {    

    CreateMirrorPod(pod *v1.Pod) error    //  创建镜像节点

    DeleteMirrorPod(podFullName string) error   //  根据全名(name and namespace)删除镜像节点

}

// Manager 存储和管理pods的访问,维护static pods 和 mirror pods 之间的关系

Manager interface {

    GetPods() []*v1.Pod     // 返回绑定在 kubelet 上的所有pods    

    GetPodByFullName(podFullName string) (*v1.Pod, bool)    // 根据全名返回pod

    GetPodByName(namespace, name string) (*v1.Pod, bool)    // 根据名字返回pod

    GetPodByUID(types.UID) (*v1.Pod, bool)    // 根据uid返回pod

    GetPodByMirrorPod(*v1.Pod) (*v1.Pod, bool)     // 根据镜像pod返回staic pod

    GetMirrorPodByPod(*v1.Pod) (*v1.Pod, bool)    // 根据static pod 返回镜像pod

    GetPodsAndMirrorPods() ([]*v1.Pod, []*v1.Pod)    // 返回常规pods和镜像pods

    SetPods(pods []*v1.Pod)    // 设置一个pod,用来替换旧的(测试用)

    AddPod(pod *v1.Pod)    // 增加一个pod

    UpdatePod(pod *v1.Pod)    // 更新一个pod

    DeletePod(pod *v1.Pod)     // 删除一个 pod(如果是镜像节点?如果不是镜像节点?)

    DeleteOrphanedMirrorPods()     // 给APIserver发消息,删除所有的孤儿镜像pods

    TranslatePodUID(uid types.UID) kubetypes.ResolvedPodUID     // 返回真正的uid,如果参数是一个镜像的pod,那么需要返回实际static pod的uid

    GetUIDTranslations() (podToMirror map[kubetypes.ResolvedPodUID]kubetypes.MirrorPodUID, mirrorToPod map[kubetypes.MirrorPodUID]kubetypes.ResolvedPodUID)    // 返回static pod 和镜像pod 的uid对应关系

    IsMirrorPodOf(mirrorPod, pod *v1.Pod) bool     // 对比这个镜像pod和pod是否成对

    MirrorClient

}



eviction 定时检查是否有pod需要被驱逐

Manager interface {

    // 启动控制循环,以指定间隔监视驱逐阈值。  (goroutine 定时处理)  

   Start(diskInfoProvider DiskInfoProvider, podFunc ActivePodsFunc, podCleanedUpFunc PodCleanedUpFunc, monitoringInterval time.Duration)

   // 是否接受这个pod(attrs.Pod)

   // 没有条件的时候,接受

   // 当是核心pod的时候,必须接受

   // 当机器有内存压力限制的时候,不能接受没有限制的pods

   // 有磁盘压力也不能接受

   Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAdmitResult

   // 节点是否有内存,磁盘,pid压力

   IsUnderMemoryPressure() bool

   IsUnderDiskPressure() bool

   IsUnderPIDPressure() bool

}



lifecycle

// 保存pod被评估的上下文

PodAdmitAttributes struct {

    Pod *v1.Pod    // 需要被评估的pod

    OtherPods []*v1.Pod    // 所有其他的kubelet上的pods

}

// 记录pod被评估是否被接受的结果

PodAdmitResult struct {

    Admit bool    // pod是否被接收

    Reason string    // 评估未通过的理由

    Message string    // 评估未通过的详情

}



apis/core

Taint struct {     // 污染附着在节点上,对任何不能容忍污染的pod都起效

    Key string      // 污染的key

     Value string       // 污染的value

     Effect TaintEffect 

     // NoSchedule 不允许新的pod在节点上调度,除非它们容忍污染,但允许所有提交到kubelet的POD不经过调度程序启动,并且允许所有已经运行的POD继续运行。由调度程序强制执行。

      // PreferNoSchedule 和TaintEffectNoSchedule一样,但是调度器尝试不将新的pod调度到节点上,而不是禁止新的pod从节点上完全调度。由调度程序强制执行。

      // NoExecute  驱逐任何不能容忍污染的已经运行的pod。目前由NodeController强制执行。

    TimeAdded *metav1.Time       // 污染的时间,只在NoExecute时赋值

}



prober 实现了探针(probe 具体实现)

// 探针用来检查容器的生存/可读情况

prober struct {

    // 三种类型的探针

    exec execprobe.ExecProber 

    readinessHttp httprobe.HTTPProber

    livenessHttp httprobe.HTTPProber

    tcp tcprobe.TCPProber

    // 用于在容器内执行命令

    runner kubecontainer.ContainerCommandRunner

    // 所有容器的引用

    refManager *kubecontainer.RefManager

   // 用于记录事件?

    recorder record.EventRecorder

}



flowcontrol/backoff

backoffEntry struct {

    backoff time.Duration      // 间隔多久之后backoff

    lastUpdate time.Time      // 上次的更新时刻

}

Backoff struct {

    sync.Mutex

    Clock clock.Clock

    defaultDuration time.Duration       // 默认间隔

    maxDuration time.Duration       // 最大间隔

    perItemBackoff map[string]*backoffEntry

}

// (获取下一个时间间隔)如果没有初始化,或者事件时间已经超过最大间隔两倍了,需要重置 factor,重置为默认的时间间隔。如果有的话,需要把当前的间隔*2,和最大的两个值之间获取一个小的,当作下一次的时间间隔。

// 如果当前时间已经超过最大间隔的两倍了,那么删掉这个backoff

// Exited Containers that are restarted by the kubelet are restarted with an exponential back-off delay (10s, 20s, 40s …) capped at five minutes, 


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容