def deploy_monitoring_landscape( kubernetes_cfg: KubernetesConfig, concourse_cfg: ConcourseConfig, cfg_factory: ConfigFactory, ): # Set the global context to the cluster specified in KubernetesConfig kube_ctx.set_kubecfg(kubernetes_cfg.kubeconfig()) ensure_cluster_version(kubernetes_cfg) monitoring_namespace = kubernetes_cfg.monitoring().namespace() # deploy kube-state-metrics kube_state_metrics_helm_values = create_kube_state_metrics_helm_values( monitoring_cfg=kubernetes_cfg.monitoring()) execute_helm_deployment( kubernetes_cfg, monitoring_namespace, 'stable/kube-state-metrics', 'kube-state-metrics', kube_state_metrics_helm_values, ) # deploy postgresql exporter postgresql_helm_values = create_postgresql_helm_values( concourse_cfg=concourse_cfg, cfg_factory=cfg_factory, ) execute_helm_deployment( kubernetes_cfg, monitoring_namespace, 'stable/prometheus-postgres-exporter', 'prometheus-postgres-exporter', postgresql_helm_values, )
def deploy_gardenlinux_cache( kubernetes_config: KubernetesConfig, gardenlinux_cache_config: GardenlinuxCacheConfig, chart_dir: str, deployment_name: str, ): not_empty(deployment_name) cfg_factory = global_ctx().cfg_factory() chart_dir = os.path.abspath(chart_dir) kube_ctx.set_kubecfg(kubernetes_config.kubeconfig()) ensure_cluster_version(kubernetes_config) ingress_config = cfg_factory.ingress( gardenlinux_cache_config.ingress_config()) helm_values = create_gardenlinux_cache_helm_values( gardenlinux_cache_config=gardenlinux_cache_config, ingress_config=ingress_config, ) execute_helm_deployment( kubernetes_config, gardenlinux_cache_config.namespace(), chart_dir, deployment_name, helm_values, )
def deploy_oauth2_proxy( kubernetes_config: KubernetesConfig, oauth2_proxy_config: Oauth2ProxyConfig, deployment_name: str, ): not_empty(deployment_name) cfg_factory = global_ctx().cfg_factory() kube_ctx.set_kubecfg(kubernetes_config.kubeconfig()) ensure_cluster_version(kubernetes_config) ingress_config = cfg_factory.ingress(oauth2_proxy_config.ingress_config()) helm_values = create_oauth2_proxy_helm_values( oauth2_proxy_config=oauth2_proxy_config, ingress_config=ingress_config, deployment_name=deployment_name, ) execute_helm_deployment( kubernetes_config, oauth2_proxy_config.namespace(), 'stable/oauth2-proxy', deployment_name, helm_values, )
def deploy_tekton_dashboard_ingress( kubernetes_config: KubernetesConfig, tekton_dashboard_ingress_config: TektonDashboardIngressConfig, chart_dir: str, deployment_name: str, ): not_empty(deployment_name) cfg_factory = global_ctx().cfg_factory() chart_dir = os.path.abspath(chart_dir) kube_ctx.set_kubecfg(kubernetes_config.kubeconfig()) ensure_cluster_version(kubernetes_config) ingress_config = cfg_factory.ingress( tekton_dashboard_ingress_config.ingress_config()) helm_values = create_tekton_dashboard_helm_values( tekton_dashboard_ingress_config=tekton_dashboard_ingress_config, ingress_config=ingress_config, ) execute_helm_deployment( kubernetes_config, tekton_dashboard_ingress_config.namespace(), chart_dir, deployment_name, helm_values, )
def execute_helm_deployment( kubernetes_config: KubernetesConfig, namespace: str, chart_name: str, release_name: str, *values: dict, chart_version: str = None, ): yaml.add_representer(LiteralStr, literal_str_representer) helm_executable = ensure_helm_setup() # create namespace if absent namespace_helper = kube_ctx.namespace_helper() if not namespace_helper.get_namespace(namespace): namespace_helper.create_namespace(namespace) KUBECONFIG_FILE_NAME = "kubecfg" # prepare subprocess args using relative file paths for the values files subprocess_args = [ helm_executable, "upgrade", release_name, chart_name, "--install", "--force", "--recreate-pods", "--wait", "--namespace", namespace, ] if chart_version: subprocess_args += ["--version", chart_version] for idx, _ in enumerate(values): subprocess_args.append("--values") subprocess_args.append("value" + str(idx)) helm_env = os.environ.copy() helm_env['KUBECONFIG'] = KUBECONFIG_FILE_NAME # create temp dir containing all previously referenced files with tempfile.TemporaryDirectory() as temp_dir: for idx, value in enumerate(values): with open(os.path.join(temp_dir, "value" + str(idx)), 'w') as f: yaml.dump(value, f) with open(os.path.join(temp_dir, KUBECONFIG_FILE_NAME), 'w') as f: yaml.dump(kubernetes_config.kubeconfig(), f) # run helm from inside the temporary directory so that the prepared file paths work subprocess.run(subprocess_args, check=True, cwd=temp_dir, env=helm_env)
def ensure_cluster_version(kubernetes_config: KubernetesConfig): not_none(kubernetes_config) cluster_version_info = get_cluster_version_info() configured_version_info = kubernetes_config.cluster_version() if (cluster_version_info.major != configured_version_info['major'] or cluster_version_info.minor != configured_version_info['minor']): fail( 'cluster version mismatch "Major: {a_major} Minor: ' '{a_minor}". Expected "Major: {e_major} Minor: {e_minor}".'.format( a_major=cluster_version_info.major, a_minor=cluster_version_info.minor, e_major=configured_version_info['major'], e_minor=configured_version_info['minor'], ))