func (nm *realNodeManager) initialNodeStatus() (*api.Node, error) { node := &api.Node{ ObjectMeta: api.ObjectMeta{ Name: nm.nodeName, Labels: map[string]string{"kubernetes.io/hostname": nm.hostname}, }, } if nm.cloud != nil { instances, ok := nm.cloud.Instances() if !ok { return nil, fmt.Errorf("failed to get instances from cloud provider") } // TODO(roberthbailey): Can we do this without having credentials to talk // to the cloud provider? // TODO: ExternalID is deprecated, we'll have to drop this code externalID, err := instances.ExternalID(nm.nodeName) if err != nil { return nil, fmt.Errorf("failed to get external ID from cloud provider: %v", err) } node.Spec.ExternalID = externalID // TODO: We can't assume that the node has credentials to talk to the // cloudprovider from arbitrary nodes. At most, we should talk to a // local metadata server here. node.Spec.ProviderID, err = cloudprovider.GetInstanceProviderID(nm.cloud, nm.nodeName) if err != nil { return nil, err } } else { node.Spec.ExternalID = nm.hostname } if err := nm.setNodeStatus(node); err != nil { return nil, err } return node, nil }
// initialNodeStatus determines the initial node status, incorporating node // labels and information from the cloud provider. func (kl *Kubelet) initialNodeStatus() (*api.Node, error) { node := &api.Node{ ObjectMeta: api.ObjectMeta{ Name: kl.nodeName, Labels: map[string]string{ unversioned.LabelHostname: kl.hostname, unversioned.LabelOS: goRuntime.GOOS, unversioned.LabelArch: goRuntime.GOARCH, }, }, Spec: api.NodeSpec{ Unschedulable: !kl.registerSchedulable, }, } // Initially, set NodeNetworkUnavailable to true. if kl.providerRequiresNetworkingConfiguration() { node.Status.Conditions = append(node.Status.Conditions, api.NodeCondition{ Type: api.NodeNetworkUnavailable, Status: api.ConditionTrue, Reason: "NoRouteCreated", Message: "Node created without a route", LastTransitionTime: unversioned.NewTime(kl.clock.Now()), }) } if kl.enableControllerAttachDetach { if node.Annotations == nil { node.Annotations = make(map[string]string) } node.Annotations[volumehelper.ControllerManagedAttachAnnotation] = "true" } // @question: should this be place after the call to the cloud provider? which also applies labels for k, v := range kl.nodeLabels { if cv, found := node.ObjectMeta.Labels[k]; found { glog.Warningf("the node label %s=%s will overwrite default setting %s", k, v, cv) } node.ObjectMeta.Labels[k] = v } if kl.cloud != nil { instances, ok := kl.cloud.Instances() if !ok { return nil, fmt.Errorf("failed to get instances from cloud provider") } // TODO(roberthbailey): Can we do this without having credentials to talk // to the cloud provider? // TODO: ExternalID is deprecated, we'll have to drop this code externalID, err := instances.ExternalID(kl.nodeName) if err != nil { return nil, fmt.Errorf("failed to get external ID from cloud provider: %v", err) } node.Spec.ExternalID = externalID // TODO: We can't assume that the node has credentials to talk to the // cloudprovider from arbitrary nodes. At most, we should talk to a // local metadata server here. node.Spec.ProviderID, err = cloudprovider.GetInstanceProviderID(kl.cloud, kl.nodeName) if err != nil { return nil, err } instanceType, err := instances.InstanceType(kl.nodeName) if err != nil { return nil, err } if instanceType != "" { glog.Infof("Adding node label from cloud provider: %s=%s", unversioned.LabelInstanceType, instanceType) node.ObjectMeta.Labels[unversioned.LabelInstanceType] = instanceType } // If the cloud has zone information, label the node with the zone information zones, ok := kl.cloud.Zones() if ok { zone, err := zones.GetZone() if err != nil { return nil, fmt.Errorf("failed to get zone from cloud provider: %v", err) } if zone.FailureDomain != "" { glog.Infof("Adding node label from cloud provider: %s=%s", unversioned.LabelZoneFailureDomain, zone.FailureDomain) node.ObjectMeta.Labels[unversioned.LabelZoneFailureDomain] = zone.FailureDomain } if zone.Region != "" { glog.Infof("Adding node label from cloud provider: %s=%s", unversioned.LabelZoneRegion, zone.Region) node.ObjectMeta.Labels[unversioned.LabelZoneRegion] = zone.Region } } } else { node.Spec.ExternalID = kl.hostname if kl.autoDetectCloudProvider { // If no cloud provider is defined - use the one detected by cadvisor info, err := kl.GetCachedMachineInfo() if err == nil { kl.updateCloudProviderFromMachineInfo(node, info) } } } if err := kl.setNodeStatus(node); err != nil { return nil, err } return node, nil }