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,
网友评论