mirror of
https://github.com/kubernetes/kubernetes.git
synced 2026-08-05 22:50:24 +00:00
Migrate the kubelet (and the kube-proxy conntrack helper) off the full github.com/google/cadvisor module onto the lean github.com/google/cadvisor/lib: repoint info/v1+info/v2 type usage to lib/model and the manager/fs/cache/etc. consumers to lib/*; regenerate the cadvisor.Interface mocks; keep the kubelet-pinned cAdvisor global flags via lib/cadvisorflags. go.mod: require + replace github.com/google/cadvisor/lib (=> the dims/cadvisor/lib fork for now, until lib is tagged) and drop the full github.com/google/cadvisor module entirely; keep github.com/containerd/containerd/api at v1.11.0 (matching upstream master); add github.com/google/cadvisor to unwanted-dependencies.json unwantedModules so the full module cannot be re-vendored. test/e2e_node: the one remaining consumer of the full module -- the node-e2e ResourceCollector, which used the v2 HTTP client (client/v2) + v2 API types (info/v2) -- now scrapes the standalone cAdvisor pod's /api/v2.1/stats directly over HTTP+JSON, so test/e2e_node depends on no cAdvisor package. No change to the kubelet's stats surfaces.
117 lines
3.5 KiB
Go
117 lines
3.5 KiB
Go
// Copyright 2014 Google Inc. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package fs
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"sync"
|
|
|
|
mount "github.com/moby/sys/mountinfo"
|
|
"k8s.io/klog/v2"
|
|
)
|
|
|
|
// FsPlugin provides filesystem-specific statistics collection.
|
|
type FsPlugin interface {
|
|
// Name returns the plugin identifier (e.g., "zfs", "devicemapper", "vfs").
|
|
Name() string
|
|
|
|
// CanHandle returns true if this plugin handles the given filesystem type.
|
|
CanHandle(fsType string) bool
|
|
|
|
// Priority returns the plugin priority (higher = checked first).
|
|
// Allows specific plugins (zfs, btrfs) to override generic (vfs).
|
|
Priority() int
|
|
|
|
// GetStats returns filesystem statistics for a partition.
|
|
GetStats(device string, partition PartitionInfo) (*FsStats, error)
|
|
|
|
// ProcessMount optionally modifies mount info during processing.
|
|
// Returns (shouldInclude bool, modifiedMount *mount.Info, error).
|
|
ProcessMount(mnt *mount.Info) (bool, *mount.Info, error)
|
|
}
|
|
|
|
// FsCachingPlugin is an optional interface for plugins that want to cache
|
|
// stats by a key (e.g., device ID) to avoid redundant stat calls.
|
|
// This is useful for network filesystems like NFS where multiple mounts
|
|
// may point to the same underlying device.
|
|
type FsCachingPlugin interface {
|
|
FsPlugin
|
|
|
|
// CacheKey returns a cache key for the given partition.
|
|
// Stats will be cached by this key and reused for partitions with the same key.
|
|
// Return empty string to disable caching for a specific partition.
|
|
CacheKey(partition PartitionInfo) string
|
|
}
|
|
|
|
// PartitionInfo contains information needed for stats collection.
|
|
type PartitionInfo struct {
|
|
Mountpoint string
|
|
Major uint
|
|
Minor uint
|
|
FsType string
|
|
BlockSize uint
|
|
}
|
|
|
|
// FsStats contains filesystem statistics returned by plugins.
|
|
type FsStats struct {
|
|
Capacity uint64
|
|
Free uint64
|
|
Available uint64
|
|
Inodes *uint64
|
|
InodesFree *uint64
|
|
Type FsType
|
|
}
|
|
|
|
// ErrFallbackToVFS signals that a specialized plugin cannot handle
|
|
// this filesystem and VFS should be used instead.
|
|
var ErrFallbackToVFS = errors.New("fallback to VFS")
|
|
|
|
// Plugin registry (init-time registration only).
|
|
var (
|
|
pluginsLock sync.RWMutex
|
|
plugins = make(map[string]FsPlugin)
|
|
)
|
|
|
|
// RegisterPlugin registers a filesystem plugin.
|
|
// This should be called from init() functions.
|
|
func RegisterPlugin(name string, plugin FsPlugin) error {
|
|
pluginsLock.Lock()
|
|
defer pluginsLock.Unlock()
|
|
if _, found := plugins[name]; found {
|
|
return fmt.Errorf("FsPlugin %q was registered twice", name)
|
|
}
|
|
klog.V(4).Infof("Registered FsPlugin %q", name)
|
|
plugins[name] = plugin
|
|
return nil
|
|
}
|
|
|
|
// GetPluginForFsType returns the appropriate plugin for the filesystem type.
|
|
// Returns nil if no plugin can handle the filesystem type.
|
|
func GetPluginForFsType(fsType string) FsPlugin {
|
|
pluginsLock.RLock()
|
|
defer pluginsLock.RUnlock()
|
|
|
|
var best FsPlugin
|
|
for _, p := range plugins {
|
|
if p.CanHandle(fsType) {
|
|
if best == nil || p.Priority() > best.Priority() {
|
|
best = p
|
|
}
|
|
}
|
|
}
|
|
return best
|
|
}
|