Skip to content

containerd: preloaded images fail to save #21408

@nirs

Description

@nirs

What Happened?

Saving preloaded images (e.g. registry.k8s.io/pause:3.10) with containerd runtime is broken, creating empty tar. Saving images pulled into minikube works.

I suspect that the preloaded images were not prepared with contained, and their internal structure is not the same as the image pulled into the cluster by containerd.

How to reproduce:

macOS/vkfit

% minikube start --driver vfkit --container-runtime containerd
😄  minikube v1.36.0 on Darwin 15.6.1 (arm64)
✨  Using the vfkit driver based on user configuration
👍  Starting "minikube" primary control-plane node in "minikube" cluster
💾  Downloading Kubernetes v1.33.2 preload ...
    > preloaded-images-k8s-v18-v1...:  376.62 MiB / 376.62 MiB  100.00% 18.46 M
🔥  Creating vfkit VM (CPUs=2, Memory=6144MB, Disk=20000MB) ...
📦  Preparing Kubernetes v1.33.2 on containerd 1.7.23 ...
🔗  Configuring bridge CNI (Container Networking Interface) ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default


% minikube image ls
registry.k8s.io/pause:3.10
registry.k8s.io/kube-scheduler:v1.33.2
registry.k8s.io/kube-proxy:v1.33.2
registry.k8s.io/kube-controller-manager:v1.33.2
registry.k8s.io/kube-apiserver:v1.33.2
registry.k8s.io/etcd:3.5.21-0
registry.k8s.io/coredns/coredns:v1.12.0
gcr.io/k8s-minikube/storage-provisioner:v5
docker.io/kindest/kindnetd:v20250512-df8de77b

% minikube image save registry.k8s.io/pause:3.10 test.tar; echo $?
0

% file test.tar 
test.tar: empty

Linux/kvm

$ minikube start --driver kvm --network default --container-runtime containerd
😄  minikube v1.36.0 on Fedora 42 (kvm/amd64)
✨  Using the kvm2 driver based on user configuration
👍  Starting "minikube" primary control-plane node in "minikube" cluster
💾  Downloading Kubernetes v1.33.2 preload ...
    > preloaded-images-k8s-v18-v1...:  401.08 MiB / 401.08 MiB  100.00% 15.15 M
🔥  Creating kvm2 VM (CPUs=2, Memory=6144MB, Disk=20000MB) ...
📦  Preparing Kubernetes v1.33.2 on containerd 1.7.23 ...
🔗  Configuring bridge CNI (Container Networking Interface) ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

$ minikube image ls
registry.k8s.io/pause:3.10
registry.k8s.io/kube-scheduler:v1.33.2
registry.k8s.io/kube-proxy:v1.33.2
registry.k8s.io/kube-controller-manager:v1.33.2
registry.k8s.io/kube-apiserver:v1.33.2
registry.k8s.io/etcd:3.5.21-0
registry.k8s.io/coredns/coredns:v1.12.0
gcr.io/k8s-minikube/storage-provisioner:v5
docker.io/kindest/kindnetd:v20250512-df8de77b

$ minikube image save registry.k8s.io/pause:3.10 test.tar; echo $?
0

$ file test.tar 
test.tar: empty

$ minikube image save registry.k8s.io/pause:3.10 - >test.tar

$ file test.tar 
test.tar: empty

Attach the log file

log.txt

Debugging

The issue is related to the images that come from minikube preloads. If we pull new images into minikube we can save correctly.

containerd 2.1.4

Using #21409

Testing inside the guest

Saving registry.k8s.io/pause:3.10 fails:

$ sudo ctr -n k8s.io image export - registry.k8s.io/pause:3.10 >test.tar
ctr: failed to get reader: content digest sha256:75e060e453aa927883755f715daa02fb335ea7f148a8ab249f779be796d4bb7e: not found


Pulling echo server:

```console
$ sudo ctr -n k8s.io image pull docker.io/kicbase/echo-server:1.0
docker.io/kicbase/echo server:1.0       	saved	
└──index (127ac38a2bb9)                 	already exists	
   ├──manifest (42a89d9b22e5)           	already exists	
   │  └──config (ce2d2cda2d85)          	already exists	
   └──manifest (a82eba7887a4)           	complete   	|++++++++++++++++++++++++++++++++++++++|	
      └──config (9056ab77afb8)          	complete   	|++++++++++++++++++++++++++++++++++++++|	
application/vnd.docker.distribution.manifest.list.v2+json sha256:127ac38a2bb9537b7f252addff209ea6801edcac8a92c8b1104dacd66a583ed6
Completed pull from OCI Registry (docker.io/kicbase/echo-server:1.0)	elapsed: 2.9 s	total:  4.1 Ki	(1.4 KiB/s)

Saving echo server

$ sudo ctr -n k8s.io image export echo-server-1.0.tar docker.io/kicbase/echo-server:1.0

$ tar tf echo-server-1.0.tar 
blobs/
blobs/sha256/
blobs/sha256/127ac38a2bb9537b7f252addff209ea6801edcac8a92c8b1104dacd66a583ed6
blobs/sha256/42a89d9b22e5307cb88494990d5d929c401339f508c0a7e98a4d8ac52623fc5b
blobs/sha256/ac2c07efdce850736ed8e7b9c3bc15e251d808fc43b9eeeb88797be0def23730
blobs/sha256/ce2d2cda2d858fdaea84129deb86d18e5dbf1c548f230b79fdca74cc91729d17
index.json
manifest.json
oci-layout

Saving from host

% minikube image ls | grep docker.io/kicbase/echo-server:1.0
docker.io/kicbase/echo-server:1.0

% minikube image save docker.io/kicbase/echo-server:1.0 echo-server-1.0.tar

% tar tf echo-server-1.0.tar 
blobs/
blobs/sha256/
blobs/sha256/127ac38a2bb9537b7f252addff209ea6801edcac8a92c8b1104dacd66a583ed6
blobs/sha256/42a89d9b22e5307cb88494990d5d929c401339f508c0a7e98a4d8ac52623fc5b
blobs/sha256/ac2c07efdce850736ed8e7b9c3bc15e251d808fc43b9eeeb88797be0def23730
blobs/sha256/ce2d2cda2d858fdaea84129deb86d18e5dbf1c548f230b79fdca74cc91729d17
index.json
manifest.json
oci-layout

containerd 1.17.23

Using #21405

Saving inside the guest

Saving pause image fails

$ sudo ctr -n k8s.io image export pause.tar registry.k8s.io/pause:3.10
ctr: failed to get reader: content digest sha256:75e060e453aa927883755f715daa02fb335ea7f148a8ab249f779be796d4bb7e: not found

Pulling echo server:

$ sudo ctr -n k8s.io image pull docker.io/kicbase/echo-server:1.0
docker.io/kicbase/echo-server:1.0:                                                resolved       |++++++++++++++++++++++++++++++++++++++| 
index-sha256:127ac38a2bb9537b7f252addff209ea6801edcac8a92c8b1104dacd66a583ed6:    done           |++++++++++++++++++++++++++++++++++++++| 
manifest-sha256:42a89d9b22e5307cb88494990d5d929c401339f508c0a7e98a4d8ac52623fc5b: done           |++++++++++++++++++++++++++++++++++++++| 
config-sha256:ce2d2cda2d858fdaea84129deb86d18e5dbf1c548f230b79fdca74cc91729d17:   done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:ac2c07efdce850736ed8e7b9c3bc15e251d808fc43b9eeeb88797be0def23730:    done           |++++++++++++++++++++++++++++++++++++++| 
elapsed: 3.4 s                                                                    total:  2.4 Ki (725.0 B/s)                                       
unpacking linux/arm64/v8 sha256:127ac38a2bb9537b7f252addff209ea6801edcac8a92c8b1104dacd66a583ed6...
done: 33.646725ms	

Saving echo server:

$ sudo ctr -n k8s.io image export echo-server-1.0.tar docker.io/kicbase/echo-server:1.0

$ tar tf echo-server-1.0.tar 
blobs/
blobs/sha256/
blobs/sha256/127ac38a2bb9537b7f252addff209ea6801edcac8a92c8b1104dacd66a583ed6
blobs/sha256/42a89d9b22e5307cb88494990d5d929c401339f508c0a7e98a4d8ac52623fc5b
blobs/sha256/ac2c07efdce850736ed8e7b9c3bc15e251d808fc43b9eeeb88797be0def23730
blobs/sha256/ce2d2cda2d858fdaea84129deb86d18e5dbf1c548f230b79fdca74cc91729d17
index.json
manifest.json
oci-layout

Saving in the host

% minikube image ls | grep docker.io/kicbase/echo-server:1.0               
docker.io/kicbase/echo-server:1.0

% minikube image save docker.io/kicbase/echo-server:1.0 echo-server-1.0.tar

% tar tf echo-server-1.0.tar
blobs/
blobs/sha256/
blobs/sha256/127ac38a2bb9537b7f252addff209ea6801edcac8a92c8b1104dacd66a583ed6
blobs/sha256/42a89d9b22e5307cb88494990d5d929c401339f508c0a7e98a4d8ac52623fc5b
blobs/sha256/ac2c07efdce850736ed8e7b9c3bc15e251d808fc43b9eeeb88797be0def23730
blobs/sha256/ce2d2cda2d858fdaea84129deb86d18e5dbf1c548f230b79fdca74cc91729d17
index.json
manifest.json
oci-layout

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugCategorizes issue or PR as related to a bug.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions