#95 add --kubeconfig-path and KubeconfigDiscoverer

This commit is contained in:
Henning Jacobs
2017-01-15 14:14:32 +01:00
parent 484d3e9a5e
commit 0c665e2339
3 changed files with 87 additions and 55 deletions

View File

@@ -1,4 +1,5 @@
import time
from pathlib import Path
from urllib.parse import urljoin
import kubernetes.client
@@ -116,3 +117,23 @@ class ClusterRegistryDiscoverer:
if now - self._last_cache_refresh > self._cache_lifetime:
self.refresh()
return self._clusters
class KubeconfigDiscoverer:
def __init__(self, kubeconfig_path: Path):
self._path = kubeconfig_path
def get_clusters(self):
# Kubernetes Python client expects "vintage" string path
config_file = str(self._path)
contexts, current_context = kubernetes.config.list_kube_config_contexts(config_file)
for context in contexts:
config = kubernetes.client.ConfigurationObject()
kubernetes.config.load_kube_config(config_file, context=context['name'], client_configuration=config)
cluster = Cluster(
context['name'],
config.host,
ssl_ca_cert=config.ssl_ca_cert,
auth=StaticTokenAuth(config.api_key['authorization'].split(' ', 1)[-1]))
yield cluster

View File

@@ -51,8 +51,7 @@ def request(cluster, path, **kwargs):
return session.get(urljoin(cluster.api_server_url, path), auth=cluster.auth, verify=cluster.ssl_ca_cert, **kwargs)
def get_kubernetes_clusters(cluster_discoverer):
for cluster in cluster_discoverer.get_clusters():
def get_kubernetes_cluster(cluster):
cluster_id = cluster.id
api_server_url = cluster.api_server_url
response = request(cluster, '/api/v1/nodes')
@@ -107,4 +106,13 @@ def get_kubernetes_clusters(cluster_discoverer):
container['resources']['usage'] = container_metrics['usage']
except:
logger.exception('Failed to get pod metrics')
yield {'id': cluster_id, 'api_server_url': api_server_url, 'nodes': nodes, 'unassigned_pods': unassigned_pods}
return {'id': cluster_id, 'api_server_url': api_server_url, 'nodes': nodes, 'unassigned_pods': unassigned_pods}
def get_kubernetes_clusters(cluster_discoverer):
for cluster in cluster_discoverer.get_clusters():
try:
data = get_kubernetes_cluster(cluster)
yield data
except:
logger.exception('Failed to query cluster {} ({})'.format(cluster.id, cluster.api_server_url))

View File

@@ -26,7 +26,7 @@ from urllib.parse import urljoin
from .mock import get_mock_clusters
from .kubernetes import get_kubernetes_clusters
from .stores import MemoryStore, RedisStore
from .cluster_discovery import DEFAULT_CLUSTERS, StaticClusterDiscoverer, ClusterRegistryDiscoverer
from .cluster_discovery import DEFAULT_CLUSTERS, StaticClusterDiscoverer, ClusterRegistryDiscoverer, KubeconfigDiscoverer
logger = logging.getLogger(__name__)
@@ -217,7 +217,8 @@ def print_version(ctx, param, value):
@click.option('--clusters', help='Comma separated list of Kubernetes API server URLs (default: {})'.format(DEFAULT_CLUSTERS),
envvar='CLUSTERS')
@click.option('--cluster-registry-url', help='URL to cluster registry', envvar='CLUSTER_REGISTRY_URL')
def main(port, debug, mock, secret_key, redis_url, clusters, cluster_registry_url):
@click.option('--kubeconfig-path', type=click.Path(exists=True), help='Path to kubeconfig file', envvar='KUBECONFIG_PATH')
def main(port, debug, mock, secret_key, redis_url, clusters, cluster_registry_url, kubeconfig_path):
logging.basicConfig(level=logging.DEBUG if debug else logging.INFO)
store = RedisStore(redis_url) if redis_url else MemoryStore()
@@ -228,6 +229,8 @@ def main(port, debug, mock, secret_key, redis_url, clusters, cluster_registry_ur
if cluster_registry_url:
discoverer = ClusterRegistryDiscoverer(cluster_registry_url)
elif kubeconfig_path:
discoverer = KubeconfigDiscoverer(Path(kubeconfig_path))
else:
api_server_urls = clusters.split(',') if clusters else []
discoverer = StaticClusterDiscoverer(api_server_urls)