kubernetes/kops · error

metal::IdentifyNode not implemented

Error message

metal::IdentifyNode not implemented

What it means

The metal (Equinix Metal / Packet) nodeidentity Identifier is a stub: New() constructs the identifier successfully, but IdentifyNode always returns an 'not implemented' error. The package exists as a placeholder in the nodeidentity framework but performs no actual node lookup.

Source

Thrown at pkg/nodeidentity/metal/identify.go:38

	"context"
	"fmt"

	corev1 "k8s.io/api/core/v1"
	"k8s.io/kops/pkg/nodeidentity"
)

// nodeIdentifier identifies a node in a bare-metal cloud
type nodeIdentifier struct {
}

// New creates and returns a nodeidentity.Identifier for Nodes running on bare metal
func New() (nodeidentity.Identifier, error) {
	return &nodeIdentifier{}, nil
}

// IdentifyNode returns the node identity information
func (i *nodeIdentifier) IdentifyNode(ctx context.Context, node *corev1.Node) (*nodeidentity.Info, error) {
	return nil, fmt.Errorf("metal::IdentifyNode not implemented")
}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Do not use the metal nodeidentifier for identity lookups; implement or substitute an identifier (e.g. based on the metal CCM) that resolves node identity
  2. Check the kOps issue tracker / upstream for metal nodeidentity support and upgrade to a version that implements it
  3. Provide identity info out-of-band (labels/taints set by the metal cloud controller) instead of calling IdentifyNode

Example fix

// before
id, err := metalIdentifier.IdentifyNode(ctx, node) // always errors
// after
// use a provider with an implemented identifier, or contribute an implementation in pkg/nodeidentity/metal/identify.go
Defensive patterns

Strategy: fallback

Validate before calling

// Feature-check: metal IdentifyNode is a stub that always errors; avoid calling it.
// Route metal-cluster nodes to an implemented identifier instead.

Type guard

func identifierImplemented(id nodeidentity.Identifier) bool {
    // The metal identifier is known-unimplemented; treat it as absent.
    return id != nil // caller must additionally special-case pkg/nodeidentity/metal
}

Try / catch

info, err := identifier.IdentifyNode(ctx, node)
if err != nil && strings.Contains(err.Error(), "not implemented") {
    // fall back to provider-agnostic identity (labels/annotations)
    info = fallbackIdentityFromNode(node)
}

Prevention

When it happens

Trigger: Any call to nodeidentity/metal's Identifier.IdentifyNode, i.e. running the cloud-controller / node-authorizer identity flow against nodes of a bare-metal cluster using this identifier.

Common situations: Deploying kOps components that depend on node identity lookup on an Equinix Metal cluster where the metal identifier has never been implemented; selecting the metal provider in a code path expecting IdentifyNode to work.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/44a8a9a6c4b1957b. Report an issue: GitHub.