diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 386c4daabb9..a8be64c3f17 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -462,12 +462,6 @@ func NewMainKubelet(kubeCfg *componentconfig.KubeletConfiguration, kubeDeps *Kub klet.flannelHelper = NewFlannelHelper() glog.Infof("Flannel is in charge of podCIDR and overlay networking.") } - if klet.nodeIP != nil { - if err := klet.validateNodeIP(); err != nil { - return nil, err - } - glog.Infof("Using node IP: %q", klet.nodeIP.String()) - } if mode, err := effectiveHairpinMode(componentconfig.HairpinMode(kubeCfg.HairpinMode), kubeCfg.ContainerRuntime, kubeCfg.ConfigureCBR0, kubeCfg.NetworkPluginName); err != nil { // This is a non-recoverable error. Returning it up the callstack will just diff --git a/pkg/kubelet/kubelet_network.go b/pkg/kubelet/kubelet_network.go index 2672c2f6ea0..618ed522340 100644 --- a/pkg/kubelet/kubelet_network.go +++ b/pkg/kubelet/kubelet_network.go @@ -81,39 +81,6 @@ func effectiveHairpinMode(hairpinMode componentconfig.HairpinMode, containerRunt return hairpinMode, nil } -// Validate given node IP belongs to the current host -func (kl *Kubelet) validateNodeIP() error { - if kl.nodeIP == nil { - return nil - } - - // Honor IP limitations set in setNodeStatus() - if kl.nodeIP.IsLoopback() { - return fmt.Errorf("nodeIP can't be loopback address") - } - if kl.nodeIP.To4() == nil { - return fmt.Errorf("nodeIP must be IPv4 address") - } - - addrs, err := net.InterfaceAddrs() - if err != nil { - return err - } - for _, addr := range addrs { - var ip net.IP - switch v := addr.(type) { - case *net.IPNet: - ip = v.IP - case *net.IPAddr: - ip = v.IP - } - if ip != nil && ip.Equal(kl.nodeIP) { - return nil - } - } - return fmt.Errorf("Node IP: %q not found in the host's network interfaces", kl.nodeIP.String()) -} - // providerRequiresNetworkingConfiguration returns whether the cloud provider // requires special networking configuration. func (kl *Kubelet) providerRequiresNetworkingConfiguration() bool { diff --git a/pkg/kubelet/kubelet_node_status.go b/pkg/kubelet/kubelet_node_status.go index 62095a07fc3..1f0e9f175e5 100644 --- a/pkg/kubelet/kubelet_node_status.go +++ b/pkg/kubelet/kubelet_node_status.go @@ -359,6 +359,14 @@ func (kl *Kubelet) recordNodeStatusEvent(eventtype, event string) { // Set IP addresses for the node. func (kl *Kubelet) setNodeAddress(node *api.Node) error { + + if kl.nodeIP != nil { + if err := kl.validateNodeIP(); err != nil { + return fmt.Errorf("failed to validate nodeIP: %v", err) + } + glog.V(2).Infof("Using node IP: %q", kl.nodeIP.String()) + } + if kl.cloud != nil { instances, ok := kl.cloud.Instances() if !ok { @@ -372,6 +380,19 @@ func (kl *Kubelet) setNodeAddress(node *api.Node) error { if err != nil { return fmt.Errorf("failed to get node address from cloud provider: %v", err) } + + if kl.nodeIP != nil { + for _, nodeAddress := range nodeAddresses { + if nodeAddress.Address == kl.nodeIP.String() { + node.Status.Addresses = []api.NodeAddress{ + {Type: nodeAddress.Type, Address: nodeAddress.Address}, + } + return nil + } + } + return fmt.Errorf("failed to get node address from cloud provider that matches ip: %v", kl.nodeIP) + } + node.Status.Addresses = nodeAddresses } else { var ipAddr net.IP @@ -848,3 +869,36 @@ func SetNodeStatus(f func(*api.Node) error) Option { k.setNodeStatusFuncs = append(k.setNodeStatusFuncs, f) } } + +// Validate given node IP belongs to the current host +func (kl *Kubelet) validateNodeIP() error { + if kl.nodeIP == nil { + return nil + } + + // Honor IP limitations set in setNodeStatus() + if kl.nodeIP.IsLoopback() { + return fmt.Errorf("nodeIP can't be loopback address") + } + if kl.nodeIP.To4() == nil { + return fmt.Errorf("nodeIP must be IPv4 address") + } + + addrs, err := net.InterfaceAddrs() + if err != nil { + return err + } + for _, addr := range addrs { + var ip net.IP + switch v := addr.(type) { + case *net.IPNet: + ip = v.IP + case *net.IPAddr: + ip = v.IP + } + if ip != nil && ip.Equal(kl.nodeIP) { + return nil + } + } + return fmt.Errorf("Node IP: %q not found in the host's network interfaces", kl.nodeIP.String()) +}