| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | // Copyright 2016 The Prometheus Authors
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package kubernetes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2017-10-25 12:21:42 +08:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 	"net" | 
					
						
							|  |  |  | 	"strconv" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-12 02:45:52 +08:00
										 |  |  | 	"github.com/go-kit/kit/log" | 
					
						
							|  |  |  | 	"github.com/go-kit/kit/log/level" | 
					
						
							| 
									
										
										
										
											2019-03-26 07:01:12 +08:00
										 |  |  | 	"github.com/pkg/errors" | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 	"github.com/prometheus/common/model" | 
					
						
							| 
									
										
										
										
											2018-07-03 15:37:22 +08:00
										 |  |  | 	apiv1 "k8s.io/api/core/v1" | 
					
						
							| 
									
										
										
										
											2017-05-11 16:29:10 +08:00
										 |  |  | 	"k8s.io/client-go/tools/cache" | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 	"k8s.io/client-go/util/workqueue" | 
					
						
							| 
									
										
										
										
											2019-03-26 07:01:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/prometheus/prometheus/discovery/targetgroup" | 
					
						
							|  |  |  | 	"github.com/prometheus/prometheus/util/strutil" | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:27 +08:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	NodeLegacyHostIP = "LegacyHostIP" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-06 23:52:58 +08:00
										 |  |  | var ( | 
					
						
							|  |  |  | 	nodeAddCount    = eventCount.WithLabelValues("node", "add") | 
					
						
							|  |  |  | 	nodeUpdateCount = eventCount.WithLabelValues("node", "update") | 
					
						
							|  |  |  | 	nodeDeleteCount = eventCount.WithLabelValues("node", "delete") | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | // Node discovers Kubernetes nodes.
 | 
					
						
							|  |  |  | type Node struct { | 
					
						
							|  |  |  | 	logger   log.Logger | 
					
						
							|  |  |  | 	informer cache.SharedInformer | 
					
						
							|  |  |  | 	store    cache.Store | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 	queue    *workqueue.Type | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | // NewNode returns a new node discovery.
 | 
					
						
							|  |  |  | func NewNode(l log.Logger, inf cache.SharedInformer) *Node { | 
					
						
							| 
									
										
										
										
											2017-08-12 02:45:52 +08:00
										 |  |  | 	if l == nil { | 
					
						
							|  |  |  | 		l = log.NewNopLogger() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 	n := &Node{logger: l, informer: inf, store: inf.GetStore(), queue: workqueue.NewNamed("node")} | 
					
						
							|  |  |  | 	n.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ | 
					
						
							|  |  |  | 		AddFunc: func(o interface{}) { | 
					
						
							| 
									
										
										
										
											2020-02-06 23:52:58 +08:00
										 |  |  | 			nodeAddCount.Inc() | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 			n.enqueue(o) | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		DeleteFunc: func(o interface{}) { | 
					
						
							| 
									
										
										
										
											2020-02-06 23:52:58 +08:00
										 |  |  | 			nodeDeleteCount.Inc() | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 			n.enqueue(o) | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		UpdateFunc: func(_, o interface{}) { | 
					
						
							| 
									
										
										
										
											2020-02-06 23:52:58 +08:00
										 |  |  | 			nodeUpdateCount.Inc() | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 			n.enqueue(o) | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	return n | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 12:07:33 +08:00
										 |  |  | func (n *Node) enqueue(obj interface{}) { | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 	key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 12:07:33 +08:00
										 |  |  | 	n.queue.Add(key) | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-09 07:59:18 +08:00
										 |  |  | // Run implements the Discoverer interface.
 | 
					
						
							| 
									
										
											  
											
												Refactor SD configuration to remove `config` dependency (#3629)
* refactor: move targetGroup struct and CheckOverflow() to their own package
* refactor: move auth and security related structs to a utility package, fix import error in utility package
* refactor: Azure SD, remove SD struct from config
* refactor: DNS SD, remove SD struct from config into dns package
* refactor: ec2 SD, move SD struct from config into the ec2 package
* refactor: file SD, move SD struct from config to file discovery package
* refactor: gce, move SD struct from config to gce discovery package
* refactor: move HTTPClientConfig and URL into util/config, fix import error in httputil
* refactor: consul, move SD struct from config into consul discovery package
* refactor: marathon, move SD struct from config into marathon discovery package
* refactor: triton, move SD struct from config to triton discovery package, fix test
* refactor: zookeeper, move SD structs from config to zookeeper discovery package
* refactor: openstack, remove SD struct from config, move into openstack discovery package
* refactor: kubernetes, move SD struct from config into kubernetes discovery package
* refactor: notifier, use targetgroup package instead of config
* refactor: tests for file, marathon, triton SD - use targetgroup package instead of config.TargetGroup
* refactor: retrieval, use targetgroup package instead of config.TargetGroup
* refactor: storage, use config util package
* refactor: discovery manager, use targetgroup package instead of config.TargetGroup
* refactor: use HTTPClient and TLS config from configUtil instead of config
* refactor: tests, use targetgroup package instead of config.TargetGroup
* refactor: fix tagetgroup.Group pointers that were removed by mistake
* refactor: openstack, kubernetes: drop prefixes
* refactor: remove import aliases forced due to vscode bug
* refactor: move main SD struct out of config into discovery/config
* refactor: rename configUtil to config_util
* refactor: rename yamlUtil to yaml_config
* refactor: kubernetes, remove prefixes
* refactor: move the TargetGroup package to discovery/
* refactor: fix order of imports
											
										 
											2017-12-30 04:01:34 +08:00
										 |  |  | func (n *Node) Run(ctx context.Context, ch chan<- []*targetgroup.Group) { | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 	defer n.queue.ShutDown() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !cache.WaitForCacheSync(ctx.Done(), n.informer.HasSynced) { | 
					
						
							| 
									
										
										
										
											2019-10-09 17:51:38 +08:00
										 |  |  | 		if ctx.Err() != context.Canceled { | 
					
						
							|  |  |  | 			level.Error(n.logger).Log("msg", "node informer unable to sync cache") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 	go func() { | 
					
						
							| 
									
										
										
										
											2018-04-10 16:53:00 +08:00
										 |  |  | 		for n.process(ctx, ch) { | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	// Block until the target provider is explicitly canceled.
 | 
					
						
							|  |  |  | 	<-ctx.Done() | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-10 16:53:00 +08:00
										 |  |  | func (n *Node) process(ctx context.Context, ch chan<- []*targetgroup.Group) bool { | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 	keyObj, quit := n.queue.Get() | 
					
						
							|  |  |  | 	if quit { | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer n.queue.Done(keyObj) | 
					
						
							|  |  |  | 	key := keyObj.(string) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_, name, err := cache.SplitMetaNamespaceKey(key) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	o, exists, err := n.store.GetByKey(key) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if !exists { | 
					
						
							| 
									
										
										
										
											2020-02-19 00:36:57 +08:00
										 |  |  | 		send(ctx, ch, &targetgroup.Group{Source: nodeSourceFromName(name)}) | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 		return true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	node, err := convertToNode(o) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		level.Error(n.logger).Log("msg", "converting to Node object failed", "err", err) | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-02-19 00:36:57 +08:00
										 |  |  | 	send(ctx, ch, n.buildNode(node)) | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | 	return true | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-14 23:21:38 +08:00
										 |  |  | func convertToNode(o interface{}) (*apiv1.Node, error) { | 
					
						
							| 
									
										
										
										
											2017-09-04 19:10:44 +08:00
										 |  |  | 	node, ok := o.(*apiv1.Node) | 
					
						
							|  |  |  | 	if ok { | 
					
						
							|  |  |  | 		return node, nil | 
					
						
							| 
									
										
										
										
											2016-11-14 23:21:38 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-26 07:01:12 +08:00
										 |  |  | 	return nil, errors.Errorf("received unexpected object: %v", o) | 
					
						
							| 
									
										
										
										
											2016-11-14 23:21:38 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | func nodeSource(n *apiv1.Node) string { | 
					
						
							| 
									
										
										
										
											2018-04-26 00:36:22 +08:00
										 |  |  | 	return nodeSourceFromName(n.Name) | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-10 00:35:14 +08:00
										 |  |  | func nodeSourceFromName(name string) string { | 
					
						
							|  |  |  | 	return "node/" + name | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2019-04-10 20:21:42 +08:00
										 |  |  | 	nodeNameLabel               = metaLabelPrefix + "node_name" | 
					
						
							|  |  |  | 	nodeLabelPrefix             = metaLabelPrefix + "node_label_" | 
					
						
							|  |  |  | 	nodeLabelPresentPrefix      = metaLabelPrefix + "node_labelpresent_" | 
					
						
							|  |  |  | 	nodeAnnotationPrefix        = metaLabelPrefix + "node_annotation_" | 
					
						
							|  |  |  | 	nodeAnnotationPresentPrefix = metaLabelPrefix + "node_annotationpresent_" | 
					
						
							|  |  |  | 	nodeAddressPrefix           = metaLabelPrefix + "node_address_" | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | func nodeLabels(n *apiv1.Node) model.LabelSet { | 
					
						
							| 
									
										
										
										
											2019-10-26 10:06:00 +08:00
										 |  |  | 	// Each label and annotation will create two key-value pairs in the map.
 | 
					
						
							|  |  |  | 	ls := make(model.LabelSet, 2*(len(n.Labels)+len(n.Annotations))+1) | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	ls[nodeNameLabel] = lv(n.Name) | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	for k, v := range n.Labels { | 
					
						
							| 
									
										
										
										
											2019-04-10 20:21:42 +08:00
										 |  |  | 		ln := strutil.SanitizeLabelName(k) | 
					
						
							|  |  |  | 		ls[model.LabelName(nodeLabelPrefix+ln)] = lv(v) | 
					
						
							|  |  |  | 		ls[model.LabelName(nodeLabelPresentPrefix+ln)] = presentValue | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	for k, v := range n.Annotations { | 
					
						
							| 
									
										
										
										
											2019-04-10 20:21:42 +08:00
										 |  |  | 		ln := strutil.SanitizeLabelName(k) | 
					
						
							|  |  |  | 		ls[model.LabelName(nodeAnnotationPrefix+ln)] = lv(v) | 
					
						
							|  |  |  | 		ls[model.LabelName(nodeAnnotationPresentPrefix+ln)] = presentValue | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return ls | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Refactor SD configuration to remove `config` dependency (#3629)
* refactor: move targetGroup struct and CheckOverflow() to their own package
* refactor: move auth and security related structs to a utility package, fix import error in utility package
* refactor: Azure SD, remove SD struct from config
* refactor: DNS SD, remove SD struct from config into dns package
* refactor: ec2 SD, move SD struct from config into the ec2 package
* refactor: file SD, move SD struct from config to file discovery package
* refactor: gce, move SD struct from config to gce discovery package
* refactor: move HTTPClientConfig and URL into util/config, fix import error in httputil
* refactor: consul, move SD struct from config into consul discovery package
* refactor: marathon, move SD struct from config into marathon discovery package
* refactor: triton, move SD struct from config to triton discovery package, fix test
* refactor: zookeeper, move SD structs from config to zookeeper discovery package
* refactor: openstack, remove SD struct from config, move into openstack discovery package
* refactor: kubernetes, move SD struct from config into kubernetes discovery package
* refactor: notifier, use targetgroup package instead of config
* refactor: tests for file, marathon, triton SD - use targetgroup package instead of config.TargetGroup
* refactor: retrieval, use targetgroup package instead of config.TargetGroup
* refactor: storage, use config util package
* refactor: discovery manager, use targetgroup package instead of config.TargetGroup
* refactor: use HTTPClient and TLS config from configUtil instead of config
* refactor: tests, use targetgroup package instead of config.TargetGroup
* refactor: fix tagetgroup.Group pointers that were removed by mistake
* refactor: openstack, kubernetes: drop prefixes
* refactor: remove import aliases forced due to vscode bug
* refactor: move main SD struct out of config into discovery/config
* refactor: rename configUtil to config_util
* refactor: rename yamlUtil to yaml_config
* refactor: kubernetes, remove prefixes
* refactor: move the TargetGroup package to discovery/
* refactor: fix order of imports
											
										 
											2017-12-30 04:01:34 +08:00
										 |  |  | func (n *Node) buildNode(node *apiv1.Node) *targetgroup.Group { | 
					
						
							|  |  |  | 	tg := &targetgroup.Group{ | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 		Source: nodeSource(node), | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	tg.Labels = nodeLabels(node) | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	addr, addrMap, err := nodeAddress(node) | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2017-08-12 02:45:52 +08:00
										 |  |  | 		level.Warn(n.logger).Log("msg", "No node address found", "err", err) | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 		return nil | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	addr = net.JoinHostPort(addr, strconv.FormatInt(int64(node.Status.DaemonEndpoints.KubeletEndpoint.Port), 10)) | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	t := model.LabelSet{ | 
					
						
							|  |  |  | 		model.AddressLabel:  lv(addr), | 
					
						
							|  |  |  | 		model.InstanceLabel: lv(node.Name), | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	for ty, a := range addrMap { | 
					
						
							|  |  |  | 		ln := strutil.SanitizeLabelName(nodeAddressPrefix + string(ty)) | 
					
						
							|  |  |  | 		t[model.LabelName(ln)] = lv(a[0]) | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	tg.Targets = append(tg.Targets, t) | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	return tg | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // nodeAddresses returns the provided node's address, based on the priority:
 | 
					
						
							|  |  |  | // 1. NodeInternalIP
 | 
					
						
							| 
									
										
										
										
											2019-08-20 22:52:11 +08:00
										 |  |  | // 2. NodeInternalDNS
 | 
					
						
							|  |  |  | // 3. NodeExternalIP
 | 
					
						
							|  |  |  | // 4. NodeExternalDNS
 | 
					
						
							|  |  |  | // 5. NodeLegacyHostIP
 | 
					
						
							|  |  |  | // 6. NodeHostName
 | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | // Derived from k8s.io/kubernetes/pkg/util/node/node.go
 | 
					
						
							|  |  |  | func nodeAddress(node *apiv1.Node) (string, map[apiv1.NodeAddressType][]string, error) { | 
					
						
							|  |  |  | 	m := map[apiv1.NodeAddressType][]string{} | 
					
						
							|  |  |  | 	for _, a := range node.Status.Addresses { | 
					
						
							|  |  |  | 		m[a.Type] = append(m[a.Type], a.Address) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if addresses, ok := m[apiv1.NodeInternalIP]; ok { | 
					
						
							|  |  |  | 		return addresses[0], m, nil | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-08-20 22:52:11 +08:00
										 |  |  | 	if addresses, ok := m[apiv1.NodeInternalDNS]; ok { | 
					
						
							|  |  |  | 		return addresses[0], m, nil | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	if addresses, ok := m[apiv1.NodeExternalIP]; ok { | 
					
						
							|  |  |  | 		return addresses[0], m, nil | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-08-20 22:52:11 +08:00
										 |  |  | 	if addresses, ok := m[apiv1.NodeExternalDNS]; ok { | 
					
						
							|  |  |  | 		return addresses[0], m, nil | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:27 +08:00
										 |  |  | 	if addresses, ok := m[apiv1.NodeAddressType(NodeLegacyHostIP)]; ok { | 
					
						
							|  |  |  | 		return addresses[0], m, nil | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-07 20:53:11 +08:00
										 |  |  | 	if addresses, ok := m[apiv1.NodeHostName]; ok { | 
					
						
							|  |  |  | 		return addresses[0], m, nil | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-03-26 07:01:12 +08:00
										 |  |  | 	return "", m, errors.New("host address unknown") | 
					
						
							| 
									
										
										
										
											2016-07-01 22:55:37 +08:00
										 |  |  | } |