From 2d85e4a094b1f3099dce6ac9ad540a46e54184be Mon Sep 17 00:00:00 2001 From: CJ Cullen Date: Tue, 26 May 2015 16:13:00 -0700 Subject: [PATCH] Use Node IP Address instead of Node.Name in minion.ResourceLocation. Refactor GetNodeHostIP into pkg/util/node (instead of pkg/util to break import cycle). Include internalIP in gce NodeAddresses. --- cmd/kubelet/app/server.go | 5 +++-- pkg/cloudprovider/gce/gce.go | 16 ++++++++++------ pkg/kubelet/kubelet.go | 17 ++--------------- pkg/registry/minion/rest.go | 7 ++++++- pkg/util/{ => node}/node.go | 27 ++++++++++++++++++++++++++- 5 files changed, 47 insertions(+), 25 deletions(-) rename pkg/util/{ => node}/node.go (52%) diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index 957310e98dc..8090f6b4219 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -48,6 +48,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/master/ports" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/GoogleCloudPlatform/kubernetes/pkg/util/mount" + nodeutil "github.com/GoogleCloudPlatform/kubernetes/pkg/util/node" "github.com/GoogleCloudPlatform/kubernetes/pkg/volume" "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider" @@ -383,7 +384,7 @@ func (s *KubeletServer) InitializeTLS() (*kubelet.TLSOptions, error) { if s.TLSCertFile == "" && s.TLSPrivateKeyFile == "" { s.TLSCertFile = path.Join(s.CertDirectory, "kubelet.crt") s.TLSPrivateKeyFile = path.Join(s.CertDirectory, "kubelet.key") - if err := util.GenerateSelfSignedCert(util.GetHostname(s.HostnameOverride), s.TLSCertFile, s.TLSPrivateKeyFile); err != nil { + if err := util.GenerateSelfSignedCert(nodeutil.GetHostname(s.HostnameOverride), s.TLSCertFile, s.TLSPrivateKeyFile); err != nil { return nil, fmt.Errorf("unable to generate self signed cert: %v", err) } glog.V(4).Infof("Using self-signed cert (%s, %s)", s.TLSCertFile, s.TLSPrivateKeyFile) @@ -554,7 +555,7 @@ func SimpleKubelet(client *client.Client, // 3 Standalone 'kubernetes' binary // Eventually, #2 will be replaced with instances of #3 func RunKubelet(kcfg *KubeletConfig, builder KubeletBuilder) error { - kcfg.Hostname = util.GetHostname(kcfg.HostnameOverride) + kcfg.Hostname = nodeutil.GetHostname(kcfg.HostnameOverride) eventBroadcaster := record.NewBroadcaster() kcfg.Recorder = eventBroadcaster.NewRecorder(api.EventSource{Component: "kubelet", Host: kcfg.Hostname}) eventBroadcaster.StartLogging(glog.Infof) diff --git a/pkg/cloudprovider/gce/gce.go b/pkg/cloudprovider/gce/gce.go index 96d78daf0e1..e0cbe7e175e 100644 --- a/pkg/cloudprovider/gce/gce.go +++ b/pkg/cloudprovider/gce/gce.go @@ -43,9 +43,11 @@ import ( "google.golang.org/cloud/compute/metadata" ) -const ProviderName = "gce" - -const EXTERNAL_IP_METADATA_URL = "http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip" +const ( + ProviderName = "gce" + EXTERNAL_IP_METADATA_URL = "http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip" + INTERNAL_IP_METADATA_URL = "http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/ip" +) // GCECloud is an implementation of Interface, TCPLoadBalancer and Instances for Google Compute Engine. type GCECloud struct { @@ -524,15 +526,17 @@ func addKey(metadataBefore, keyString string) string { // NodeAddresses is an implementation of Instances.NodeAddresses. func (gce *GCECloud) NodeAddresses(_ string) ([]api.NodeAddress, error) { + internalIP, err := gce.metadataAccess(INTERNAL_IP_METADATA_URL) + if err != nil { + return nil, fmt.Errorf("couldn't get internal IP: %v", err) + } externalIP, err := gce.metadataAccess(EXTERNAL_IP_METADATA_URL) if err != nil { return nil, fmt.Errorf("couldn't get external IP: %v", err) } - return []api.NodeAddress{ + {Type: api.NodeInternalIP, Address: internalIP}, {Type: api.NodeExternalIP, Address: externalIP}, - // TODO(mbforbes): Remove NodeLegacyHostIP once v1beta1 is removed. - {Type: api.NodeLegacyHostIP, Address: externalIP}, }, nil } diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 840e45d2910..159774203da 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -54,6 +54,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/util" utilErrors "github.com/GoogleCloudPlatform/kubernetes/pkg/util/errors" "github.com/GoogleCloudPlatform/kubernetes/pkg/util/mount" + nodeutil "github.com/GoogleCloudPlatform/kubernetes/pkg/util/node" "github.com/GoogleCloudPlatform/kubernetes/pkg/version" "github.com/GoogleCloudPlatform/kubernetes/pkg/volume" "github.com/GoogleCloudPlatform/kubernetes/pkg/watch" @@ -1723,21 +1724,7 @@ func (kl *Kubelet) GetHostIP() (net.IP, error) { if err != nil { return nil, fmt.Errorf("cannot get node: %v", err) } - addresses := node.Status.Addresses - addressMap := make(map[api.NodeAddressType][]api.NodeAddress) - for i := range addresses { - addressMap[addresses[i].Type] = append(addressMap[addresses[i].Type], addresses[i]) - } - if addresses, ok := addressMap[api.NodeLegacyHostIP]; ok { - return net.ParseIP(addresses[0].Address), nil - } - if addresses, ok := addressMap[api.NodeInternalIP]; ok { - return net.ParseIP(addresses[0].Address), nil - } - if addresses, ok := addressMap[api.NodeExternalIP]; ok { - return net.ParseIP(addresses[0].Address), nil - } - return nil, fmt.Errorf("host IP unknown; known addresses: %v", addresses) + return nodeutil.GetNodeHostIP(node) } // GetPods returns all pods bound to the kubelet and their spec, and the mirror diff --git a/pkg/registry/minion/rest.go b/pkg/registry/minion/rest.go index 70daaf1e990..528fde5b1d6 100644 --- a/pkg/registry/minion/rest.go +++ b/pkg/registry/minion/rest.go @@ -34,6 +34,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/GoogleCloudPlatform/kubernetes/pkg/util/fielderrors" + nodeutil "github.com/GoogleCloudPlatform/kubernetes/pkg/util/node" ) // nodeStrategy implements behavior for nodes @@ -142,7 +143,11 @@ func ResourceLocation(getter ResourceGetter, connection client.ConnectionInfoGet return nil, nil, err } node := nodeObj.(*api.Node) - host := node.Name // TODO: use node's IP, don't expect the name to resolve. + hostIP, err := nodeutil.GetNodeHostIP(node) + if err != nil { + return nil, nil, err + } + host := hostIP.String() if portReq == "" || strconv.Itoa(ports.KubeletPort) == portReq { scheme, port, transport, err := connection.GetConnectionInfo(host) diff --git a/pkg/util/node.go b/pkg/util/node/node.go similarity index 52% rename from pkg/util/node.go rename to pkg/util/node/node.go index 1607ed94b13..15f7ca6c134 100644 --- a/pkg/util/node.go +++ b/pkg/util/node/node.go @@ -14,12 +14,15 @@ See the License for the specific language governing permissions and limitations under the License. */ -package util +package node import ( + "fmt" + "net" "os/exec" "strings" + "github.com/GoogleCloudPlatform/kubernetes/pkg/api" "github.com/golang/glog" ) @@ -34,3 +37,25 @@ func GetHostname(hostnameOverride string) string { } return strings.ToLower(strings.TrimSpace(hostname)) } + +// GetNodeHostIP returns the provided node's IP, based on the priority: +// 1. NodeInternalIP +// 2. NodeExternalIP +// 3. NodeLegacyHostIP +func GetNodeHostIP(node *api.Node) (net.IP, error) { + addresses := node.Status.Addresses + addressMap := make(map[api.NodeAddressType][]api.NodeAddress) + for i := range addresses { + addressMap[addresses[i].Type] = append(addressMap[addresses[i].Type], addresses[i]) + } + if addresses, ok := addressMap[api.NodeInternalIP]; ok { + return net.ParseIP(addresses[0].Address), nil + } + if addresses, ok := addressMap[api.NodeExternalIP]; ok { + return net.ParseIP(addresses[0].Address), nil + } + if addresses, ok := addressMap[api.NodeLegacyHostIP]; ok { + return net.ParseIP(addresses[0].Address), nil + } + return nil, fmt.Errorf("host IP unknown; known addresses: %v", addresses) +}