kubernetes/kops · error
unable to find secret %q for mirror
Error message
unable to find secret %q for mirror
What it means
MirrorTo lists secret names via ListSecrets(), then immediately re-reads each with FindSecret(). FindSecret returns (nil, nil) when the file does not exist (IsNotExist maps to nil). If a listed secret disappears between listing and reading, MirrorTo treats it as an inconsistency and returns 'unable to find secret %q for mirror' rather than silently skipping it.
Source
Thrown at upup/pkg/fi/secrets/vfs_secretstore.go:69
if basedir.Path() == c.basedir.Path() {
klog.V(2).Infof("Skipping mirror of secret store from %q to %q (same path)", c.basedir, basedir)
return nil
}
klog.V(2).Infof("Mirroring secret store from %q to %q", c.basedir, basedir)
secrets, err := c.ListSecrets()
if err != nil {
return fmt.Errorf("error listing secrets for mirror: %v", err)
}
for _, name := range secrets {
secret, err := c.FindSecret(name)
if err != nil {
return fmt.Errorf("error reading secret %q for mirror: %v", name, err)
}
if secret == nil {
return fmt.Errorf("unable to find secret %q for mirror", name)
}
p := BuildVfsSecretPath(basedir, name)
acl, err := acls.GetACL(ctx, p, c.cluster)
if err != nil {
return fmt.Errorf("error building acl for secret %q for mirror: %v", name, err)
}
klog.Infof("mirroring secret %s -> %s", name, p)
err = createSecret(ctx, secret, p, acl, true)
if err != nil {
return fmt.Errorf("error writing secret %q for mirror: %v", name, err)
}
}
return nilView on GitHub (pinned to 4c8573c808)
Solutions
- Re-run the mirror; the transient race usually resolves
- Ensure only one kops process mutates the state store at a time
- Inspect the secrets prefix for non-file entries or stale objects and remove them
- If the secret was intentionally deleted, the listing is stale — retry after the deletion propagates
Defensive patterns
Strategy: retry
Validate before calling
// Ensure stable listing: list twice and require identical sets before mirroring
first, _ := store.ListSecrets()
second, _ := store.ListSecrets()
if !reflect.DeepEqual(first, second) { return errors.New("secrets store is changing; retry later") } Try / catch
for attempt := 0; attempt < 3; attempt++ {
err := store.MirrorTo(ctx, target)
if err == nil || !strings.Contains(err.Error(), "unable to find secret") { return err }
time.Sleep(2 * time.Second)
}
return errors.New("mirror kept racing with concurrent mutation") Prevention
- Serialize state-store mutations (lock or single operator)
- Do not delete secrets while mirroring
- Use FindSecret() semantics if you want skip-if-deleted behavior instead of hard failure
- Clean non-file entries out of the secrets prefix
When it happens
Trigger: A secret file is deleted (or the listing includes a directory/placeholder entry that is not a readable file) between ReadDir and the subsequent FindSecret read, or another concurrent kops process removed it.
Common situations: Two kops commands operating on the same state store concurrently (one pruning secrets while another mirrors), stale S3/GCS eventual-consistency edge cases, or a hand-cleaned secrets directory where a non-secret entry (e.g. directory) appeared in the listing.
Related errors
- error listing secrets for mirror: %v
- error reading secret %q for mirror: %v
- error building acl for secret %q for mirror: %v
- error writing secret %q for mirror: %v
- error loading secret %q: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/7ce19cf0a1412dbd.
Report an issue: GitHub.