containerd/stargz-snapshotter

GitHub: containerd/stargz-snapshotter

Stargz Snapshotter 是 containerd 的快照插件,通过 eStargz 镜像格式实现延迟拉取,让容器无需等待镜像完整下载即可按需启动,大幅缩短容器启动时间。

Stars: 1569 | Forks: 155

[[⬇️ **下载**]](https://github.com/containerd/stargz-snapshotter/releases) [[📔**浏览镜像**]](./docs/pre-converted-images.md) [[☸**快速开始**]](#quick-start-with-kubernetes) [[🤓**快速开始**]](https://github.com/containerd/nerdctl/blob/master/docs/stargz.md) [[🔆**安装**]](./docs/INSTALL.md) # Stargz Snapshotter [![测试状态](https://static.pigsec.cn/wp-content/uploads/repos/cas/c7/c719263266358fdd8a1c44525b9c6c2b8c2b2f3224bc0767bc503767aed57290.svg)](https://github.com/containerd/stargz-snapshotter/actions?query=workflow%3ATests+branch%3Amain) [![性能测试](https://static.pigsec.cn/wp-content/uploads/repos/cas/ed/ed0150063859a211f1bda09248aa654310b6e37c458bdbf070b181e40c0b1a25.svg)](https://github.com/containerd/stargz-snapshotter/actions?query=workflow%3ABenchmark+branch%3Amain) [![每日构建](https://static.pigsec.cn/wp-content/uploads/repos/cas/35/35b1fffc11603b8c300fe0bee804108f6e338cc1dcbb873b7fd674fca110960c.svg)](https://github.com/containerd/stargz-snapshotter/actions?query=workflow%3ANightly+branch%3Amain) 另请阅读介绍博客:[在 Containerd 上通过延迟镜像分发实现闪电般启动容器](https://medium.com/nttlabs/startup-containers-in-lightning-speed-with-lazy-image-distribution-on-containerd-243d94522361) 拉取镜像是容器生命周期中比较耗时的步骤之一。 研究表明,拉取操作所花费的时间占容器启动时间的 76%[[FAST '16]](https://www.usenix.org/node/194431)。 *Stargz Snapshotter* 是 snapshotter 的一种实现,旨在通过*延迟拉取*来解决此问题。 这里的*延迟拉取*是指容器无需等待镜像拉取完成即可运行,并且会*按需*获取镜像所需的 chunks。 [*eStargz*](/docs/stargz-estargz.md) 是本项目提出的一种支持延迟拉取的镜像格式。 它兼容 [OCI](https://github.com/opencontainers/image-spec/)/[Docker](https://github.com/moby/moby/blob/master/image/spec/v1.2.md) 镜像,因此可以推送到标准的容器镜像仓库(例如 ghcr.io),并且即使在包括 Docker 在内的不支持 eStargz 的 runtime 上也*仍然可以运行*。 eStargz 格式基于 [CRFS 的 stargz 镜像格式](https://github.com/google/crfs),但具有 runtime 优化和内容校验等附加功能。 下面的直方图是在 GitHub Actions 上使用 GitHub Container Registry 测量的几个容器启动时间的性能测试结果。 The benchmarking result on ecdb227 `legacy` 展示了当我们使用 containerd 的默认 snapshotter(`overlayfs`)以及从 `docker.io/library` 复制且未经过优化的镜像时的启动性能。 对于此配置,containerd 会拉取整个镜像内容,`pull` 操作也会相应地消耗时间。 当我们使用带有 eStargz 转换镜像但未进行任何优化的 stargz snapshotter(`estargz-noopt`)时,我们看到 `pull` 操作的性能有所提升,因为 containerd 可以在容器启动时无需等待 `pull` 完成,并按需获取镜像必要的 chunks。 但同时,我们看到 `run` 操作出现了性能下降,因为每次访问文件都需要额外花费时间从 registry 获取它们。 当我们使用[优化后的 eStargz](/docs/ctr-remote.md)(`estargz`)时,我们可以缓解在 `estargz-noopt` 镜像中观察到的性能下降。 这是因为 [stargz snapshotter 在运行容器期间会预取并缓存*可能被访问的文件*](/docs/stargz-estargz.md)。 在首次创建容器时,stargz snapshotter 会等待预取完成,因此 `create` 有时会比其他类型的镜像花费更长的时间。 但这仍然比等待下载所有层的所有文件要快。 上面的直方图是[在 `ecdb227` 提交上的性能测试结果](https://github.com/containerd/stargz-snapshotter/actions/runs/398606060)。 我们会不断测量此 snapshotter 的性能,因此您可以通过本文档顶部显示的徽章获取最新结果。 请注意,由于互联网上的网络状况以及 GitHub Actions 中实例的位置等因素,我们有时会看到结果存在差异。 我们的性能测试方法基于 [HelloBench](https://github.com/Tintri/hello-bench)。 :nerd_face: 您也可以使用延迟拉取在 IPFS 上运行容器。这是一项实验性功能。有关更多详细信息,请参阅 [`./docs/ipfs.md`](./docs/ipfs.md)。 Stargz Snapshotter 是 containerd 的一个**非核心**子项目。 ## 快速开始 - 有关 stargz snapshotter 插件及其配置的更多详细信息,请参阅 [Containerd Stargz Snapshotter 插件概述](/docs/overview.md)。 - 有关使用 containerd、CRI-O、Podman、systemd 等设置 eStargz 延迟拉取的更多详细信息,请参阅[安装 Stargz Snapshotter 和 Stargz Store](./docs/INSTALL.md)。 - 有关 eStargz 与社区工具集成状态的更多详细信息,请参阅 [eStargz 与其他工具的集成](./docs/integration.md) 要在 kubernetes 节点上使用 stargz snapshotter,您需要对 containerd 进行以下配置,并在节点上运行 stargz snapshotter daemon。 我们假设您使用 containerd(> v1.4.2)作为 CRI runtime。 ``` version = 2 # 将 stargz snapshotter 插入到 containerd 中 # Containerd 通过指定的 socket 地址识别 stargz snapshotter。 # 下面指定的地址是 stargz snapshotter 监听的默认地址。 [proxy_plugins] [proxy_plugins.stargz] type = "snapshot" address = "/run/containerd-stargz-grpc/containerd-stargz-grpc.sock" [proxy_plugins.stargz.exports] root = "/var/lib/containerd-stargz-grpc/" # 通过 CRI 使用 stargz snapshotter [plugins."io.containerd.grpc.v1.cri".containerd] snapshotter = "stargz" disable_snapshot_annotations = false ``` 您可以尝试我们[预构建的](/Dockerfile) [KinD](https://github.com/kubernetes-sigs/kind) 节点镜像,其中包含上述配置。 ``` $ kind create cluster --name stargz-demo --image ghcr.io/containerd/stargz-snapshotter:0.12.1-kind ``` :information_source: 对于 `ghcr.io/containerd/stargz-snapshotter:0.12.1-kind`,建议使用 kind 二进制文件 v0.16.x 或更高版本。 :information_source: 您可以从 [`ghcr.io/containerd/stargz-snapshotter:${VERSION}-kind`](https://github.com/orgs/containerd/packages/container/package/stargz-snapshotter) 命名空间获取最新的节点镜像。 然后您可以在集群上创建 eStargz pod。 在此示例中,我们创建一个转换过的 stargz Node.js pod(`ghcr.io/stargz-containers/node:17.8.0-esgz`)作为演示。 ``` apiVersion: v1 kind: Pod metadata: name: nodejs spec: containers: - name: nodejs-stargz image: ghcr.io/stargz-containers/node:17.8.0-esgz command: ["node"] args: - -e - var http = require('http'); http.createServer(function(req, res) { res.writeHead(200); res.end('Hello World!\n'); }).listen(80); ports: - containerPort: 80 ``` 以下命令从 GitHub Container Registry 延迟拉取 `ghcr.io/stargz-containers/node:17.8.0-esgz` 并创建 pod,因此所花费的时间比原始镜像 `library/node:13.13` 更短。 ``` $ kubectl --context kind-stargz-demo apply -f stargz-pod.yaml && kubectl --context kind-stargz-demo get po nodejs -w $ kubectl --context kind-stargz-demo port-forward nodejs 8080:80 & $ curl 127.0.0.1:8080 Hello World! ``` Stargz snapshotter 还支持[更多配置](/docs/overview.md),包括私有 registry 身份验证、镜像仓库等。 ## 获取 eStargz 镜像 - 有关镜像转换器 `ctr-remote` 的更多示例和详细信息,请参阅[使用 `ctr-remote image optimize` 优化镜像](/docs/ctr-remote.md)。 - 有关 eStargz 格式的更多详细信息,请参阅 [eStargz:用于延迟拉取容器镜像的 Tar.gz 层的标准兼容扩展](/docs/stargz-estargz.md) 要实现延迟拉取镜像,您首先需要准备 eStargz 镜像。 有几种方法可以实现这一目标。 本节介绍其中的一些方法。 ### 尝试预构建的 eStargz 镜像 您可以尝试我们在 [尝试预转换的镜像](/docs/pre-converted-images.md) 中列出的、位于 ghcr.io 上的预转换 eStargz 镜像。 ### 使用 BuildKit 构建 eStargz 镜像 BuildKit 自 v0.10 版本起支持构建 eStargz 镜像。 您可以使用 [Docker Buildx](https://docs.docker.com/buildx/working-with-buildx/) 进行尝试。 以下命令构建一个 eStargz 镜像并将其推送到 `ghcr.io/ktock/hello:esgz`。 Flags `oci-mediatypes=true,compression=estargz` 用于启用 eStargz 的构建。 ``` $ docker buildx build -t ghcr.io/ktock/hello:esgz \ -o type=registry,oci-mediatypes=true,compression=estargz,force-compression=true \ /tmp/buildctx/ ``` 支持 eStargz 的 BuildKit(v0.10)将[包含在 Docker v22.XX 中](https://github.com/moby/moby/blob/v22.06.0-beta.0/vendor.mod#L51),但是您可以使用 Buildx 的 [driver](https://github.com/docker/buildx/blob/master/docs/reference/buildx_create.md#-set-the-builder-driver-to-use---driver) 功能在之前的版本中构建 eStargz 镜像。 您可以使用 [`docker buildx create`](https://docs.docker.com/engine/reference/commandline/buildx_create/) 启用特定版本的 BuildKit(此示例指定了 `v0.10.3`)。 ``` $ docker buildx create --use --name v0.10.3 --driver docker-container --driver-opt image=moby/buildkit:v0.10.3 $ docker buildx inspect --bootstrap v0.10.3 ``` ### 使用 Kaniko 构建 eStargz 镜像 [Kaniko](https://github.com/GoogleContainerTools/kaniko) 是一种可以在容器和 Kubernetes 中运行的镜像构建器。 从 v1.5.0 版本开始,它实验性地支持构建 eStargz。 需要设置 `GGCR_EXPERIMENT_ESTARGZ=1`。 ``` $ docker run --rm -e GGCR_EXPERIMENT_ESTARGZ=1 \ -v /tmp/buildctx:/workspace -v ~/.docker/config.json:/kaniko/.docker/config.json:ro \ gcr.io/kaniko-project/executor:v1.8.1 --destination ghcr.io/ktock/hello:esgz ``` ### 使用 nerdctl 构建 eStargz 镜像 [nerdctl](https://github.com/containerd/nerdctl) 是兼容 Docker 的 containerd CLI,支持构建 eStargz 镜像。 ``` $ nerdctl build -t ghcr.io/ktock/hello:1 /tmp/buildctx $ nerdctl image convert --estargz --oci ghcr.io/ktock/hello:1 ghcr.io/ktock/hello:esgz $ nerdctl push ghcr.io/ktock/hello:esgz ``` 有关更多信息(例如延迟拉取)的更多详细信息,请参阅 nerdctl 文档:https://github.com/containerd/nerdctl/blob/master/docs/stargz.md ### 使用 `ctr-remote` 创建 eStargz 镜像 [`ctr-remote`](/docs/ctr-remote.md) 允许将镜像转换为经过优化的 eStargz。 如上面的性能测试结果所示,按需的延迟拉取提高了 pull 的性能,但由于读取文件会引发远程下载内容,因此会导致 runtime 的性能下降。 为了解决这个问题,`ctr-remote` 具有针对镜像的*基于工作负载*的优化。 为了尝试本节中描述的示例,您还可以使用基于 docker-compose 的演示环境。 您可以使用以下命令设置此环境(将此仓库放在 `${GOPATH}/src/github.com/containerd/stargz-snapshotter` 中)。 *请注意,这会在您的主机上运行特权容器。* ``` $ cd ${GOPATH}/src/github.com/containerd/stargz-snapshotter/script/demo $ docker-compose build containerd_demo $ docker-compose up -d $ docker exec -it containerd_demo /bin/bash (inside container) # ./script/demo/run.sh ``` 以下示例将传统的 `library/ubuntu:20.04` 镜像转换为 eStargz。 该命令还针对在 `/bin/bash` 上执行 `ls` 的工作负载优化了镜像。 实际执行的操作是在临时容器中运行指定的工作负载,并记录所有文件访问,同时在 runtime 期间将它们标记为*可能被访问*。 转换后的镜像仍然是 **docker 兼容**的,因此您可以在不支持 eStargz 的 runtime(例如 Docker)上运行它。 ``` # ctr-remote image pull docker.io/library/ubuntu:20.04 # ctr-remote image optimize --oci --entrypoint='[ "/bin/bash", "-c" ]' --args='[ "ls" ]' docker.io/library/ubuntu:20.04 registry2:5000/ubuntu:20.04 # ctr-remote image push --plain-http registry2:5000/ubuntu:20.04 ``` 最后,以下命令清除本地缓存,然后延迟拉取 eStargz 镜像。 Stargz snapshotter 会预取在优化后的工作负载中最可能被访问的文件,这有望提高该工作负载的缓存命中率,并缓解 runtime 开销,如本文档顶部的性能测试结果所示。 ``` # ctr-remote image rm --sync registry2:5000/ubuntu:20.04 # ctr-remote images rpull --plain-http registry2:5000/ubuntu:20.04 fetching sha256:610399d1... application/vnd.oci.image.index.v1+json fetching sha256:0b4a26b4... application/vnd.oci.image.manifest.v1+json fetching sha256:8d8d9dbe... application/vnd.oci.image.config.v1+json # ctr-remote run --rm -t --snapshotter=stargz registry2:5000/ubuntu:20.04 test /bin/bash root@8eabb871a9bd:/# ls bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var ``` ## 将 Stargz Snapshotter 作为 go module 导入 目前,Stargz Snapshotter 仓库包含以下两个 Go module,并且它们都需要被导入。 - `github.com/containerd/stargz-snapshotter` - `github.com/containerd/stargz-snapshotter/estargz` 请确保您同时导入了它们,并且它们都指向*相同的提交版本*。 ## 项目详情 Stargz Snapshotter 是 containerd 的**非核心**子项目,采用 [Apache 2.0 许可证](./LICENSE)授权。 作为 containerd 的非核心子项目,您可以在我们的 [`containerd/project`](https://github.com/containerd/project) 仓库中找到以下信息: * [项目治理](https://github.com/containerd/project/blob/main/GOVERNANCE.md), * [维护者](./MAINTAINERS), * 和[贡献指南](https://github.com/containerd/project/blob/main/CONTRIBUTING.md)
标签:EVTX分析, 子域名突变, 日志审计, 请求拦截