kubernetes/kops · error
NatGateway %q has multiple addresses
Error message
NatGateway %q has multiple addresses
What it means
The NAT Gateway located via the route table exposes more than one NatGatewayAddress; kOps's ElasticIP model assumes one public IP per NAT Gateway, so the mapping is ambiguous and the find fails rather than guessing.
Source
Thrown at upup/pkg/fi/cloudup/awstasks/elastic_ip.go:87
func (e *ElasticIP) find(ctx context.Context, cloud awsup.AWSCloud) (*ElasticIP, error) {
publicIP := e.PublicIP
allocationID := e.ID
// Find via RouteTable -> NatGateway -> ElasticIP
if allocationID == nil && publicIP == nil && e.AssociatedNatGatewayRouteTable != nil {
ngw, err := findNatGatewayFromRouteTable(ctx, cloud, e.AssociatedNatGatewayRouteTable)
if err != nil {
return nil, fmt.Errorf("error finding AssociatedNatGatewayRouteTable: %v", err)
}
if ngw == nil {
klog.V(2).Infof("AssociatedNatGatewayRouteTable not found")
} else {
if len(ngw.NatGatewayAddresses) == 0 {
return nil, fmt.Errorf("NatGateway %q has no addresses", *ngw.NatGatewayId)
}
if len(ngw.NatGatewayAddresses) > 1 {
return nil, fmt.Errorf("NatGateway %q has multiple addresses", *ngw.NatGatewayId)
}
allocationID = ngw.NatGatewayAddresses[0].AllocationId
if allocationID == nil {
return nil, fmt.Errorf("NatGateway %q has nil addresses", *ngw.NatGatewayId)
} else {
klog.V(2).Infof("Found ElasticIP AllocationID %q via NatGateway", *allocationID)
}
}
}
// Find via tag on subnet
// TODO: Deprecated, because doesn't round-trip with terraform
if allocationID == nil && publicIP == nil && e.TagOnSubnet != nil && e.TagOnSubnet.ID != nil {
var filters []ec2types.Filter
filters = append(filters, awsup.NewEC2Filter("key", "AssociatedElasticIp"))
filters = append(filters, awsup.NewEC2Filter("resource-id", *e.TagOnSubnet.ID))
request := &ec2.DescribeTagsInput{View on GitHub (pinned to 4c8573c808)
Solutions
- Use a NAT Gateway with a single IP address, or reference the ElasticIP directly by allocationID/publicIP
- Recreate the model without AssociatedNatGatewayRouteTable if multiple NAT IPs are required
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at upup/pkg/fi/cloudup/awstasks/elastic_ip.go:87 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/c7be8313c40a76b1.
Report an issue: GitHub.