背景
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,
...
)
...
}
网友评论