Skip to content

Commit 85a3d88

Browse files
authored
Merge pull request #2599 from marcoverl/add-support-cvmfs-snapshotter
Add support to CernVM-FS Snapshotter
2 parents e605881 + 55987ae commit 85a3d88

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

docs/cvmfs.md

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# Lazy-pulling using CernVM-FS Snapshotter
2+
3+
CernVM-FS Snapshotter is a containerd snapshotter plugin. It is a specialized component responsible for assembling
4+
all the layers of container images into a stacked file system that containerd can use. The snapshotter takes as input the list
5+
of required layers and outputs a directory containing the final file system. It is also responsible to clean up the output
6+
directory when containers using it are stopped.
7+
8+
See the official [documentation](https://cvmfs.readthedocs.io/en/latest/cpt-containers.html#how-to-use-the-cernvm-fs-snapshotter) to learn further information.
9+
10+
## Prerequisites
11+
12+
- Install containerd remote snapshotter plugin (`cvmfs-snapshotter`) from [here](https://github.com/cvmfs/cvmfs/tree/devel/snapshotter).
13+
14+
- Add the following to `/etc/containerd/config.toml`:
15+
```toml
16+
# Ask containerd to use this particular snapshotter
17+
[plugins."io.containerd.grpc.v1.cri".containerd]
18+
snapshotter = "cvmfs-snapshotter"
19+
disable_snapshot_annotations = false
20+
21+
# Set the communication endpoint between containerd and the snapshotter
22+
[proxy_plugins]
23+
[proxy_plugins.cvmfs]
24+
type = "snapshot"
25+
address = "/run/containerd-cvmfs-grpc/containerd-cvmfs-grpc.sock"
26+
```
27+
- The default CernVM-FS repository hosting the flat root filesystems of the container images is `unpacked.cern.ch`.
28+
The container images are unpacked into the CernVM-FS repository by the [DUCC](https://cvmfs.readthedocs.io/en/latest/cpt-ducc.html)
29+
(Daemon that Unpacks Container Images into CernVM-FS) tool.
30+
You can change the repository adding the following line to `/etc/containerd-cvmfs-grpc/config.toml`:
31+
```toml
32+
repository = "myrepo.mydomain"
33+
```
34+
- Launch `containerd` and `cvmfs-snapshotter`:
35+
```console
36+
$ systemctl start containerd cvmfs-snapshotter
37+
```
38+
39+
## Enable CernVM-FS Snapshotter for `nerdctl run` and `nerdctl pull`
40+
41+
| :zap: Requirement | nerdctl >= 1.6.3 |
42+
| ----------------- | ---------------- |
43+
44+
- Run `nerdctl` with `--snapshotter cvmfs-snapshotter` as in the example below:
45+
```console
46+
$ nerdctl run -it --rm --snapshotter cvmfs-snapshotter clelange/cms-higgs-4l-full:latest
47+
```
48+
49+
- You can also only pull the image with CernVM-FS Snapshotter without running the container:
50+
```console
51+
$ nerdctl pull --snapshotter cvmfs-snapshotter clelange/cms-higgs-4l-full:latest
52+
```
53+
54+
The speedup for pulling this 9 GB (4.3 GB compressed) image is shown below:
55+
- #### with the snapshotter:
56+
```console
57+
$ nerdctl --snapshotter cvmfs-snapshotter pull clelange/cms-higgs-4l-full:latest
58+
docker.io/clelange/cms-higgs-4l-full:latest: resolved |++++++++++++++++++++++++++++++++++++++|
59+
manifest-sha256:b8acbe80629dd28d213c03cf1ffd3d46d39e573f54215a281fabce7494b3d546: done |++++++++++++++++++++++++++++++++++++++|
60+
config-sha256:89ef54b6c4fbbedeeeb29b1df2b9916b6d157c87cf1878ea882bff86a3093b5c: done |++++++++++++++++++++++++++++++++++++++|
61+
elapsed: 4.7 s total: 19.8 K (4.2 KiB/s)
62+
63+
$ nerdctl images
64+
REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE
65+
clelange/cms-higgs-4l-full latest b8acbe80629d 20 seconds ago linux/amd64 0.0 B 4.3 GiB
66+
```
67+
- #### without the snapshotter:
68+
```console
69+
$ nerdctl pull clelange/cms-higgs-4l-full:latest
70+
docker.io/clelange/cms-higgs-4l-full:latest: resolved |++++++++++++++++++++++++++++++++++++++|
71+
manifest-sha256:b8acbe80629dd28d213c03cf1ffd3d46d39e573f54215a281fabce7494b3d546: exists |++++++++++++++++++++++++++++++++++++++|
72+
config-sha256:89ef54b6c4fbbedeeeb29b1df2b9916b6d157c87cf1878ea882bff86a3093b5c: exists |++++++++++++++++++++++++++++++++++++++|
73+
layer-sha256:e8114d4b0d10b33aaaa4fbc3c6da22bbbcf6f0ef0291170837e7c8092b73840a: done |++++++++++++++++++++++++++++++++++++++|
74+
layer-sha256:a3eda0944a81e87c7a44b117b1c2e707bc8d18e9b7b478e21698c11ce3e8b819: done |++++++++++++++++++++++++++++++++++++++|
75+
layer-sha256:8f3160776e8e8736ea9e3f6c870d14cd104143824bbcabe78697315daca0b9ad: done |++++++++++++++++++++++++++++++++++++++|
76+
layer-sha256:22a5c05baa9db0aa7bba56ffdb2dd21246b9cf3ce938fc6d7bf20e92a067060e: done |++++++++++++++++++++++++++++++++++++++|
77+
layer-sha256:bfcf9d498f92b72426c9d5b73663504d87249d6783c6b58d71fbafc275349ab9: done |++++++++++++++++++++++++++++++++++++++|
78+
layer-sha256:0563e1549926b9c8beac62407bc6a420fa35bcf6f9844e5d8beeb9165325a872: done |++++++++++++++++++++++++++++++++++++++|
79+
layer-sha256:6fff5fd7fb4eeb79a1399d9508614a84191d05e53f094832062d689245599640: done |++++++++++++++++++++++++++++++++++++++|
80+
layer-sha256:25c39bfa66e1157415236703abc512d06cc1db31bd00fe8c3030c6d6d249dc4e: done |++++++++++++++++++++++++++++++++++++++|
81+
layer-sha256:3cc0a0eb55eb3fb7ef0760c6bf1e567dfc56933ba5f11b5415f89228af751b72: done |++++++++++++++++++++++++++++++++++++++|
82+
layer-sha256:a8850244786303e508b94bb31c8569310765e678c9c73bf1199310729209b803: done |++++++++++++++++++++++++++++++++++++++|
83+
layer-sha256:32cdf5fc12485ac061347eb8b5c3b4a28505ce8564a7f3f83ac4241f03911176: done |++++++++++++++++++++++++++++++++++++++|
84+
elapsed: 181.8s total: 4.3 Gi (24.2 MiB/s)
85+
86+
$ nerdctl images
87+
REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE
88+
clelange/cms-higgs-4l-full latest b8acbe80629d 4 minutes ago linux/amd64 9.0 GiB 4.3 GiB
89+
```

pkg/imgutil/snapshotter.go

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const (
3333
snapshotterNameStargz = "stargz"
3434
snapshotterNameNydus = "nydus"
3535
snapshotterNameSoci = "soci"
36+
snapshotterNameCvmfs = "cvmfs-snapshotter"
3637

3738
// prefetch size for stargz
3839
prefetchSize = 10 * 1024 * 1024
@@ -44,6 +45,7 @@ var builtinRemoteSnapshotterOpts = map[string]snapshotterOpts{
4445
snapshotterNameStargz: &remoteSnapshotterOpts{snapshotter: "stargz", extraLabels: stargzExtraLabels},
4546
snapshotterNameNydus: &remoteSnapshotterOpts{snapshotter: "nydus"},
4647
snapshotterNameSoci: &remoteSnapshotterOpts{snapshotter: "soci", extraLabels: sociExtraLabels},
48+
snapshotterNameCvmfs: &remoteSnapshotterOpts{snapshotter: "cvmfs-snapshotter"},
4749
}
4850

4951
// snapshotterOpts is used to update pull config

0 commit comments

Comments
 (0)