Log a warning if a ImagePullSecrets does not exist

This commit is contained in:
Tomas Tormo 2023-05-11 08:03:20 +00:00
parent 6aa68d6a8b
commit 123845da88
3 changed files with 63 additions and 3 deletions

View File

@ -876,6 +876,7 @@ func (kl *Kubelet) makePodDataDirs(pod *v1.Pod) error {
// secrets. // secrets.
func (kl *Kubelet) getPullSecretsForPod(pod *v1.Pod) []v1.Secret { func (kl *Kubelet) getPullSecretsForPod(pod *v1.Pod) []v1.Secret {
pullSecrets := []v1.Secret{} pullSecrets := []v1.Secret{}
failedPullSecrets := []string{}
for _, secretRef := range pod.Spec.ImagePullSecrets { for _, secretRef := range pod.Spec.ImagePullSecrets {
if len(secretRef.Name) == 0 { if len(secretRef.Name) == 0 {
@ -886,12 +887,17 @@ func (kl *Kubelet) getPullSecretsForPod(pod *v1.Pod) []v1.Secret {
secret, err := kl.secretManager.GetSecret(pod.Namespace, secretRef.Name) secret, err := kl.secretManager.GetSecret(pod.Namespace, secretRef.Name)
if err != nil { if err != nil {
klog.InfoS("Unable to retrieve pull secret, the image pull may not succeed.", "pod", klog.KObj(pod), "secret", klog.KObj(secret), "err", err) klog.InfoS("Unable to retrieve pull secret, the image pull may not succeed.", "pod", klog.KObj(pod), "secret", klog.KObj(secret), "err", err)
failedPullSecrets = append(failedPullSecrets, secretRef.Name)
continue continue
} }
pullSecrets = append(pullSecrets, *secret) pullSecrets = append(pullSecrets, *secret)
} }
if len(failedPullSecrets) > 0 {
kl.recorder.Eventf(pod, v1.EventTypeWarning, "FailedToRetrieveImagePullSecret", "Unable to retrieve image pull secrets %s, the image pull may not succeed.", strings.Join(failedPullSecrets, ", "))
}
return pullSecrets return pullSecrets
} }

View File

@ -54,6 +54,7 @@ import (
"k8s.io/kubernetes/pkg/kubelet/cri/streaming/remotecommand" "k8s.io/kubernetes/pkg/kubelet/cri/streaming/remotecommand"
"k8s.io/kubernetes/pkg/kubelet/metrics" "k8s.io/kubernetes/pkg/kubelet/metrics"
"k8s.io/kubernetes/pkg/kubelet/prober/results" "k8s.io/kubernetes/pkg/kubelet/prober/results"
"k8s.io/kubernetes/pkg/kubelet/secret"
"k8s.io/kubernetes/pkg/kubelet/status" "k8s.io/kubernetes/pkg/kubelet/status"
kubetypes "k8s.io/kubernetes/pkg/kubelet/types" kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
netutils "k8s.io/utils/net" netutils "k8s.io/utils/net"
@ -5396,3 +5397,33 @@ func testMetric(t *testing.T, metricName string, expectedMetric string) {
t.Error(err) t.Error(err)
} }
} }
func TestGetNonExistentImagePullSecret(t *testing.T) {
secrets := make([]*v1.Secret, 0)
fakeRecorder := record.NewFakeRecorder(1)
testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */)
testKubelet.kubelet.recorder = fakeRecorder
testKubelet.kubelet.secretManager = secret.NewFakeManagerWithSecrets(secrets)
defer testKubelet.Cleanup()
expectedEvent := "Warning FailedToRetrieveImagePullSecret Unable to retrieve image pull secrets secretFoo, the image pull may not succeed."
testPod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: "nsFoo",
Name: "podFoo",
Annotations: map[string]string{},
},
Spec: v1.PodSpec{
ImagePullSecrets: []v1.LocalObjectReference{
{Name: "secretFoo"},
},
},
}
pullSecrets := testKubelet.kubelet.getPullSecretsForPod(testPod)
assert.Equal(t, 0, len(pullSecrets))
assert.Equal(t, 1, len(fakeRecorder.Events))
event := <-fakeRecorder.Events
assert.Equal(t, event, expectedEvent)
}

View File

@ -16,11 +16,16 @@ limitations under the License.
package secret package secret
import v1 "k8s.io/api/core/v1" import (
"fmt"
v1 "k8s.io/api/core/v1"
)
// fakeManager implements Manager interface for testing purposes. // fakeManager implements Manager interface for testing purposes.
// simple operations to apiserver. // simple operations to apiserver.
type fakeManager struct { type fakeManager struct {
secrets []*v1.Secret
} }
// NewFakeManager creates empty/fake secret manager // NewFakeManager creates empty/fake secret manager
@ -28,11 +33,29 @@ func NewFakeManager() Manager {
return &fakeManager{} return &fakeManager{}
} }
// GetSecret returns a nil secret for testing // NewFakeManagerWithSecrets creates a fake secret manager with the provided secrets
func NewFakeManagerWithSecrets(secrets []*v1.Secret) Manager {
return &fakeManager{
secrets: secrets,
}
}
// GetSecret function returns the searched secret if it was provided during the manager initialization, otherwise, it returns an error.
// If the manager was initialized without any secrets, it returns a nil secret."
func (s *fakeManager) GetSecret(namespace, name string) (*v1.Secret, error) { func (s *fakeManager) GetSecret(namespace, name string) (*v1.Secret, error) {
if s.secrets == nil {
return nil, nil return nil, nil
} }
for _, secret := range s.secrets {
if secret.Name == name {
return secret, nil
}
}
return nil, fmt.Errorf("secret %s not found", name)
}
// RegisterPod implements the RegisterPod method for testing purposes. // RegisterPod implements the RegisterPod method for testing purposes.
func (s *fakeManager) RegisterPod(pod *v1.Pod) { func (s *fakeManager) RegisterPod(pod *v1.Pod) {
} }