Merge pull request #90057 from ialidzhikov/fix/gcp-ccm

Fix Node initialization for GCP cloud provider
This commit is contained in:
Kubernetes Prow Robot 2020-04-15 11:36:24 -07:00 committed by GitHub
commit ec79307b04
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -239,7 +239,7 @@ func (cnc *CloudNodeController) updateNodeAddress(ctx context.Context, node *v1.
return return
} }
nodeAddresses, err := getNodeAddressesByProviderIDOrName(ctx, instances, node) nodeAddresses, err := getNodeAddressesByProviderIDOrName(ctx, instances, node.Spec.ProviderID, node.Name)
if err != nil { if err != nil {
klog.Errorf("Error getting node addresses for node %q: %v", node.Name, err) klog.Errorf("Error getting node addresses for node %q: %v", node.Name, err)
return return
@ -407,10 +407,14 @@ func (cnc *CloudNodeController) initializeNode(ctx context.Context, node *v1.Nod
// All of the returned functions are idempotent, because they are used in a retry-if-conflict // All of the returned functions are idempotent, because they are used in a retry-if-conflict
// loop, meaning they could get called multiple times. // loop, meaning they could get called multiple times.
func (cnc *CloudNodeController) getNodeModifiersFromCloudProvider(ctx context.Context, node *v1.Node, instances cloudprovider.Instances) ([]nodeModifier, error) { func (cnc *CloudNodeController) getNodeModifiersFromCloudProvider(ctx context.Context, node *v1.Node, instances cloudprovider.Instances) ([]nodeModifier, error) {
var nodeModifiers []nodeModifier var (
nodeModifiers []nodeModifier
providerID string
err error
)
if node.Spec.ProviderID == "" { if node.Spec.ProviderID == "" {
providerID, err := cloudprovider.GetInstanceProviderID(ctx, cnc.cloud, types.NodeName(node.Name)) providerID, err = cloudprovider.GetInstanceProviderID(ctx, cnc.cloud, types.NodeName(node.Name))
if err == nil { if err == nil {
nodeModifiers = append(nodeModifiers, func(n *v1.Node) { nodeModifiers = append(nodeModifiers, func(n *v1.Node) {
if n.Spec.ProviderID == "" { if n.Spec.ProviderID == "" {
@ -428,9 +432,11 @@ func (cnc *CloudNodeController) getNodeModifiersFromCloudProvider(ctx context.Co
// do not, the taint will be removed, and this will not be retried // do not, the taint will be removed, and this will not be retried
return nil, err return nil, err
} }
} else {
providerID = node.Spec.ProviderID
} }
nodeAddresses, err := getNodeAddressesByProviderIDOrName(ctx, instances, node) nodeAddresses, err := getNodeAddressesByProviderIDOrName(ctx, instances, providerID, node.Name)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -443,7 +449,7 @@ func (cnc *CloudNodeController) getNodeModifiersFromCloudProvider(ctx context.Co
} }
} }
if instanceType, err := getInstanceTypeByProviderIDOrName(ctx, instances, node); err != nil { if instanceType, err := getInstanceTypeByProviderIDOrName(ctx, instances, providerID, node.Name); err != nil {
return nil, err return nil, err
} else if instanceType != "" { } else if instanceType != "" {
klog.V(2).Infof("Adding node label from cloud provider: %s=%s", v1.LabelInstanceType, instanceType) klog.V(2).Infof("Adding node label from cloud provider: %s=%s", v1.LabelInstanceType, instanceType)
@ -458,7 +464,7 @@ func (cnc *CloudNodeController) getNodeModifiersFromCloudProvider(ctx context.Co
} }
if zones, ok := cnc.cloud.Zones(); ok { if zones, ok := cnc.cloud.Zones(); ok {
zone, err := getZoneByProviderIDOrName(ctx, zones, node) zone, err := getZoneByProviderIDOrName(ctx, zones, providerID, node.Name)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get zone from cloud provider: %v", err) return nil, fmt.Errorf("failed to get zone from cloud provider: %v", err)
} }
@ -531,11 +537,11 @@ func ensureNodeExistsByProviderID(ctx context.Context, instances cloudprovider.I
return instances.InstanceExistsByProviderID(ctx, providerID) return instances.InstanceExistsByProviderID(ctx, providerID)
} }
func getNodeAddressesByProviderIDOrName(ctx context.Context, instances cloudprovider.Instances, node *v1.Node) ([]v1.NodeAddress, error) { func getNodeAddressesByProviderIDOrName(ctx context.Context, instances cloudprovider.Instances, providerID, nodeName string) ([]v1.NodeAddress, error) {
nodeAddresses, err := instances.NodeAddressesByProviderID(ctx, node.Spec.ProviderID) nodeAddresses, err := instances.NodeAddressesByProviderID(ctx, providerID)
if err != nil { if err != nil {
providerIDErr := err providerIDErr := err
nodeAddresses, err = instances.NodeAddresses(ctx, types.NodeName(node.Name)) nodeAddresses, err = instances.NodeAddresses(ctx, types.NodeName(nodeName))
if err != nil { if err != nil {
return nil, fmt.Errorf("error fetching node by provider ID: %v, and error by node name: %v", providerIDErr, err) return nil, fmt.Errorf("error fetching node by provider ID: %v, and error by node name: %v", providerIDErr, err)
} }
@ -576,11 +582,13 @@ func ensureNodeProvidedIPExists(node *v1.Node, nodeAddresses []v1.NodeAddress) (
return nodeIP, nodeIPExists return nodeIP, nodeIPExists
} }
func getInstanceTypeByProviderIDOrName(ctx context.Context, instances cloudprovider.Instances, node *v1.Node) (string, error) { // getInstanceTypeByProviderIDOrName will attempt to get the instance type of node using its providerID
instanceType, err := instances.InstanceTypeByProviderID(ctx, node.Spec.ProviderID) // then it's name. If both attempts fail, an error is returned.
func getInstanceTypeByProviderIDOrName(ctx context.Context, instances cloudprovider.Instances, providerID, nodeName string) (string, error) {
instanceType, err := instances.InstanceTypeByProviderID(ctx, providerID)
if err != nil { if err != nil {
providerIDErr := err providerIDErr := err
instanceType, err = instances.InstanceType(ctx, types.NodeName(node.Name)) instanceType, err = instances.InstanceType(ctx, types.NodeName(nodeName))
if err != nil { if err != nil {
return "", fmt.Errorf("InstanceType: Error fetching by providerID: %v Error fetching by NodeName: %v", providerIDErr, err) return "", fmt.Errorf("InstanceType: Error fetching by providerID: %v Error fetching by NodeName: %v", providerIDErr, err)
} }
@ -589,12 +597,12 @@ func getInstanceTypeByProviderIDOrName(ctx context.Context, instances cloudprovi
} }
// getZoneByProviderIDorName will attempt to get the zone of node using its providerID // getZoneByProviderIDorName will attempt to get the zone of node using its providerID
// then it's name. If both attempts fail, an error is returned // then it's name. If both attempts fail, an error is returned.
func getZoneByProviderIDOrName(ctx context.Context, zones cloudprovider.Zones, node *v1.Node) (cloudprovider.Zone, error) { func getZoneByProviderIDOrName(ctx context.Context, zones cloudprovider.Zones, providerID, nodeName string) (cloudprovider.Zone, error) {
zone, err := zones.GetZoneByProviderID(ctx, node.Spec.ProviderID) zone, err := zones.GetZoneByProviderID(ctx, providerID)
if err != nil { if err != nil {
providerIDErr := err providerIDErr := err
zone, err = zones.GetZoneByNodeName(ctx, types.NodeName(node.Name)) zone, err = zones.GetZoneByNodeName(ctx, types.NodeName(nodeName))
if err != nil { if err != nil {
return cloudprovider.Zone{}, fmt.Errorf("Zone: Error fetching by providerID: %v Error fetching by NodeName: %v", providerIDErr, err) return cloudprovider.Zone{}, fmt.Errorf("Zone: Error fetching by providerID: %v Error fetching by NodeName: %v", providerIDErr, err)
} }