diff --git a/integration/restart_test.go b/integration/restart_test.go index 9cb660252bb0..767752ca01a2 100644 --- a/integration/restart_test.go +++ b/integration/restart_test.go @@ -191,6 +191,21 @@ func TestContainerdRestart(t *testing.T) { if s.id == loaded.Id { t.Logf("Checking sandbox state for '%s'", s.name) assert.Equal(t, s.state, loaded.State) + + // See https://github.com/containerd/containerd/issues/7843 for details. + // Test that CNI result and sandbox IPs are still present after restart. + if loaded.State == runtime.PodSandboxState_SANDBOX_READY { + status, info, err := SandboxInfo(loaded.Id) + require.NoError(t, err) + + // Check that the NetNS didn't close on us, that we still have + // the CNI result, and that we still have the IP we were given + // for this pod. + require.False(t, info.NetNSClosed) + require.NotNil(t, info.CNIResult) + require.NotNil(t, status.Network) + require.NotEmpty(t, status.Network.Ip) + } break } } diff --git a/pkg/cri/server/sandbox_run.go b/pkg/cri/server/sandbox_run.go index 18657a51d25a..082344022894 100644 --- a/pkg/cri/server/sandbox_run.go +++ b/pkg/cri/server/sandbox_run.go @@ -295,7 +295,8 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox // Update spec of the container containerd.UpdateContainerOpts(containerd.WithSpec(spec)), // Update sandbox metadata to include NetNS info - containerd.UpdateContainerOpts(containerd.WithContainerExtension(sandboxMetadataExtension, &sandbox.Metadata))); err != nil { + containerd.UpdateContainerOpts(containerd.WithContainerExtension(sandboxMetadataExtension, &sandbox.Metadata)), + ); err != nil { return nil, fmt.Errorf("failed to update the network namespace for the sandbox container %q: %w", id, err) } @@ -325,6 +326,14 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox return nil, fmt.Errorf("failed to setup network for sandbox %q: %w", id, err) } + // Update metadata here to save CNI result and pod IPs to disk. + if err := container.Update(ctx, + // Update sandbox metadata to include NetNS info + containerd.UpdateContainerOpts(containerd.WithContainerExtension(sandboxMetadataExtension, &sandbox.Metadata)), + ); err != nil { + return nil, fmt.Errorf("failed to update the network namespace for the sandbox container %q: %w", id, err) + } + sandboxCreateNetworkTimer.UpdateSince(netStart) }