Skip to content

Commit 7eda190

Browse files
dillon-giacoppodims
authored andcommitted
fix(3643) add containerd-snapshotter support
1 parent 5adb1c3 commit 7eda190

File tree

2 files changed

+46
-16
lines changed

2 files changed

+46
-16
lines changed

container/docker/factory.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525

2626
"github.com/blang/semver/v4"
2727
dockersystem "github.com/docker/docker/api/types/system"
28+
"github.com/google/cadvisor/container/containerd"
2829

2930
"github.com/google/cadvisor/container"
3031
dockerutil "github.com/google/cadvisor/container/docker/utils"
@@ -94,12 +95,13 @@ func RootDir() string {
9495
type StorageDriver string
9596

9697
const (
97-
DevicemapperStorageDriver StorageDriver = "devicemapper"
98-
AufsStorageDriver StorageDriver = "aufs"
99-
OverlayStorageDriver StorageDriver = "overlay"
100-
Overlay2StorageDriver StorageDriver = "overlay2"
101-
ZfsStorageDriver StorageDriver = "zfs"
102-
VfsStorageDriver StorageDriver = "vfs"
98+
DevicemapperStorageDriver StorageDriver = "devicemapper"
99+
AufsStorageDriver StorageDriver = "aufs"
100+
OverlayStorageDriver StorageDriver = "overlay"
101+
Overlay2StorageDriver StorageDriver = "overlay2"
102+
ContainerdSnapshotterStorageDriver StorageDriver = "overlayfs"
103+
ZfsStorageDriver StorageDriver = "zfs"
104+
VfsStorageDriver StorageDriver = "vfs"
103105
)
104106

105107
type dockerFactory struct {
@@ -108,7 +110,8 @@ type dockerFactory struct {
108110
storageDriver StorageDriver
109111
storageDir string
110112

111-
client *docker.Client
113+
client *docker.Client
114+
containerdClient containerd.ContainerdClient
112115

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

148151
handler, err = newDockerContainerHandler(
149152
client,
153+
f.containerdClient,
150154
name,
151155
f.machineInfoFactory,
152156
f.fsInfo,
@@ -349,10 +353,16 @@ func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics
349353
}
350354
}
351355

356+
containerdClient, err := containerd.Client(*containerd.ArgContainerdEndpoint, "moby")
357+
if err != nil {
358+
return fmt.Errorf("unable to create containerd client: %v", err)
359+
}
360+
352361
klog.V(1).Infof("Registering Docker factory")
353362
f := &dockerFactory{
354363
cgroupSubsystems: cgroupSubsystems,
355364
client: client,
365+
containerdClient: containerdClient,
356366
dockerVersion: dockerVersion,
357367
dockerAPIVersion: dockerAPIVersion,
358368
fsInfo: fsInfo,

container/docker/handler.go

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package docker
1717

1818
import (
19+
"encoding/json"
1920
"fmt"
2021
"os"
2122
"path"
@@ -25,13 +26,16 @@ import (
2526

2627
"github.com/google/cadvisor/container"
2728
"github.com/google/cadvisor/container/common"
29+
"github.com/google/cadvisor/container/containerd"
30+
"github.com/google/cadvisor/container/containerd/namespaces"
2831
dockerutil "github.com/google/cadvisor/container/docker/utils"
2932
containerlibcontainer "github.com/google/cadvisor/container/libcontainer"
3033
"github.com/google/cadvisor/devicemapper"
3134
"github.com/google/cadvisor/fs"
3235
info "github.com/google/cadvisor/info/v1"
3336
"github.com/google/cadvisor/zfs"
3437
"github.com/opencontainers/cgroups"
38+
"github.com/opencontainers/runtime-spec/specs-go"
3539

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

150-
rwLayerID, err := getRwLayerID(id, storageDir, storageDriver, dockerVersion)
151-
if err != nil {
152-
return nil, err
153-
}
155+
var rootfsStorageDir, zfsFilesystem, zfsParent string
156+
if storageDriver == ContainerdSnapshotterStorageDriver {
157+
ctx := namespaces.WithNamespace(context.Background(), "moby")
158+
cntr, err := containerdClient.LoadContainer(ctx, id)
159+
if err != nil {
160+
return nil, err
161+
}
154162

155-
// Determine the rootfs storage dir OR the pool name to determine the device.
156-
// For devicemapper, we only need the thin pool name, and that is passed in to this call
157-
rootfsStorageDir, zfsFilesystem, zfsParent, err := DetermineDeviceStorage(storageDriver, storageDir, rwLayerID)
158-
if err != nil {
159-
return nil, fmt.Errorf("unable to determine device storage: %v", err)
163+
var spec specs.Spec
164+
if err := json.Unmarshal(cntr.Spec.Value, &spec); err != nil {
165+
return nil, err
166+
}
167+
rootfsStorageDir = spec.Root.Path
168+
} else {
169+
rwLayerID, err := getRwLayerID(id, storageDir, storageDriver, dockerVersion)
170+
if err != nil {
171+
return nil, err
172+
}
173+
174+
// Determine the rootfs storage dir OR the pool name to determine the device.
175+
// For devicemapper, we only need the thin pool name, and that is passed in to this call
176+
rootfsStorageDir, zfsFilesystem, zfsParent, err = DetermineDeviceStorage(storageDriver, storageDir, rwLayerID)
177+
if err != nil {
178+
return nil, fmt.Errorf("unable to determine device storage: %v", err)
179+
}
160180
}
161181

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

0 commit comments

Comments
 (0)