Skip to content

fix(3643) add containerd-snapshotter support #3709

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 17 additions & 7 deletions container/docker/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (

"github.com/blang/semver/v4"
dockersystem "github.com/docker/docker/api/types/system"
"github.com/google/cadvisor/container/containerd"

"github.com/google/cadvisor/container"
dockerutil "github.com/google/cadvisor/container/docker/utils"
Expand Down Expand Up @@ -94,12 +95,13 @@ func RootDir() string {
type StorageDriver string

const (
DevicemapperStorageDriver StorageDriver = "devicemapper"
AufsStorageDriver StorageDriver = "aufs"
OverlayStorageDriver StorageDriver = "overlay"
Overlay2StorageDriver StorageDriver = "overlay2"
ZfsStorageDriver StorageDriver = "zfs"
VfsStorageDriver StorageDriver = "vfs"
DevicemapperStorageDriver StorageDriver = "devicemapper"
AufsStorageDriver StorageDriver = "aufs"
OverlayStorageDriver StorageDriver = "overlay"
Overlay2StorageDriver StorageDriver = "overlay2"
ContainerdSnapshotterStorageDriver StorageDriver = "overlayfs"
ZfsStorageDriver StorageDriver = "zfs"
VfsStorageDriver StorageDriver = "vfs"
)

type dockerFactory struct {
Expand All @@ -108,7 +110,8 @@ type dockerFactory struct {
storageDriver StorageDriver
storageDir string

client *docker.Client
client *docker.Client
containerdClient containerd.ContainerdClient

// Information about the mounted cgroup subsystems.
cgroupSubsystems map[string]string
Expand Down Expand Up @@ -147,6 +150,7 @@ func (f *dockerFactory) NewContainerHandler(name string, metadataEnvAllowList []

handler, err = newDockerContainerHandler(
client,
f.containerdClient,
name,
f.machineInfoFactory,
f.fsInfo,
Expand Down Expand Up @@ -349,10 +353,16 @@ func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics
}
}

containerdClient, err := containerd.Client(*containerd.ArgContainerdEndpoint, "moby")
if err != nil {
return fmt.Errorf("unable to create containerd client: %v", err)
}

klog.V(1).Infof("Registering Docker factory")
f := &dockerFactory{
cgroupSubsystems: cgroupSubsystems,
client: client,
containerdClient: containerdClient,
dockerVersion: dockerVersion,
dockerAPIVersion: dockerAPIVersion,
fsInfo: fsInfo,
Expand Down
38 changes: 29 additions & 9 deletions container/docker/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package docker

import (
"encoding/json"
"fmt"
"os"
"path"
Expand All @@ -25,13 +26,16 @@ import (

"github.com/google/cadvisor/container"
"github.com/google/cadvisor/container/common"
"github.com/google/cadvisor/container/containerd"
"github.com/google/cadvisor/container/containerd/namespaces"
dockerutil "github.com/google/cadvisor/container/docker/utils"
containerlibcontainer "github.com/google/cadvisor/container/libcontainer"
"github.com/google/cadvisor/devicemapper"
"github.com/google/cadvisor/fs"
info "github.com/google/cadvisor/info/v1"
"github.com/google/cadvisor/zfs"
"github.com/opencontainers/cgroups"
"github.com/opencontainers/runtime-spec/specs-go"

docker "github.com/docker/docker/client"
"golang.org/x/net/context"
Expand Down Expand Up @@ -112,6 +116,7 @@ func getRwLayerID(containerID, storageDir string, sd StorageDriver, dockerVersio
// newDockerContainerHandler returns a new container.ContainerHandler
func newDockerContainerHandler(
client *docker.Client,
containerdClient containerd.ContainerdClient,
name string,
machineInfoFactory info.MachineInfoFactory,
fsInfo fs.FsInfo,
Expand Down Expand Up @@ -147,16 +152,31 @@ func newDockerContainerHandler(
// FIXME: Give `otherStorageDir` a more descriptive name.
otherStorageDir := path.Join(storageDir, pathToContainersDir, id)

rwLayerID, err := getRwLayerID(id, storageDir, storageDriver, dockerVersion)
if err != nil {
return nil, err
}
var rootfsStorageDir, zfsFilesystem, zfsParent string
if storageDriver == ContainerdSnapshotterStorageDriver {
ctx := namespaces.WithNamespace(context.Background(), "moby")
cntr, err := containerdClient.LoadContainer(ctx, id)
if err != nil {
return nil, err
}

// Determine the rootfs storage dir OR the pool name to determine the device.
// For devicemapper, we only need the thin pool name, and that is passed in to this call
rootfsStorageDir, zfsFilesystem, zfsParent, err := DetermineDeviceStorage(storageDriver, storageDir, rwLayerID)
if err != nil {
return nil, fmt.Errorf("unable to determine device storage: %v", err)
var spec specs.Spec
if err := json.Unmarshal(cntr.Spec.Value, &spec); err != nil {
return nil, err
}
rootfsStorageDir = spec.Root.Path
} else {
rwLayerID, err := getRwLayerID(id, storageDir, storageDriver, dockerVersion)
if err != nil {
return nil, err
}

// Determine the rootfs storage dir OR the pool name to determine the device.
// For devicemapper, we only need the thin pool name, and that is passed in to this call
rootfsStorageDir, zfsFilesystem, zfsParent, err = DetermineDeviceStorage(storageDriver, storageDir, rwLayerID)
if err != nil {
return nil, fmt.Errorf("unable to determine device storage: %v", err)
}
}

// We assume that if Inspect fails then the container is not known to docker.
Expand Down