美文网首页
从源码看kubelet的ephemeral storage数据来

从源码看kubelet的ephemeral storage数据来

作者: wwq2020 | 来源:发表于2025-09-04 08:30 被阅读0次

背景

pod无法调度,查看event是Insufficient ephemeral storage
可以通过kubectl get node <nodename>查看ephemeral storage
但是本文描述的是kubelet的ephemeral storage数据来源

源码

cmd/kubelet/app/options/options.go中


const defaultRootDir = "/var/lib/kubelet"
构建kubelet默认参数
func NewKubeletFlags() *KubeletFlags {
    return &KubeletFlags{
        ContainerRuntimeOptions: *NewContainerRuntimeOptions(),
        CertDirectory:           "/var/lib/kubelet/pki",
        RootDirectory:           filepath.Clean(defaultRootDir),
        MaxContainerCount:       -1,
        MaxPerPodContainerCount: 1,
        MinimumGCAge:            metav1.Duration{Duration: 0},
        RegisterSchedulable:     true,
        NodeLabels:              make(map[string]string),
    }
}

cmd/kubelet/app/server.go中

运行kubelet
func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Dependencies, featureGate featuregate.FeatureGate) (err error) {
    ...
    if kubeDeps.CAdvisorInterface == nil {
        imageFsInfoProvider := cadvisor.NewImageFsInfoProvider(s.ContainerRuntimeEndpoint)
        kubeDeps.CAdvisorInterface, err = cadvisor.New(imageFsInfoProvider, s.RootDirectory, cgroupRoots, cadvisor.UsingLegacyCadvisorStats(s.ContainerRuntimeEndpoint), s.LocalStorageCapacityIsolation)
        if err != nil {
            return err
        }
    }
    ...
}

pkg/kubelet/cadvisor/cadvisor_linux.go中

初始化cadvisor客户端
func New(imageFsInfoProvider ImageFsInfoProvider, rootPath string, cgroupRoots []string, usingLegacyStats, localStorageCapacityIsolation bool) (Interface, error) {
    ...
    初始化cadvisor manager
    m, err := manager.New(memory.New(statsCacheDuration, nil), sysFs, housekeepingConfig, includedMetrics, http.DefaultClient, cgroupRoots, nil /* containerEnvMetadataWhiteList */, "" /* perfEventsFile */, time.Duration(0) /*resctrlInterval*/)
    if err != nil {
        return nil, err
    }
    ...
    return &cadvisorClient{
        imageFsInfoProvider: imageFsInfoProvider,
        rootPath:            rootPath,
        Manager:             m,
    }, nil
}

获取rootfs信息
func (cc *cadvisorClient) RootFsInfo() (cadvisorapiv2.FsInfo, error) {
    return cc.GetDirFsInfo(cc.rootPath)
}

pkg/kubelet/cm/container_manager_linux.go中

获取容量
func (cm *containerManagerImpl) GetCapacity(localStorageCapacityIsolation bool) v1.ResourceList {
    ...
    rootfs, err := cm.cadvisorInterface.RootFsInfo()
    ...
    capacityWithEphemeralStorage[v1.ResourceEphemeralStorage] = cadvisor.EphemeralStorageCapacityFromFsInfo(rootfs)[v1.ResourceEphemeralStorage]
    ...
    return capacityWithEphemeralStorage
}


pkg/kubelet/kubelet_node_status.go中

设置node status
func (kl *Kubelet) defaultNodeStatusFuncs() []func(context.Context, *v1.Node) error {
    ...
    setters = append(setters,
        ...
        kl.containerManager.GetCapacity,
        ...
    )
    ...
}

相关文章

网友评论

      本文标题:从源码看kubelet的ephemeral storage数据来

      本文链接:https://www.haomeiwen.com/subject/cmmbajtx.html