cloud provider: add zone/region to InstanceMetadata

The existing Zones interface was mainly created for the kubelet
to interface with a local metadata server to fetch a node's zone
and region. With external cloud providers, it makes more sense for
the zone/region logic to be coupled to the Instances interface.
This commit adds zone/region information to the recently added
InstanceMetadata type we're using as part of the new InstancesV2
interface in the cloud provider.

Signed-off-by: Andrew Sy Kim <kim.andrewsy@gmail.com>
This commit is contained in:
Andrew Sy Kim 2020-08-06 15:40:15 -04:00
parent f5334fad48
commit d274971ff9
3 changed files with 60 additions and 29 deletions

View File

@ -294,4 +294,15 @@ type InstanceMetadata struct {
// NodeAddress contains information for the instance's address. // NodeAddress contains information for the instance's address.
// The node addresses returned here will be set on the node's status.addresses field. // The node addresses returned here will be set on the node's status.addresses field.
NodeAddresses []v1.NodeAddress NodeAddresses []v1.NodeAddress
// Zone is the zone that the instance is in.
// The value set here is applied as the following labels on the node:
// * topology.kubernetes.io/zone=<zone>
// * failure-domain.beta.kubernetes.io/zone=<zone> (DEPRECATED)
Zone string
// Region is the region that the instance is in.
// The value set here is applied as the following labels on the node:
// * topology.kubernetes.io/region=<region>
// * failure-domain.beta.kubernetes.io/region=<region> (DEPRECATED)
Region string
} }

View File

@ -447,18 +447,41 @@ func (cnc *CloudNodeController) getNodeModifiersFromCloudProvider(ctx context.Co
if !ok { if !ok {
return nil, fmt.Errorf("failed to get instances from cloud provider") return nil, fmt.Errorf("failed to get instances from cloud provider")
} }
nodeAddresses, err := getNodeAddressesByProviderIDOrName(ctx, instances, providerID, nodeName) nodeAddresses, err := getNodeAddressesByProviderIDOrName(ctx, instances, providerID, nodeName)
if err != nil { if err != nil {
return nil, err return nil, err
} }
instanceType, err := getInstanceTypeByProviderIDOrName(ctx, instances, providerID, nodeName) instanceType, err := getInstanceTypeByProviderIDOrName(ctx, instances, providerID, nodeName)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &cloudprovider.InstanceMetadata{
instanceMetadata := &cloudprovider.InstanceMetadata{
InstanceType: instanceType, InstanceType: instanceType,
NodeAddresses: nodeAddresses, NodeAddresses: nodeAddresses,
}, nil }
zones, ok := cnc.cloud.Zones()
if !ok {
return instanceMetadata, nil
}
zone, err := getZoneByProviderIDOrName(ctx, zones, providerID, node.Name)
if err != nil {
return nil, fmt.Errorf("failed to get zone from cloud provider: %v", err)
}
if zone.FailureDomain != "" {
instanceMetadata.Zone = zone.FailureDomain
}
if zone.Region != "" {
instanceMetadata.Region = zone.Region
}
return instanceMetadata, nil
} }
instanceMeta, err := instanceMetadataGetter(providerID, node.Name, node) instanceMeta, err := instanceMetadataGetter(providerID, node.Name, node)
@ -484,34 +507,29 @@ func (cnc *CloudNodeController) getNodeModifiersFromCloudProvider(ctx context.Co
}) })
} }
if zones, ok := cnc.cloud.Zones(); ok { if instanceMeta.Zone != "" {
zone, err := getZoneByProviderIDOrName(ctx, zones, providerID, node.Name) klog.V(2).Infof("Adding node label from cloud provider: %s=%s", v1.LabelZoneFailureDomain, instanceMeta.Zone)
if err != nil { klog.V(2).Infof("Adding node label from cloud provider: %s=%s", v1.LabelZoneFailureDomainStable, instanceMeta.Zone)
return nil, fmt.Errorf("failed to get zone from cloud provider: %v", err) nodeModifiers = append(nodeModifiers, func(n *v1.Node) {
} if n.Labels == nil {
if zone.FailureDomain != "" { n.Labels = map[string]string{}
klog.V(2).Infof("Adding node label from cloud provider: %s=%s", v1.LabelZoneFailureDomain, zone.FailureDomain) }
klog.V(2).Infof("Adding node label from cloud provider: %s=%s", v1.LabelZoneFailureDomainStable, zone.FailureDomain) n.Labels[v1.LabelZoneFailureDomain] = instanceMeta.Zone
nodeModifiers = append(nodeModifiers, func(n *v1.Node) { n.Labels[v1.LabelZoneFailureDomainStable] = instanceMeta.Zone
if n.Labels == nil { })
n.Labels = map[string]string{}
}
n.Labels[v1.LabelZoneFailureDomain] = zone.FailureDomain
n.Labels[v1.LabelZoneFailureDomainStable] = zone.FailureDomain
})
}
if zone.Region != "" {
klog.V(2).Infof("Adding node label from cloud provider: %s=%s", v1.LabelZoneRegion, zone.Region)
klog.V(2).Infof("Adding node label from cloud provider: %s=%s", v1.LabelZoneRegionStable, zone.Region)
nodeModifiers = append(nodeModifiers, func(n *v1.Node) {
if n.Labels == nil {
n.Labels = map[string]string{}
}
n.Labels[v1.LabelZoneRegion] = zone.Region
n.Labels[v1.LabelZoneRegionStable] = zone.Region
})
}
} }
if instanceMeta.Region != "" {
klog.V(2).Infof("Adding node label from cloud provider: %s=%s", v1.LabelZoneRegion, instanceMeta.Region)
klog.V(2).Infof("Adding node label from cloud provider: %s=%s", v1.LabelZoneRegionStable, instanceMeta.Region)
nodeModifiers = append(nodeModifiers, func(n *v1.Node) {
if n.Labels == nil {
n.Labels = map[string]string{}
}
n.Labels[v1.LabelZoneRegion] = instanceMeta.Region
n.Labels[v1.LabelZoneRegionStable] = instanceMeta.Region
})
}
return nodeModifiers, nil return nodeModifiers, nil
} }

View File

@ -325,6 +325,8 @@ func (f *Cloud) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloudprov
ProviderID: node.Spec.ProviderID, ProviderID: node.Spec.ProviderID,
InstanceType: f.InstanceTypes[types.NodeName(node.Spec.ProviderID)], InstanceType: f.InstanceTypes[types.NodeName(node.Spec.ProviderID)],
NodeAddresses: f.Addresses, NodeAddresses: f.Addresses,
Zone: f.Zone.FailureDomain,
Region: f.Zone.Region,
}, f.Err }, f.Err
} }