From d274971ff9443a4c47cb70b0f5d0fb0a5cdc4c36 Mon Sep 17 00:00:00 2001 From: Andrew Sy Kim Date: Thu, 6 Aug 2020 15:40:15 -0400 Subject: [PATCH] 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 --- staging/src/k8s.io/cloud-provider/cloud.go | 11 +++ .../controllers/node/node_controller.go | 76 ++++++++++++------- .../src/k8s.io/cloud-provider/fake/fake.go | 2 + 3 files changed, 60 insertions(+), 29 deletions(-) diff --git a/staging/src/k8s.io/cloud-provider/cloud.go b/staging/src/k8s.io/cloud-provider/cloud.go index 98fb5c347c8..cdb2d095064 100644 --- a/staging/src/k8s.io/cloud-provider/cloud.go +++ b/staging/src/k8s.io/cloud-provider/cloud.go @@ -294,4 +294,15 @@ type InstanceMetadata struct { // NodeAddress contains information for the instance's address. // The node addresses returned here will be set on the node's status.addresses field. 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= + // * failure-domain.beta.kubernetes.io/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= + // * failure-domain.beta.kubernetes.io/region= (DEPRECATED) + Region string } diff --git a/staging/src/k8s.io/cloud-provider/controllers/node/node_controller.go b/staging/src/k8s.io/cloud-provider/controllers/node/node_controller.go index 7aa0e8f5b70..b6eb95b4aa0 100644 --- a/staging/src/k8s.io/cloud-provider/controllers/node/node_controller.go +++ b/staging/src/k8s.io/cloud-provider/controllers/node/node_controller.go @@ -447,18 +447,41 @@ func (cnc *CloudNodeController) getNodeModifiersFromCloudProvider(ctx context.Co if !ok { return nil, fmt.Errorf("failed to get instances from cloud provider") } + nodeAddresses, err := getNodeAddressesByProviderIDOrName(ctx, instances, providerID, nodeName) if err != nil { return nil, err } + instanceType, err := getInstanceTypeByProviderIDOrName(ctx, instances, providerID, nodeName) if err != nil { return nil, err } - return &cloudprovider.InstanceMetadata{ + + instanceMetadata := &cloudprovider.InstanceMetadata{ InstanceType: instanceType, 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) @@ -484,34 +507,29 @@ func (cnc *CloudNodeController) getNodeModifiersFromCloudProvider(ctx context.Co }) } - if zones, ok := cnc.cloud.Zones(); ok { - 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 != "" { - 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) - nodeModifiers = append(nodeModifiers, func(n *v1.Node) { - 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.Zone != "" { + klog.V(2).Infof("Adding node label from cloud provider: %s=%s", v1.LabelZoneFailureDomain, instanceMeta.Zone) + klog.V(2).Infof("Adding node label from cloud provider: %s=%s", v1.LabelZoneFailureDomainStable, instanceMeta.Zone) + nodeModifiers = append(nodeModifiers, func(n *v1.Node) { + if n.Labels == nil { + n.Labels = map[string]string{} + } + n.Labels[v1.LabelZoneFailureDomain] = instanceMeta.Zone + n.Labels[v1.LabelZoneFailureDomainStable] = instanceMeta.Zone + }) } + 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 } diff --git a/staging/src/k8s.io/cloud-provider/fake/fake.go b/staging/src/k8s.io/cloud-provider/fake/fake.go index 1637dd868a9..3dddae512b6 100644 --- a/staging/src/k8s.io/cloud-provider/fake/fake.go +++ b/staging/src/k8s.io/cloud-provider/fake/fake.go @@ -325,6 +325,8 @@ func (f *Cloud) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloudprov ProviderID: node.Spec.ProviderID, InstanceType: f.InstanceTypes[types.NodeName(node.Spec.ProviderID)], NodeAddresses: f.Addresses, + Zone: f.Zone.FailureDomain, + Region: f.Zone.Region, }, f.Err }