diff --git a/cmd/kubeadm/app/util/runtime/runtime.go b/cmd/kubeadm/app/util/runtime/runtime.go index 4b6800e583f..3f833e9b6de 100644 --- a/cmd/kubeadm/app/util/runtime/runtime.go +++ b/cmd/kubeadm/app/util/runtime/runtime.go @@ -229,8 +229,15 @@ func pullImagesInParallelImpl(images []string, ifNotPresent bool, func (runtime *CRIRuntime) ImageExists(image string) bool { ctx, cancel := defaultContext() defer cancel() - _, err := runtime.impl.ImageStatus(ctx, runtime.imageService, &runtimeapi.ImageSpec{Image: image}, false) - return err == nil + resp, err := runtime.impl.ImageStatus(ctx, runtime.imageService, &runtimeapi.ImageSpec{Image: image}, false) + if err != nil { + klog.Warningf("Failed to get image status, image: %q, error: %v", image, err) + return false + } + if resp == nil || resp.Image == nil { + return false + } + return true } // detectCRISocketImpl is separated out only for test purposes, DON'T call it directly, use DetectCRISocket instead diff --git a/cmd/kubeadm/app/util/runtime/runtime_test.go b/cmd/kubeadm/app/util/runtime/runtime_test.go index e7c2652662e..aa9de6e0c63 100644 --- a/cmd/kubeadm/app/util/runtime/runtime_test.go +++ b/cmd/kubeadm/app/util/runtime/runtime_test.go @@ -319,7 +319,12 @@ func TestImageExists(t *testing.T) { prepare func(*fakeImpl) }{ { - name: "valid", + name: "valid", + prepare: func(mock *fakeImpl) { + mock.ImageStatusReturns(&v1.ImageStatusResponse{ + Image: &v1.Image{}, + }, nil) + }, expected: true, }, {