From 941abab902cdd7084e5d7c9a2f7e3ae001b19b60 Mon Sep 17 00:00:00 2001 From: itscalvinwang Date: Mon, 7 Dec 2020 21:14:23 -0800 Subject: [PATCH] make clean after testing --- assets/index.yaml | 18 - assets/kubecost/cost-analyzer-1.70.000.tgz | Bin 137258 -> 0 bytes charts/kubecost/Chart.yaml | 10 - charts/kubecost/app-readme.md | 23 - charts/kubecost/attached-disks.json | 425 -- charts/kubecost/charts/grafana/Chart.yaml | 15 - charts/kubecost/charts/grafana/README.md | 162 - .../charts/grafana/templates/NOTES.txt | 37 - .../charts/grafana/templates/_helpers.tpl | 43 - .../charts/grafana/templates/clusterrole.yaml | 25 - .../grafana/templates/clusterrolebinding.yaml | 25 - .../configmap-dashboard-provider.yaml | 28 - .../charts/grafana/templates/configmap.yaml | 76 - .../templates/dashboards-json-configmap.yaml | 24 - .../charts/grafana/templates/deployment.yaml | 272 - .../charts/grafana/templates/ingress.yaml | 44 - .../grafana/templates/podsecuritypolicy.yaml | 42 - .../charts/grafana/templates/pvc.yaml | 26 - .../charts/grafana/templates/role.yaml | 20 - .../charts/grafana/templates/rolebinding.yaml | 20 - .../charts/grafana/templates/secret.yaml | 22 - .../charts/grafana/templates/service.yaml | 51 - .../grafana/templates/serviceaccount.yaml | 13 - charts/kubecost/charts/grafana/values.yaml | 275 - charts/kubecost/charts/prometheus/.helmignore | 23 - charts/kubecost/charts/prometheus/Chart.yaml | 18 - charts/kubecost/charts/prometheus/README.md | 471 -- .../charts/kube-state-metrics/.helmignore | 21 - .../charts/kube-state-metrics/Chart.yaml | 20 - .../charts/kube-state-metrics/OWNERS | 8 - .../charts/kube-state-metrics/README.md | 73 - .../kube-state-metrics/templates/NOTES.txt | 10 - .../kube-state-metrics/templates/_helpers.tpl | 47 - .../templates/clusterrole.yaml | 180 - .../templates/clusterrolebinding.yaml | 19 - .../templates/deployment.yaml | 186 - .../templates/podsecuritypolicy.yaml | 39 - .../templates/psp-clusterrole.yaml | 17 - .../templates/psp-clusterrolebinding.yaml | 19 - .../kube-state-metrics/templates/service.yaml | 36 - .../templates/serviceaccount.yaml | 14 - .../templates/servicemonitor.yaml | 25 - .../templates/stsdiscovery-role.yaml | 27 - .../templates/stsdiscovery-rolebinding.yaml | 20 - .../charts/kube-state-metrics/values.yaml | 126 - .../charts/prometheus/requirements.yaml | 7 - .../charts/prometheus/templates/NOTES.txt | 112 - .../charts/prometheus/templates/_helpers.tpl | 276 - .../templates/alertmanager-clusterrole.yaml | 23 - .../alertmanager-clusterrolebinding.yaml | 18 - .../templates/alertmanager-configmap.yaml | 20 - .../templates/alertmanager-deployment.yaml | 141 - .../templates/alertmanager-ingress.yaml | 44 - .../templates/alertmanager-networkpolicy.yaml | 21 - .../templates/alertmanager-pdb.yaml | 15 - .../alertmanager-podsecuritypolicy.yaml | 50 - .../templates/alertmanager-pvc.yaml | 34 - .../alertmanager-service-headless.yaml | 32 - .../templates/alertmanager-service.yaml | 54 - .../alertmanager-serviceaccount.yaml | 10 - .../templates/alertmanager-statefulset.yaml | 154 - .../templates/node-exporter-daemonset.yaml | 125 - .../node-exporter-podsecuritypolicy.yaml | 57 - .../templates/node-exporter-role.yaml | 19 - .../templates/node-exporter-rolebinding.yaml | 21 - .../templates/node-exporter-service.yaml | 46 - .../node-exporter-serviceaccount.yaml | 10 - .../templates/pushgateway-clusterrole.yaml | 23 - .../pushgateway-clusterrolebinding.yaml | 18 - .../templates/pushgateway-deployment.yaml | 99 - .../templates/pushgateway-ingress.yaml | 41 - .../templates/pushgateway-networkpolicy.yaml | 21 - .../prometheus/templates/pushgateway-pdb.yaml | 15 - .../pushgateway-podsecuritypolicy.yaml | 46 - .../prometheus/templates/pushgateway-pvc.yaml | 32 - .../templates/pushgateway-service.yaml | 42 - .../templates/pushgateway-serviceaccount.yaml | 10 - .../templates/server-clusterrole.yaml | 49 - .../templates/server-clusterrolebinding.yaml | 18 - .../templates/server-configmap.yaml | 83 - .../templates/server-deployment.yaml | 216 - .../prometheus/templates/server-ingress.yaml | 46 - .../templates/server-networkpolicy.yaml | 19 - .../prometheus/templates/server-pdb.yaml | 15 - .../templates/server-podsecuritypolicy.yaml | 55 - .../prometheus/templates/server-pvc.yaml | 36 - .../templates/server-service-headless.yaml | 28 - .../prometheus/templates/server-service.yaml | 61 - .../templates/server-serviceaccount.yaml | 12 - .../templates/server-statefulset.yaml | 224 - .../prometheus/templates/server-vpa.yaml | 26 - charts/kubecost/charts/prometheus/values.yaml | 1387 ---- charts/kubecost/charts/thanos/.helmignore | 21 - charts/kubecost/charts/thanos/Chart.yaml | 18 - .../kubecost/charts/thanos/requirements.yaml | 0 .../charts/thanos/templates/NOTES.txt | 0 .../charts/thanos/templates/_helpers.tpl | 51 - .../thanos/templates/bucket-deployment.yaml | 87 - .../thanos/templates/bucket-ingress.yaml | 42 - .../templates/bucket-poddisruptionbudget.yaml | 27 - .../thanos/templates/bucket-service.yaml | 30 - .../thanos/templates/compact-deployment.yaml | 108 - .../charts/thanos/templates/compact-pvc.yaml | 27 - .../thanos/templates/compact-service.yaml | 30 - .../templates/compact-servicemonitor.yaml | 32 - .../thanos/templates/query-deployment.yaml | 148 - .../templates/query-frontend-deployment.yaml | 122 - ...uery-frontend-horizontalpodautoscaler.yaml | 37 - .../templates/query-frontend-ingress.yml | 45 - .../query-frontend-poddisruptionbudget.yaml | 27 - .../templates/query-frontend-service.yaml | 34 - .../query-frontend-servicemonitor.yaml | 32 - .../query-horizontalpodautoscaler.yaml | 37 - .../charts/thanos/templates/query-ingress.yml | 89 - .../templates/query-poddisruptionbudget.yaml | 27 - .../thanos/templates/query-service.yaml | 65 - .../templates/query-servicemonitor.yaml | 32 - .../thanos/templates/sidecar-service.yaml | 61 - .../templates/sidecar-servicemonitor.yaml | 32 - .../thanos/templates/store-deployment.yaml | 121 - .../thanos/templates/store-ingress.yaml | 85 - .../thanos/templates/store-service.yaml | 65 - .../templates/store-servicemonitor.yaml | 32 - charts/kubecost/charts/thanos/values.yaml | 739 --- charts/kubecost/cluster-metrics.json | 1663 ----- charts/kubecost/cluster-utilization.json | 3473 ---------- charts/kubecost/deployment-utilization.json | 1366 ---- charts/kubecost/label-cost-utilization.json | 1193 ---- charts/kubecost/logo.png | Bin 28017 -> 0 bytes charts/kubecost/namespace-utilization.json | 1156 ---- charts/kubecost/node-utilization.json | 1370 ---- charts/kubecost/pod-utilization.json | 798 --- charts/kubecost/prom-benchmark.json | 5670 ----------------- charts/kubecost/questions.yml | 160 - charts/kubecost/templates/NOTES.txt | 10 - charts/kubecost/templates/_helpers.tpl | 200 - .../templates/aws-service-key-secret.yaml | 17 - .../awsstore-deployment-template.yaml | 26 - .../awsstore-service-account-template.yaml | 12 - .../templates/azure-service-key-secret.yaml | 21 - .../cost-analyzer-alerts-configmap.yaml | 12 - .../cost-analyzer-checks-template.yaml | 63 - .../cost-analyzer-cluser-role-template.yaml | 105 - ...nalyzer-cluster-role-binding-template.yaml | 33 - .../cost-analyzer-config-map-template.yaml | 30 - .../cost-analyzer-db-pvc-template.yaml | 29 - .../cost-analyzer-deployment-template.yaml | 672 -- ...analyzer-frontend-config-map-template.yaml | 174 - .../cost-analyzer-ingress-template.yaml | 40 - ...zer-network-costs-config-map-template.yaml | 15 - ...zer-network-costs-podmonitor-template.yaml | 31 - .../cost-analyzer-network-costs-template.yaml | 93 - .../cost-analyzer-network-policy.yaml | 19 - .../cost-analyzer-pkey-configmap.yaml | 16 - .../cost-analyzer-postgres-deployment.yaml | 49 - .../templates/cost-analyzer-postgres-pv.yaml | 22 - .../templates/cost-analyzer-postgres-pvc.yaml | 20 - .../cost-analyzer-postgres-service.yaml | 22 - .../cost-analyzer-pricing-configmap.yaml | 121 - ...rometheus-postgres-adapter-deployment.yaml | 53 - ...r-prometheus-postgres-adapter-service.yaml | 20 - ...cost-analyzer-prometheusrule-template.yaml | 21 - .../cost-analyzer-psp-role.template.yaml | 18 - ...ost-analyzer-psp-rolebinding.template.yaml | 16 - .../templates/cost-analyzer-psp.template.yaml | 20 - .../templates/cost-analyzer-pvc-template.yaml | 25 - ...ost-analyzer-saml-config-map-template.yaml | 13 - .../cost-analyzer-server-configmap.yaml | 69 - ...ost-analyzer-service-account-template.yaml | 12 - .../cost-analyzer-service-template.yaml | 69 - ...cost-analyzer-servicemonitor-template.yaml | 27 - .../external-grafana-config-map-template.yaml | 10 - ...rafana-attached-disk-metrics-template.yaml | 25 - ...na-dashboard-cluster-metrics-template.yaml | 27 - ...ashboard-cluster-utilization-template.yaml | 25 - ...board-deployment-utilization-template.yaml | 25 - ...board-label-cost-utilization-template.yaml | 25 - ...hboard-namespace-utilization-template.yaml | 25 - ...a-dashboard-node-utilization-template.yaml | 25 - ...na-dashboard-pod-utilization-template.yaml | 25 - ...dashboard-prometheus-metrics-template.yaml | 25 - .../grafana-datasource-template.yaml | 72 - .../kubecost-cluster-controller-template.yaml | 282 - ...st-cluster-manager-configmap-template.yaml | 13 - .../kubecost-priority-class-template.yaml | 11 - .../templates/network-costs-psp.template.yaml | 24 - .../network-costs-role.template.yaml | 22 - .../network-costs-rolebinding.template.yaml | 20 - charts/kubecost/values-thanos.yaml | 117 - charts/kubecost/values.yaml | 561 -- index.yaml | 18 - 191 files changed, 29750 deletions(-) delete mode 100644 assets/index.yaml delete mode 100644 assets/kubecost/cost-analyzer-1.70.000.tgz delete mode 100644 charts/kubecost/Chart.yaml delete mode 100644 charts/kubecost/app-readme.md delete mode 100644 charts/kubecost/attached-disks.json delete mode 100644 charts/kubecost/charts/grafana/Chart.yaml delete mode 100644 charts/kubecost/charts/grafana/README.md delete mode 100644 charts/kubecost/charts/grafana/templates/NOTES.txt delete mode 100644 charts/kubecost/charts/grafana/templates/_helpers.tpl delete mode 100644 charts/kubecost/charts/grafana/templates/clusterrole.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/clusterrolebinding.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/configmap-dashboard-provider.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/configmap.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/dashboards-json-configmap.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/deployment.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/ingress.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/podsecuritypolicy.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/pvc.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/role.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/rolebinding.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/secret.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/service.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/serviceaccount.yaml delete mode 100644 charts/kubecost/charts/grafana/values.yaml delete mode 100644 charts/kubecost/charts/prometheus/.helmignore delete mode 100644 charts/kubecost/charts/prometheus/Chart.yaml delete mode 100644 charts/kubecost/charts/prometheus/README.md delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/.helmignore delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/Chart.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/OWNERS delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/README.md delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/NOTES.txt delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/_helpers.tpl delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrole.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/deployment.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/podsecuritypolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrole.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/service.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/serviceaccount.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/servicemonitor.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-role.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-rolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/values.yaml delete mode 100644 charts/kubecost/charts/prometheus/requirements.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/NOTES.txt delete mode 100644 charts/kubecost/charts/prometheus/templates/_helpers.tpl delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-clusterrole.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-clusterrolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-configmap.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-deployment.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-ingress.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-networkpolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-pdb.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-podsecuritypolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-pvc.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-service-headless.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-service.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-serviceaccount.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-statefulset.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/node-exporter-daemonset.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/node-exporter-podsecuritypolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/node-exporter-role.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/node-exporter-rolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/node-exporter-service.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/node-exporter-serviceaccount.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-clusterrole.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-clusterrolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-deployment.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-ingress.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-networkpolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-pdb.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-podsecuritypolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-pvc.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-service.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-serviceaccount.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-clusterrole.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-clusterrolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-configmap.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-deployment.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-ingress.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-networkpolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-pdb.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-podsecuritypolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-pvc.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-service-headless.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-service.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-serviceaccount.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-statefulset.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-vpa.yaml delete mode 100644 charts/kubecost/charts/prometheus/values.yaml delete mode 100644 charts/kubecost/charts/thanos/.helmignore delete mode 100644 charts/kubecost/charts/thanos/Chart.yaml delete mode 100644 charts/kubecost/charts/thanos/requirements.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/NOTES.txt delete mode 100644 charts/kubecost/charts/thanos/templates/_helpers.tpl delete mode 100644 charts/kubecost/charts/thanos/templates/bucket-deployment.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/bucket-ingress.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/bucket-poddisruptionbudget.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/bucket-service.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/compact-deployment.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/compact-pvc.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/compact-service.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/compact-servicemonitor.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-deployment.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-frontend-deployment.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-frontend-horizontalpodautoscaler.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-frontend-ingress.yml delete mode 100644 charts/kubecost/charts/thanos/templates/query-frontend-poddisruptionbudget.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-frontend-service.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-frontend-servicemonitor.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-horizontalpodautoscaler.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-ingress.yml delete mode 100644 charts/kubecost/charts/thanos/templates/query-poddisruptionbudget.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-service.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-servicemonitor.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/sidecar-service.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/sidecar-servicemonitor.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/store-deployment.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/store-ingress.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/store-service.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/store-servicemonitor.yaml delete mode 100644 charts/kubecost/charts/thanos/values.yaml delete mode 100644 charts/kubecost/cluster-metrics.json delete mode 100644 charts/kubecost/cluster-utilization.json delete mode 100644 charts/kubecost/deployment-utilization.json delete mode 100644 charts/kubecost/label-cost-utilization.json delete mode 100644 charts/kubecost/logo.png delete mode 100644 charts/kubecost/namespace-utilization.json delete mode 100644 charts/kubecost/node-utilization.json delete mode 100644 charts/kubecost/pod-utilization.json delete mode 100644 charts/kubecost/prom-benchmark.json delete mode 100644 charts/kubecost/questions.yml delete mode 100644 charts/kubecost/templates/NOTES.txt delete mode 100644 charts/kubecost/templates/_helpers.tpl delete mode 100644 charts/kubecost/templates/aws-service-key-secret.yaml delete mode 100644 charts/kubecost/templates/awsstore-deployment-template.yaml delete mode 100644 charts/kubecost/templates/awsstore-service-account-template.yaml delete mode 100644 charts/kubecost/templates/azure-service-key-secret.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-alerts-configmap.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-checks-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-cluser-role-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-cluster-role-binding-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-config-map-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-db-pvc-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-deployment-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-frontend-config-map-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-ingress-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-network-costs-config-map-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-network-costs-podmonitor-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-network-costs-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-network-policy.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-pkey-configmap.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-postgres-deployment.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-postgres-pv.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-postgres-pvc.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-postgres-service.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-pricing-configmap.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-deployment.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-service.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-prometheusrule-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-psp-role.template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-psp-rolebinding.template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-psp.template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-pvc-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-saml-config-map-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-server-configmap.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-service-account-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-service-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-servicemonitor-template.yaml delete mode 100644 charts/kubecost/templates/external-grafana-config-map-template.yaml delete mode 100644 charts/kubecost/templates/grafana-attached-disk-metrics-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-cluster-metrics-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-cluster-utilization-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-deployment-utilization-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-label-cost-utilization-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-namespace-utilization-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-node-utilization-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-pod-utilization-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-prometheus-metrics-template.yaml delete mode 100644 charts/kubecost/templates/grafana-datasource-template.yaml delete mode 100644 charts/kubecost/templates/kubecost-cluster-controller-template.yaml delete mode 100644 charts/kubecost/templates/kubecost-cluster-manager-configmap-template.yaml delete mode 100644 charts/kubecost/templates/kubecost-priority-class-template.yaml delete mode 100644 charts/kubecost/templates/network-costs-psp.template.yaml delete mode 100644 charts/kubecost/templates/network-costs-role.template.yaml delete mode 100644 charts/kubecost/templates/network-costs-rolebinding.template.yaml delete mode 100644 charts/kubecost/values-thanos.yaml delete mode 100644 charts/kubecost/values.yaml delete mode 100644 index.yaml diff --git a/assets/index.yaml b/assets/index.yaml deleted file mode 100644 index ae27c22ec..000000000 --- a/assets/index.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -entries: - cost-analyzer: - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/namespace: kubecost - catalog.cattle.io/release-name: kubecost - apiVersion: v1 - appVersion: 1.70.0 - created: "2020-12-07T19:54:38.126920477-08:00" - description: A Helm chart that sets up Kubecost, Prometheus, and Grafana to monitor - cloud costs. - digest: 02744210876d3559b7713e24931ff5574910c201a6ed78ecef3f36d41a76c859 - name: cost-analyzer - urls: - - assets/kubecost/cost-analyzer-1.70.000.tgz - version: 1.70.000 -generated: "2020-12-07T19:54:38.104011356-08:00" diff --git a/assets/kubecost/cost-analyzer-1.70.000.tgz b/assets/kubecost/cost-analyzer-1.70.000.tgz deleted file mode 100644 index 9895716b9346cb2ae589bccf6986352687c41131..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137258 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

%0~^(jqQZm%&@ApdpJ8IEFMc7$)DXtg+%- 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 diff --git a/charts/kubecost/Chart.yaml b/charts/kubecost/Chart.yaml deleted file mode 100644 index 0049291f9..000000000 --- a/charts/kubecost/Chart.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -appVersion: 1.70.0 -description: A Helm chart that sets up Kubecost, Prometheus, and Grafana to monitor - cloud costs. -name: cost-analyzer -version: 1.70.000 -annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/namespace: kubecost - catalog.cattle.io/release-name: kubecost diff --git a/charts/kubecost/app-readme.md b/charts/kubecost/app-readme.md deleted file mode 100644 index dfb1e5854..000000000 --- a/charts/kubecost/app-readme.md +++ /dev/null @@ -1,23 +0,0 @@ -# Kubecost -[Kubecost](https://kubecost.com/) is an open-source Kubernetes cost monitoring solution. - -Kubecost gives teams visibility into current and historical Kubernetes spend and resource allocation. These models provide cost transparency in Kubernetes environments that support multiple applications, teams, departments, etc. - -To see more on the functionality of the full Kubecost product, please visit the [features page](https://kubecost.com/#features) on our website. - -Here is a summary of features enabled by this cost model: - -- Real-time cost allocation by Kubernetes service, deployment, namespace, label, statefulset, daemonset, pod, and container -- Dynamic asset pricing enabled by integrations with AWS, Azure, and GCP billing APIs -- Supports on-prem k8s clusters with custom pricing sheets -- Allocation for in-cluster resources like CPU, GPU, memory, and persistent volumes. -- Allocation for AWS & GCP out-of-cluster resources like RDS instances and S3 buckets with key (optional) -- Easily export pricing data to Prometheus with /metrics endpoint ([learn more](PROMETHEUS.md)) -- Free and open source distribution (Apache2 license) - -## Requirements -- Kubernetes 1.8+ -- kube-state-metrics -- Grafana -- Prometheus -- Node Exporter diff --git a/charts/kubecost/attached-disks.json b/charts/kubecost/attached-disks.json deleted file mode 100644 index 0ae9d4411..000000000 --- a/charts/kubecost/attached-disks.json +++ /dev/null @@ -1,425 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": 10, - "iteration": 1589748792557, - "links": [], - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_fs_limit_bytes{instance=~'$disk', device!=\"tmpfs\", id=\"/\"}) by (instance)", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Disk Size", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_fs_usage_bytes{instance=~'$disk',id=\"/\"}) by (instance) / sum(container_fs_limit_bytes{instance=~'$disk',device!=\"tmpfs\", id=\"/\"}) by (instance)", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Disk Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - sum(container_fs_inodes_free{instance=~'$disk',id=\"/\"}) by (instance) / sum(container_fs_inodes_total{instance=~'$disk',id=\"/\"}) by (instance)", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "iNode Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_fs_usage_bytes{instance=~'$disk',id=\"/\"}) by (instance)", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Disk Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "schemaVersion": 16, - "style": "dark", - "tags": [ - "cost", - "utilization", - "metrics" - ], - "templating": { - "list": [ - { - "allValue": null, - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "disk", - "options": [], - "query": "query_result(sum(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance))", - "refresh": 1, - "regex": "/instance=\\\"(.*?)(\\\")/", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-7d", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "", - "title": "Attached disk metrics", - "uid": "nBH7qBgMk", - "version": 2 -} diff --git a/charts/kubecost/charts/grafana/Chart.yaml b/charts/kubecost/charts/grafana/Chart.yaml deleted file mode 100644 index eb46b5995..000000000 --- a/charts/kubecost/charts/grafana/Chart.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -appVersion: 6.0.0 -description: The leading tool for querying and visualizing time series and metrics. -home: https://grafana.net -icon: https://raw.githubusercontent.com/grafana/grafana/master/public/img/logo_transparent_400x.png -kubeVersion: ^1.8.0-0 -maintainers: -- email: zanhsieh@gmail.com - name: zanhsieh -- email: rluckie@cisco.com - name: rtluckie -name: grafana -sources: -- https://github.com/grafana/grafana -version: 1.17.2 diff --git a/charts/kubecost/charts/grafana/README.md b/charts/kubecost/charts/grafana/README.md deleted file mode 100644 index 03c70b520..000000000 --- a/charts/kubecost/charts/grafana/README.md +++ /dev/null @@ -1,162 +0,0 @@ -# Grafana Helm Chart - -* Installs the web dashboarding system [Grafana](http://grafana.org/) - -## TL;DR; - -```console -$ helm install stable/grafana -``` - -## Installing the Chart - -To install the chart with the release name `my-release`: - -```console -$ helm install --name my-release stable/grafana -``` - -## Uninstalling the Chart - -To uninstall/delete the my-release deployment: - -```console -$ helm delete my-release -``` - -The command removes all the Kubernetes components associated with the chart and deletes the release. - - -## Configuration - -| Parameter | Description | Default | -|---------------------------------|-----------------------------------------------|---------------------------------------------------------| -| `replicas` | Number of nodes | `1` | -| `deploymentStrategy` | Deployment strategy | `RollingUpdate` | -| `livenessProbe` | Liveness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } "initialDelaySeconds": 60, "timeoutSeconds": 30, "failureThreshold": 10 }` | -| `readinessProbe` | Rediness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } }`| -| `securityContext` | Deployment securityContext | `{"runAsUser": 472, "fsGroup": 472}` | -| `image.repository` | Image repository | `grafana/grafana` | -| `image.tag` | Image tag. (`Must be >= 5.0.0`) | `5.3.1` | -| `image.pullPolicy` | Image pull policy | `IfNotPresent` | -| `service.type` | Kubernetes service type | `ClusterIP` | -| `service.port` | Kubernetes port where service is exposed | `80` | -| `service.annotations` | Service annotations | `{}` | -| `service.labels` | Custom labels | `{}` | -| `ingress.enabled` | Enables Ingress | `false` | -| `ingress.annotations` | Ingress annotations | `{}` | -| `ingress.labels` | Custom labels | `{}` | -| `ingress.hosts` | Ingress accepted hostnames | `[]` | -| `ingress.tls` | Ingress TLS configuration | `[]` | -| `resources` | CPU/Memory resource requests/limits | `{}` | -| `nodeSelector` | Node labels for pod assignment | `{}` | -| `tolerations` | Toleration labels for pod assignment | `[]` | -| `affinity` | Affinity settings for pod assignment | `{}` | -| `persistence.enabled` | Use persistent volume to store data | `false` | -| `persistence.size` | Size of persistent volume claim | `10Gi` | -| `persistence.existingClaim` | Use an existing PVC to persist data | `nil` | -| `persistence.storageClassName` | Type of persistent volume claim | `nil` | -| `persistence.accessModes` | Persistence access modes | `[]` | -| `persistence.subPath` | Mount a sub dir of the persistent volume | `""` | -| `schedulerName` | Alternate scheduler name | `nil` | -| `env` | Extra environment variables passed to pods | `{}` | -| `envFromSecret` | Name of a Kubenretes secret (must be manually created in the same namespace) containing values to be added to the environment | `""` | -| `extraSecretMounts` | Additional grafana server secret mounts | `[]` | -| `plugins` | Plugins to be loaded along with Grafana | `[]` | -| `datasources` | Configure grafana datasources | `{}` | -| `dashboardProviders` | Configure grafana dashboard providers | `{}` | -| `dashboards` | Dashboards to import | `{}` | -| `dashboardsConfigMaps` | ConfigMaps reference that contains dashboards | `{}` | -| `grafana.ini` | Grafana's primary configuration | `{}` | -| `ldap.existingSecret` | The name of an existing secret containing the `ldap.toml` file, this must have the key `ldap-toml`. | `""` | -| `ldap.config ` | Grafana's LDAP configuration | `""` | -| `annotations` | Deployment annotations | `{}` | -| `podAnnotations` | Pod annotations | `{}` | -| `sidecar.dashboards.enabled` | Enabled the cluster wide search for dashboards and adds/updates/deletes them in grafana | `false` | -| `sidecar.dashboards.label` | Label that config maps with dashboards should have to be added | `false` | -| `sidecar.datasources.enabled` | Enabled the cluster wide search for datasources and adds/updates/deletes them in grafana |`false` | -| `sidecar.datasources.label` | Label that config maps with datasources should have to be added | `false` | -| `smtp.existingSecret` | The name of an existing secret containing the SMTP credentials, this must have the keys `user` and `password`. | `""` | - -## Sidecar for dashboards - -If the parameter `sidecar.dashboards.enabled` is set, a sidecar container is deployed in the grafana pod. This container watches all config maps in the cluster and filters out the ones with a label as defined in `sidecar.dashboards.label`. The files defined in those configmaps are written to a folder and accessed by grafana. Changes to the configmaps are monitored and the imported dashboards are deleted/updated. A recommendation is to use one configmap per dashboard, as an reduction of multiple dashboards inside one configmap is currently not properly mirrored in grafana. -Example dashboard config: -``` -apiVersion: v1 -kind: ConfigMap -metadata: - name: sample-grafana-dashboard - labels: - grafana_dashboard: 1 -data: - k8s-dashboard.json: |- - [...] -``` - -## Sidecar for datasources - -If the parameter `sidecar.datasource.enabled` is set, a sidecar container is deployed in the grafana pod. This container watches all config maps in the cluster and filters out the ones with a label as defined in `sidecar.datasources.label`. The files defined in those configmaps are written to a folder and accessed by grafana on startup. Using these yaml files, the data sources in grafana can be modified. - -Example datasource config adapted from [Grafana](http://docs.grafana.org/administration/provisioning/#example-datasource-config-file): -``` -apiVersion: v1 -kind: ConfigMap -metadata: - name: sample-grafana-datasource - labels: - grafana_datasource: 1 -data: - datasource.yaml: |- - # config file version - apiVersion: 1 - - # list of datasources that should be deleted from the database - deleteDatasources: - - name: Graphite - orgId: 1 - - # list of datasources to insert/update depending - # whats available in the database - datasources: - # name of the datasource. Required - - name: Graphite - # datasource type. Required - type: graphite - # access mode. proxy or direct (Server or Browser in the UI). Required - access: proxy - # org id. will default to orgId 1 if not specified - orgId: 1 - # url - url: http://localhost:8080 - # database password, if used - password: - # database user, if used - user: - # database name, if used - database: - # enable/disable basic auth - basicAuth: - # basic auth username - basicAuthUser: - # basic auth password - basicAuthPassword: - # enable/disable with credentials headers - withCredentials: - # mark as default datasource. Max one per org - isDefault: - # fields that will be converted to json and stored in json_data - jsonData: - graphiteVersion: "1.1" - tlsAuth: true - tlsAuthWithCACert: true - # json object of data that will be encrypted. - secureJsonData: - tlsCACert: "..." - tlsClientCert: "..." - tlsClientKey: "..." - version: 1 - # allow users to edit datasources from the UI. - editable: false - -``` diff --git a/charts/kubecost/charts/grafana/templates/NOTES.txt b/charts/kubecost/charts/grafana/templates/NOTES.txt deleted file mode 100644 index 57e84cd69..000000000 --- a/charts/kubecost/charts/grafana/templates/NOTES.txt +++ /dev/null @@ -1,37 +0,0 @@ -1. Get your '{{ .Values.adminUser }}' user password by running: - - kubectl get secret --namespace {{ .Release.Namespace }} {{ template "grafana.fullname" . }} -o jsonpath="{.data.admin-password}" | base64 --decode ; echo - -2. The Grafana server can be accessed via port {{ .Values.service.port }} on the following DNS name from within your cluster: - - {{ template "grafana.fullname" . }}.{{ .Release.Namespace }}.svc -{{ if .Values.ingress.enabled }} - From outside the cluster, the server URL(s) are: -{{- range .Values.ingress.hosts }} - http://{{ . }} -{{- end }} -{{ else }} - Get the Grafana URL to visit by running these commands in the same shell: -{{ if contains "NodePort" .Values.service.type -}} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "grafana.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{ else if contains "LoadBalancer" .Values.service.type -}} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "grafana.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "grafana.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - http://$SERVICE_IP:{{ .Values.service.port -}} -{{ else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "grafana.fullname" . }},component={{ .Values.name }}" -o jsonpath="{.items[0].metadata.name}") - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 3000 -{{- end }} -{{- end }} - -3. Login with the password from step 1 and the username: {{ .Values.adminUser }} - -{{- if not .Values.persistence.enabled }} -################################################################################# -###### WARNING: Persistence is disabled!!! You will lose your data when ##### -###### the Grafana pod is terminated. ##### -################################################################################# -{{- end }} diff --git a/charts/kubecost/charts/grafana/templates/_helpers.tpl b/charts/kubecost/charts/grafana/templates/_helpers.tpl deleted file mode 100644 index 3a3ebd3ec..000000000 --- a/charts/kubecost/charts/grafana/templates/_helpers.tpl +++ /dev/null @@ -1,43 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "grafana.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "grafana.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "grafana.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create the name of the service account -*/}} -{{- define "grafana.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "grafana.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/charts/grafana/templates/clusterrole.yaml b/charts/kubecost/charts/grafana/templates/clusterrole.yaml deleted file mode 100644 index d49193651..000000000 --- a/charts/kubecost/charts/grafana/templates/clusterrole.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.rbac.create }} -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- with .Values.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} - name: {{ template "grafana.fullname" . }}-clusterrole -{{- if or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled }} -rules: -- apiGroups: [""] # "" indicates the core API group - resources: ["configmaps"] - verbs: ["get", "watch", "list"] -{{- else }} -rules: [] -{{- end}} -{{- end}} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/clusterrolebinding.yaml b/charts/kubecost/charts/grafana/templates/clusterrolebinding.yaml deleted file mode 100644 index 99dada9f4..000000000 --- a/charts/kubecost/charts/grafana/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.rbac.create }} -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ template "grafana.fullname" . }}-clusterrolebinding - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- with .Values.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} -subjects: - - kind: ServiceAccount - name: {{ template "grafana.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -roleRef: - kind: ClusterRole - name: {{ template "grafana.fullname" . }}-clusterrole - apiGroup: rbac.authorization.k8s.io -{{- end}} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/configmap-dashboard-provider.yaml b/charts/kubecost/charts/grafana/templates/configmap-dashboard-provider.yaml deleted file mode 100644 index 1765e9aff..000000000 --- a/charts/kubecost/charts/grafana/templates/configmap-dashboard-provider.yaml +++ /dev/null @@ -1,28 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.sidecar.dashboards.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- with .Values.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} - name: {{ template "grafana.fullname" . }}-config-dashboards -data: - provider.yaml: |- - apiVersion: 1 - providers: - - name: 'default' - orgId: 1 - folder: '' - type: file - disableDeletion: false - options: - path: {{ .Values.sidecar.dashboards.folder }} -{{- end}} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/configmap.yaml b/charts/kubecost/charts/grafana/templates/configmap.yaml deleted file mode 100644 index d283d04c0..000000000 --- a/charts/kubecost/charts/grafana/templates/configmap.yaml +++ /dev/null @@ -1,76 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -data: -{{- if .Values.plugins }} - plugins: {{ join "," .Values.plugins }} -{{- end }} - grafana.ini: | -{{- range $key, $value := index .Values "grafana.ini" }} - [{{ $key }}] - {{- range $elem, $elemVal := $value }} - {{ $elem }} = {{ $elemVal }} - {{- end }} -{{- end }} - -{{- if .Values.datasources }} - {{- range $key, $value := .Values.datasources }} - {{ $key }}: | -{{ toYaml $value | trim | indent 4 }} - {{- end -}} -{{- end -}} -{{- if .Values.global.prometheus.enabled }} - - access: proxy - isDefault: true - name: Prometheus - type: prometheus - url: http://{{ template "cost-analyzer.prometheus.server.name" . }}.{{ .Release.Namespace }}.svc -{{ else }} - - access: proxy - isDefault: true - name: Prometheus - type: prometheus - url: {{ .Values.global.prometheus.fqdn }} -{{- end -}} - -{{- if .Values.dashboardProviders }} - {{- range $key, $value := .Values.dashboardProviders }} - {{ $key }}: | -{{ toYaml $value | indent 4 }} - {{- end -}} -{{- end -}} - -{{- if .Values.dashboards }} - download_dashboards.sh: | - #!/usr/bin/env sh - set -euf - {{- if .Values.dashboardProviders }} - {{- range $key, $value := .Values.dashboardProviders }} - {{- range $value.providers }} - mkdir -p {{ .options.path }} - {{- end }} - {{- end }} - {{- end }} - - {{- range $provider, $dashboards := .Values.dashboards }} - {{- range $key, $value := $dashboards }} - {{- if (or (hasKey $value "gnetId") (hasKey $value "url")) }} - curl -sk \ - --connect-timeout 60 \ - --max-time 60 \ - -H "Accept: application/json" \ - -H "Content-Type: application/json;charset=UTF-8" \ - {{- if $value.url -}}{{ $value.url }}{{- else -}} https://grafana.com/api/dashboards/{{ $value.gnetId }}/revisions/{{- if $value.revision -}}{{ $value.revision }}{{- else -}}1{{- end -}}/download{{- end -}}{{ if $value.datasource }}| sed 's|\"datasource\":[^,]*|\"datasource\": \"{{ $value.datasource }}\"|g'{{ end }} \ - > /var/lib/grafana/dashboards/{{ $provider }}/{{ $key }}.json - {{- end }} - {{- end }} - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/dashboards-json-configmap.yaml b/charts/kubecost/charts/grafana/templates/dashboards-json-configmap.yaml deleted file mode 100644 index c1ab8c4ba..000000000 --- a/charts/kubecost/charts/grafana/templates/dashboards-json-configmap.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.dashboards }} - {{- range $provider, $dashboards := .Values.dashboards }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "grafana.fullname" $ }}-dashboards-{{ $provider }} - labels: - app: {{ template "grafana.name" $ }} - chart: {{ template "grafana.chart" $ }} - release: {{ $.Release.Name }} - heritage: {{ $.Release.Service }} - dashboard-provider: {{ $provider }} -data: - {{- range $key, $value := $dashboards }} - {{- if hasKey $value "json" }} - {{ $key }}.json: | -{{ $value.json | indent 4 }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/deployment.yaml b/charts/kubecost/charts/grafana/templates/deployment.yaml deleted file mode 100644 index ea8e814f3..000000000 --- a/charts/kubecost/charts/grafana/templates/deployment.yaml +++ /dev/null @@ -1,272 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- with .Values.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} -spec: - replicas: {{ .Values.replicas }} - selector: - matchLabels: - app: {{ template "grafana.name" . }} - release: {{ .Release.Name }} - strategy: - type: {{ .Values.deploymentStrategy }} - {{- if ne .Values.deploymentStrategy "RollingUpdate" }} - rollingUpdate: null - {{- end }} - template: - metadata: - labels: - app: {{ template "grafana.name" . }} - release: {{ .Release.Name }} -{{- with .Values.podAnnotations }} - annotations: -{{ toYaml . | indent 8 }} -{{- end }} - spec: - serviceAccountName: {{ template "grafana.serviceAccountName" . }} -{{- if .Values.schedulerName }} - schedulerName: "{{ .Values.schedulerName }}" -{{- end }} -{{- if .Values.securityContext }} - securityContext: -{{ toYaml .Values.securityContext | indent 8 }} -{{- end }} -{{- if .Values.dashboards }} - initContainers: - - name: download-dashboards - image: "{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}" - imagePullPolicy: {{ .Values.downloadDashboardsImage.pullPolicy }} - command: ["sh", "/etc/grafana/download_dashboards.sh"] - volumeMounts: - - name: config - mountPath: "/etc/grafana/download_dashboards.sh" - subPath: download_dashboards.sh - - name: storage - mountPath: "/var/lib/grafana" - subPath: {{ .Values.persistence.subPath }} - {{- range .Values.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - readOnly: {{ .readOnly }} - {{- end }} -{{- end }} - {{- if .Values.image.pullSecrets }} - imagePullSecrets: - {{- range .Values.image.pullSecrets }} - - name: {{ . }} - {{- end}} - {{- end }} - containers: -{{- if .Values.sidecar.dashboards.enabled }} - - name: {{ template "grafana.name" . }}-sc-dashboard - image: "{{ .Values.sidecar.image }}" - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - - name: LABEL - value: "{{ .Values.sidecar.dashboards.label }}" - - name: FOLDER - value: "{{ .Values.sidecar.dashboards.folder }}" - resources: -{{ toYaml .Values.sidecar.resources | indent 12 }} - volumeMounts: - - name: sc-dashboard-volume - mountPath: {{ .Values.sidecar.dashboards.folder | quote }} -{{- end}} -{{- if .Values.sidecar.datasources.enabled }} - - name: {{ template "grafana.name" . }}-sc-datasources - image: "{{ .Values.sidecar.image }}" - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - - name: LABEL - value: "{{ .Values.sidecar.datasources.label }}" - - name: FOLDER - value: "/etc/grafana/provisioning/datasources" - resources: -{{ toYaml .Values.sidecar.resources | indent 12 }} - volumeMounts: - - name: sc-datasources-volume - mountPath: "/etc/grafana/provisioning/datasources" -{{- end}} - - name: {{ .Chart.Name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - volumeMounts: - - name: config - mountPath: "/etc/grafana/grafana.ini" - subPath: grafana.ini - - name: ldap - mountPath: "/etc/grafana/ldap.toml" - subPath: ldap.toml -{{- if .Values.dashboards }} - {{- range $provider, $dashboards := .Values.dashboards }} - {{- range $key, $value := $dashboards }} - {{- if hasKey $value "json" }} - - name: dashboards-{{ $provider }} - mountPath: "/var/lib/grafana/dashboards/{{ $provider }}/{{ $key }}.json" - subPath: "{{ $key }}.json" - {{- end }} - {{- end }} - {{- end }} -{{- end -}} -{{- if .Values.dashboardsConfigMaps }} - {{- range keys .Values.dashboardsConfigMaps }} - - name: dashboards-{{ . }} - mountPath: "/var/lib/grafana/dashboards/{{ . }}" - {{- end }} -{{- end }} -{{- if .Values.datasources }} - - name: config - mountPath: "/etc/grafana/provisioning/datasources/datasources.yaml" - subPath: datasources.yaml -{{- end }} -{{- if .Values.dashboardProviders }} - - name: config - mountPath: "/etc/grafana/provisioning/dashboards/dashboardproviders.yaml" - subPath: dashboardproviders.yaml -{{- end }} -{{- if .Values.sidecar.dashboards.enabled }} - - name: sc-dashboard-volume - mountPath: {{ .Values.sidecar.dashboards.folder | quote }} - - name: sc-dashboard-provider - mountPath: "/etc/grafana/provisioning/dashboards/sc-dashboardproviders.yaml" - subPath: provider.yaml -{{- end}} -{{- if .Values.sidecar.datasources.enabled }} - - name: sc-datasources-volume - mountPath: "/etc/grafana/provisioning/datasources" -{{- end}} - - name: storage - mountPath: "/var/lib/grafana" - subPath: {{ .Values.persistence.subPath }} - {{- range .Values.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - readOnly: {{ .readOnly }} - {{- end }} - ports: - - name: service - containerPort: {{ .Values.service.port }} - protocol: TCP - - name: grafana - containerPort: 3000 - protocol: TCP - env: - - name: GF_SECURITY_ADMIN_USER - valueFrom: - secretKeyRef: - name: {{ template "grafana.fullname" . }} - key: admin-user - - name: GF_SECURITY_ADMIN_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "grafana.fullname" . }} - key: admin-password - {{- if .Values.plugins }} - - name: GF_INSTALL_PLUGINS - valueFrom: - configMapKeyRef: - name: {{ template "grafana.fullname" . }} - key: plugins - {{- end }} - {{- if .Values.smtp.existingSecret }} - - name: GF_SMTP_USER - valueFrom: - secretKeyRef: - name: {{ .Values.smtp.existingSecret }} - key: user - - name: GF_SMTP_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.smtp.existingSecret }} - key: password - {{- end }} -{{- range $key, $value := .Values.env }} - - name: "{{ $key }}" - value: "{{ $value }}" -{{- end }} - {{- if .Values.envFromSecret }} - envFrom: - - secretRef: - name: {{ .Values.envFromSecret }} - {{- end }} - livenessProbe: -{{ toYaml .Values.livenessProbe | indent 12 }} - readinessProbe: -{{ toYaml .Values.readinessProbe | indent 12 }} - resources: -{{ toYaml .Values.resources | indent 12 }} - {{- with .Values.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - volumes: - - name: config - configMap: - name: {{ template "grafana.fullname" . }} - {{- if .Values.dashboards }} - {{- range keys .Values.dashboards }} - - name: dashboards-{{ . }} - configMap: - name: {{ template "grafana.fullname" $ }}-dashboards-{{ . }} - {{- end }} - {{- end }} - {{- if .Values.dashboardsConfigMaps }} - {{- range $provider, $name := .Values.dashboardsConfigMaps }} - - name: dashboards-{{ $provider }} - configMap: - name: {{ $name }} - {{- end }} - {{- end }} - - name: ldap - secret: - {{- if .Values.ldap.existingSecret }} - secretName: {{ .Values.ldap.existingSecret }} - {{- else }} - secretName: {{ template "grafana.fullname" . }} - {{- end }} - items: - - key: ldap-toml - path: ldap.toml - - name: storage - {{- if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ .Values.persistence.existingClaim | default (include "grafana.fullname" .) }} - {{- else }} - emptyDir: {} - {{- end -}} - {{- if .Values.sidecar.dashboards.enabled }} - - name: sc-dashboard-volume - emptyDir: {} - - name: sc-dashboard-provider - configMap: - name: {{ template "grafana.fullname" . }}-config-dashboards - {{- end }} - {{- if .Values.sidecar.datasources.enabled }} - - name: sc-datasources-volume - emptyDir: {} - {{- end -}} - {{- range .Values.extraSecretMounts }} - - name: {{ .name }} - secret: - secretName: {{ .secretName }} - defaultMode: {{ .defaultMode }} - {{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/ingress.yaml b/charts/kubecost/charts/grafana/templates/ingress.yaml deleted file mode 100644 index 556f0fab0..000000000 --- a/charts/kubecost/charts/grafana/templates/ingress.yaml +++ /dev/null @@ -1,44 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "grafana.fullname" . -}} -{{- $servicePort := .Values.service.port -}} -{{- $ingressPath := .Values.ingress.path -}} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- if .Values.ingress.labels }} -{{ toYaml .Values.ingress.labels | indent 4 }} -{{- end }} -{{- with .Values.ingress.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} -spec: -{{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} -{{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $ingressPath }} - backend: - serviceName: {{ $fullName }} - servicePort: {{ $servicePort }} - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/podsecuritypolicy.yaml b/charts/kubecost/charts/grafana/templates/podsecuritypolicy.yaml deleted file mode 100644 index e2b47f42b..000000000 --- a/charts/kubecost/charts/grafana/templates/podsecuritypolicy.yaml +++ /dev/null @@ -1,42 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.rbac.pspEnabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - annotations: - seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default' - apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default' - seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' -spec: - privileged: false - allowPrivilegeEscalation: false - requiredDropCapabilities: - - ALL - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - - 'persistentVolumeClaim' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/pvc.yaml b/charts/kubecost/charts/grafana/templates/pvc.yaml deleted file mode 100644 index e13c78378..000000000 --- a/charts/kubecost/charts/grafana/templates/pvc.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} - {{- with .Values.persistence.annotations }} - annotations: -{{ toYaml . | indent 4 }} - {{- end }} -spec: - accessModes: - {{- range .Values.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} - storageClassName: {{ .Values.persistence.storageClassName }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/role.yaml b/charts/kubecost/charts/grafana/templates/role.yaml deleted file mode 100644 index 6c9195769..000000000 --- a/charts/kubecost/charts/grafana/templates/role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.rbac.create }} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: Role -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} -{{- if .Values.rbac.pspEnabled }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: [{{ template "grafana.fullname" . }}] -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/rolebinding.yaml b/charts/kubecost/charts/grafana/templates/rolebinding.yaml deleted file mode 100644 index e777ddabc..000000000 --- a/charts/kubecost/charts/grafana/templates/rolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: RoleBinding -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "grafana.fullname" . }} -subjects: -- kind: ServiceAccount - name: {{ template "grafana.serviceAccountName" . }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/secret.yaml b/charts/kubecost/charts/grafana/templates/secret.yaml deleted file mode 100644 index cd16c2fc7..000000000 --- a/charts/kubecost/charts/grafana/templates/secret.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -type: Opaque -data: - admin-user: {{ .Values.adminUser | b64enc | quote }} - {{- if .Values.adminPassword }} - admin-password: {{ .Values.adminPassword | b64enc | quote }} - {{- else }} - admin-password: {{ randAlphaNum 40 | b64enc | quote }} - {{- end }} - {{- if not .Values.ldap.existingSecret }} - ldap-toml: {{ .Values.ldap.config | b64enc | quote }} - {{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/service.yaml b/charts/kubecost/charts/grafana/templates/service.yaml deleted file mode 100644 index 307d0abf1..000000000 --- a/charts/kubecost/charts/grafana/templates/service.yaml +++ /dev/null @@ -1,51 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- if .Values.service.labels }} -{{ toYaml .Values.service.labels | indent 4 }} -{{- end }} -{{- with .Values.service.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} -spec: -{{- if (or (eq .Values.service.type "ClusterIP") (empty .Values.service.type)) }} - type: ClusterIP - {{- if .Values.service.clusterIP }} - clusterIP: {{ .Values.service.clusterIP }} - {{end}} -{{- else if eq .Values.service.type "LoadBalancer" }} - type: {{ .Values.service.type }} - {{- if .Values.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.service.loadBalancerIP }} - {{- end }} - {{- if .Values.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: -{{ toYaml .Values.service.loadBalancerSourceRanges | indent 4 }} - {{- end -}} -{{- else }} - type: {{ .Values.service.type }} -{{- end }} -{{- if .Values.service.externalIPs }} - externalIPs: -{{ toYaml .Values.service.externalIPs | indent 4 }} -{{- end }} - ports: - - name: service - port: {{ .Values.service.port }} - protocol: TCP - targetPort: 3000 -{{ if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }} - nodePort: {{.Values.service.nodePort}} -{{ end }} - selector: - app: {{ template "grafana.name" . }} - release: {{ .Release.Name }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/serviceaccount.yaml b/charts/kubecost/charts/grafana/templates/serviceaccount.yaml deleted file mode 100644 index bbcb5055e..000000000 --- a/charts/kubecost/charts/grafana/templates/serviceaccount.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: {{ template "grafana.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - name: {{ template "grafana.serviceAccountName" . }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/values.yaml b/charts/kubecost/charts/grafana/values.yaml deleted file mode 100644 index 504a3e86a..000000000 --- a/charts/kubecost/charts/grafana/values.yaml +++ /dev/null @@ -1,275 +0,0 @@ -rbac: - create: true - pspEnabled: true -serviceAccount: - create: true - name: - -replicas: 1 - -deploymentStrategy: RollingUpdate - -readinessProbe: - httpGet: - path: /api/health - port: 3000 - -livenessProbe: - httpGet: - path: /api/health - port: 3000 - initialDelaySeconds: 60 - timeoutSeconds: 30 - failureThreshold: 10 - -image: - repository: grafana/grafana - tag: 7.1.1 - pullPolicy: IfNotPresent - - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## - # pullSecrets: - # - myRegistrKeySecretName - -securityContext: - runAsUser: 472 - fsGroup: 472 - -downloadDashboardsImage: - repository: appropriate/curl - tag: latest - pullPolicy: IfNotPresent - -## Pod Annotations -# podAnnotations: {} - -## Deployment annotations -# annotations: {} - -## Expose the grafana service to be accessed from outside the cluster (LoadBalancer service). -## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it. -## ref: http://kubernetes.io/docs/user-guide/services/ -## -service: - type: ClusterIP - port: 80 - annotations: {} - labels: {} - -ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: / - hosts: - - chart-example.local - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -resources: {} -# limits: -# cpu: 100m -# memory: 128Mi -# requests: -# cpu: 100m -# memory: 128Mi - -## Node labels for pod assignment -## ref: https://kubernetes.io/docs/user-guide/node-selection/ -# -nodeSelector: {} - -## Tolerations for pod assignment -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## Affinity for pod assignment -## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## Enable persistence using Persistent Volume Claims -## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ -## -persistence: - enabled: false - # storageClassName: default - # accessModes: - # - ReadWriteOnce - # size: 10Gi - # annotations: {} - # subPath: "" - # existingClaim: - -adminUser: admin -adminPassword: strongpassword - -## Use an alternate scheduler, e.g. "stork". -## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ -## -# schedulerName: - -## Extra environment variables that will be pass onto deployment pods -env: {} - -## The name of a secret in the same kubernetes namespace which contain values to be added to the environment -## This can be useful for auth tokens, etc -envFromSecret: "" - -## Additional grafana server secret mounts -# Defines additional mounts with secrets. Secrets must be manually created in the namespace. -extraSecretMounts: [] - # - name: secret-files - # mountPath: /etc/secrets - # secretName: grafana-secret-files - # readOnly: true - -## Pass the plugins you want installed as a list. -## -plugins: [] - # - digrich-bubblechart-panel - # - grafana-clock-panel - -## Configure grafana datasources -## ref: http://docs.grafana.org/administration/provisioning/#datasources -## -datasources: {} -# datasources.yaml: -# apiVersion: 1 -# datasources: -# - name: Prometheus2 -# type: prometheus -# url: http://prometheus-server.default.svc -# access: proxy -# isDefault: false - -## Configure grafana dashboard providers -## ref: http://docs.grafana.org/administration/provisioning/#dashboards -## -## `path` must be /var/lib/grafana/dashboards/ -## -dashboardProviders: {} -# dashboardproviders.yaml: -# apiVersion: 1 -# providers: -# - name: 'default' -# orgId: 1 -# folder: '' -# type: file -# disableDeletion: false -# editable: true -# options: -# path: /var/lib/grafana/dashboards/default - -## Configure grafana dashboard to import -## NOTE: To use dashboards you must also enable/configure dashboardProviders -## ref: https://grafana.com/dashboards -## -## dashboards per provider, use provider name as key. -## -dashboards: {} -# default: -# prometheus-stats: -# gnetId: 3662 -# revision: 2 -# datasource: Prometheus - -## Reference to external ConfigMap per provider. Use provider name as key and ConfiMap name as value. -## A provider dashboards must be defined either by external ConfigMaps or in values.yaml, not in both. -## ConfigMap data example: -## -## data: -## example-dashboard.json: | -## RAW_JSON -## -dashboardsConfigMaps: {} -# default: "" - -## Grafana's primary configuration -## NOTE: values in map will be converted to ini format -## ref: http://docs.grafana.org/installation/configuration/ -## -grafana.ini: - paths: - data: /var/lib/grafana/data - logs: /var/log/grafana - plugins: /var/lib/grafana/plugins - provisioning: /etc/grafana/provisioning - analytics: - check_for_updates: true - log: - mode: console - grafana_net: - url: https://grafana.net - auth.anonymous: - enabled: true - org_role: Admin - org_name: Main Org. - -## LDAP Authentication can be enabled with the following values on grafana.ini -## NOTE: Grafana will fail to start if the value for ldap.toml is invalid - # auth.ldap: - # enabled: true - # allow_sign_up: true - # config_file: /etc/grafana/ldap.toml - -## Grafana's LDAP configuration -## Templated by the template in _helpers.tpl -## NOTE: To enable the grafana.ini must be configured with auth.ldap.enabled -## ref: http://docs.grafana.org/installation/configuration/#auth-ldap -## ref: http://docs.grafana.org/installation/ldap/#configuration -ldap: - # `existingSecret` is a reference to an existing secret containing the ldap configuration - # for Grafana in a key `ldap-toml`. - existingSecret: "" - # `config` is the content of `ldap.toml` that will be stored in the created secret - config: "" - # config: |- - # verbose_logging = true - - # [[servers]] - # host = "my-ldap-server" - # port = 636 - # use_ssl = true - # start_tls = false - # ssl_skip_verify = false - # bind_dn = "uid=%s,ou=users,dc=myorg,dc=com" - -## Grafana's SMTP configuration -## NOTE: To enable, grafana.ini must be configured with smtp.enabled -## ref: http://docs.grafana.org/installation/configuration/#smtp -smtp: - # `existingSecret` is a reference to an existing secret containing the smtp configuration - # for Grafana in keys `user` and `password`. - existingSecret: "" - -## Sidecars that collect the configmaps with specified label and stores the included files them into the respective folders -## Requires at least Grafana 5 to work and can't be used together with parameters dashboardProviders, datasources and dashboards -sidecar: - image: kiwigrid/k8s-sidecar:0.1.144 - imagePullPolicy: IfNotPresent - resources: -# limits: -# cpu: 100m -# memory: 100Mi -# requests: -# cpu: 50m -# memory: 50Mi - dashboards: - enabled: false - # label that the configmaps with dashboards are marked with - label: grafana_dashboard - # folder in the pod that should hold the collected dashboards - folder: /tmp/dashboards - datasources: - enabled: false - # label that the configmaps with datasources are marked with - label: grafana_datasource diff --git a/charts/kubecost/charts/prometheus/.helmignore b/charts/kubecost/charts/prometheus/.helmignore deleted file mode 100644 index 825c00779..000000000 --- a/charts/kubecost/charts/prometheus/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj - -OWNERS diff --git a/charts/kubecost/charts/prometheus/Chart.yaml b/charts/kubecost/charts/prometheus/Chart.yaml deleted file mode 100644 index dd81a9c69..000000000 --- a/charts/kubecost/charts/prometheus/Chart.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -appVersion: 2.17.2 -description: Prometheus is a monitoring system and time series database. -home: https://prometheus.io/ -icon: https://raw.githubusercontent.com/prometheus/prometheus.github.io/master/assets/prometheus_logo-cb55bb5c346.png -maintainers: -- email: gianrubio@gmail.com - name: gianrubio -- email: zanhsieh@gmail.com - name: zanhsieh -name: prometheus -sources: -- https://github.com/prometheus/alertmanager -- https://github.com/prometheus/prometheus -- https://github.com/prometheus/pushgateway -- https://github.com/prometheus/node_exporter -- https://github.com/kubernetes/kube-state-metrics -version: 11.0.2 diff --git a/charts/kubecost/charts/prometheus/README.md b/charts/kubecost/charts/prometheus/README.md deleted file mode 100644 index dc32dcd15..000000000 --- a/charts/kubecost/charts/prometheus/README.md +++ /dev/null @@ -1,471 +0,0 @@ -# Prometheus - -[Prometheus](https://prometheus.io/), a [Cloud Native Computing Foundation](https://cncf.io/) project, is a systems and service monitoring system. It collects metrics from configured targets at given intervals, evaluates rule expressions, displays the results, and can trigger alerts if some condition is observed to be true. - -## TL;DR; - -```console -$ helm install stable/prometheus -``` - -## Introduction - -This chart bootstraps a [Prometheus](https://prometheus.io/) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. - -## Prerequisites - -- Kubernetes 1.3+ with Beta APIs enabled - -## Installing the Chart - -To install the chart with the release name `my-release`: - -```console -$ helm install --name my-release stable/prometheus -``` - -The command deploys Prometheus on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation. - -> **Tip**: List all releases using `helm list` - -## Uninstalling the Chart - -To uninstall/delete the `my-release` deployment: - -```console -$ helm delete my-release -``` - -The command removes all the Kubernetes components associated with the chart and deletes the release. - -## Prometheus 2.x - -Prometheus version 2.x has made changes to alertmanager, storage and recording rules. Check out the migration guide [here](https://prometheus.io/docs/prometheus/2.0/migration/) - -Users of this chart will need to update their alerting rules to the new format before they can upgrade. - -## Upgrading from previous chart versions. - -Version 9.0 adds a new option to enable or disable the Prometheus Server. -This supports the use case of running a Prometheus server in one k8s cluster and scraping exporters in another cluster while using the same chart for each deployment. -To install the server `server.enabled` must be set to `true`. - -As of version 5.0, this chart uses Prometheus 2.x. This version of prometheus introduces a new data format and is not compatible with prometheus 1.x. It is recommended to install this as a new release, as updating existing releases will not work. See the [prometheus docs](https://prometheus.io/docs/prometheus/latest/migration/#storage) for instructions on retaining your old data. - -### Example migration - -Assuming you have an existing release of the prometheus chart, named `prometheus-old`. In order to update to prometheus 2.x while keeping your old data do the following: - -1. Update the `prometheus-old` release. Disable scraping on every component besides the prometheus server, similar to the configuration below: - - ``` - alertmanager: - enabled: false - alertmanagerFiles: - alertmanager.yml: "" - kubeStateMetrics: - enabled: false - nodeExporter: - enabled: false - pushgateway: - enabled: false - server: - extraArgs: - storage.local.retention: 720h - serverFiles: - alerts: "" - prometheus.yml: "" - rules: "" - ``` - -1. Deploy a new release of the chart with version 5.0+ using prometheus 2.x. In the values.yaml set the scrape config as usual, and also add the `prometheus-old` instance as a remote-read target. - - ``` - prometheus.yml: - ... - remote_read: - - url: http://prometheus-old/api/v1/read - ... - ``` - - Old data will be available when you query the new prometheus instance. - -## Scraping Pod Metrics via Annotations - -This chart uses a default configuration that causes prometheus -to scrape a variety of kubernetes resource types, provided they have the correct annotations. -In this section we describe how to configure pods to be scraped; -for information on how other resource types can be scraped you can -do a `helm template` to get the kubernetes resource definitions, -and then reference the prometheus configuration in the ConfigMap against the prometheus documentation -for [relabel_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config) -and [kubernetes_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config). - -In order to get prometheus to scrape pods, you must add annotations to the the pods as below: - -``` -metadata: - annotations: - prometheus.io/scrape: "true" - prometheus.io/path: /metrics - prometheus.io/port: "8080" -spec: -... -``` - -You should adjust `prometheus.io/path` based on the URL that your pod serves metrics from. -`prometheus.io/port` should be set to the port that your pod serves metrics from. -Note that the values for `prometheus.io/scrape` and `prometheus.io/port` must be -enclosed in double quotes. - -## Configuration - -The following table lists the configurable parameters of the Prometheus chart and their default values. - -Parameter | Description | Default ---------- | ----------- | ------- -`alertmanager.enabled` | If true, create alertmanager | `true` -`alertmanager.name` | alertmanager container name | `alertmanager` -`alertmanager.image.repository` | alertmanager container image repository | `prom/alertmanager` -`alertmanager.image.tag` | alertmanager container image tag | `v0.20.0` -`alertmanager.image.pullPolicy` | alertmanager container image pull policy | `IfNotPresent` -`alertmanager.prefixURL` | The prefix slug at which the server can be accessed | `` -`alertmanager.baseURL` | The external url at which the server can be accessed | `"http://localhost:9093"` -`alertmanager.extraArgs` | Additional alertmanager container arguments | `{}` -`alertmanager.extraSecretMounts` | Additional alertmanager Secret mounts | `[]` -`alertmanager.configMapOverrideName` | Prometheus alertmanager ConfigMap override where full-name is `{{.Release.Name}}-{{.Values.alertmanager.configMapOverrideName}}` and setting this value will prevent the default alertmanager ConfigMap from being generated | `""` -`alertmanager.configFromSecret` | The name of a secret in the same kubernetes namespace which contains the Alertmanager config, setting this value will prevent the default alertmanager ConfigMap from being generated | `""` -`alertmanager.configFileName` | The configuration file name to be loaded to alertmanager. Must match the key within configuration loaded from ConfigMap/Secret. | `alertmanager.yml` -`alertmanager.ingress.enabled` | If true, alertmanager Ingress will be created | `false` -`alertmanager.ingress.annotations` | alertmanager Ingress annotations | `{}` -`alertmanager.ingress.extraLabels` | alertmanager Ingress additional labels | `{}` -`alertmanager.ingress.hosts` | alertmanager Ingress hostnames | `[]` -`alertmanager.ingress.extraPaths` | Ingress extra paths to prepend to every alertmanager host configuration. Useful when configuring [custom actions with AWS ALB Ingress Controller](https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/#actions) | `[]` -`alertmanager.ingress.tls` | alertmanager Ingress TLS configuration (YAML) | `[]` -`alertmanager.nodeSelector` | node labels for alertmanager pod assignment | `{}` -`alertmanager.tolerations` | node taints to tolerate (requires Kubernetes >=1.6) | `[]` -`alertmanager.affinity` | pod affinity | `{}` -`alertmanager.podDisruptionBudget.enabled` | If true, create a PodDisruptionBudget | `false` -`alertmanager.podDisruptionBudget.maxUnavailable` | Maximum unavailable instances in PDB | `1` -`alertmanager.schedulerName` | alertmanager alternate scheduler name | `nil` -`alertmanager.persistentVolume.enabled` | If true, alertmanager will create a Persistent Volume Claim | `true` -`alertmanager.persistentVolume.accessModes` | alertmanager data Persistent Volume access modes | `[ReadWriteOnce]` -`alertmanager.persistentVolume.annotations` | Annotations for alertmanager Persistent Volume Claim | `{}` -`alertmanager.persistentVolume.existingClaim` | alertmanager data Persistent Volume existing claim name | `""` -`alertmanager.persistentVolume.mountPath` | alertmanager data Persistent Volume mount root path | `/data` -`alertmanager.persistentVolume.size` | alertmanager data Persistent Volume size | `2Gi` -`alertmanager.persistentVolume.storageClass` | alertmanager data Persistent Volume Storage Class | `unset` -`alertmanager.persistentVolume.volumeBindingMode` | alertmanager data Persistent Volume Binding Mode | `unset` -`alertmanager.persistentVolume.subPath` | Subdirectory of alertmanager data Persistent Volume to mount | `""` -`alertmanager.podAnnotations` | annotations to be added to alertmanager pods | `{}` -`alertmanager.podLabels` | labels to be added to Prometheus AlertManager pods | `{}` -`alertmanager.podSecurityPolicy.annotations` | Specify pod annotations in the pod security policy | `{}` | -`alertmanager.replicaCount` | desired number of alertmanager pods | `1` -`alertmanager.statefulSet.enabled` | If true, use a statefulset instead of a deployment for pod management | `false` -`alertmanager.statefulSet.podManagementPolicy` | podManagementPolicy of alertmanager pods | `OrderedReady` -`alertmanager.statefulSet.headless.annotations` | annotations for alertmanager headless service | `{}` -`alertmanager.statefulSet.headless.labels` | labels for alertmanager headless service | `{}` -`alertmanager.statefulSet.headless.enableMeshPeer` | If true, enable the mesh peer endpoint for the headless service | `{}` -`alertmanager.statefulSet.headless.servicePort` | alertmanager headless service port | `80` -`alertmanager.priorityClassName` | alertmanager priorityClassName | `nil` -`alertmanager.resources` | alertmanager pod resource requests & limits | `{}` -`alertmanager.securityContext` | Custom [security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) for Alert Manager containers | `{}` -`alertmanager.service.annotations` | annotations for alertmanager service | `{}` -`alertmanager.service.clusterIP` | internal alertmanager cluster service IP | `""` -`alertmanager.service.externalIPs` | alertmanager service external IP addresses | `[]` -`alertmanager.service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `""` -`alertmanager.service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to load balancer (if supported) | `[]` -`alertmanager.service.servicePort` | alertmanager service port | `80` -`alertmanager.service.sessionAffinity` | Session Affinity for alertmanager service, can be `None` or `ClientIP` | `None` -`alertmanager.service.type` | type of alertmanager service to create | `ClusterIP` -`alertmanager.strategy` | Deployment strategy | `{ "type": "RollingUpdate" }` -`alertmanagerFiles.alertmanager.yml` | Prometheus alertmanager configuration | example configuration -`configmapReload.prometheus.enabled` | If false, the configmap-reload container for Prometheus will not be deployed | `true` -`configmapReload.prometheus.name` | configmap-reload container name | `configmap-reload` -`configmapReload.prometheus.image.repository` | configmap-reload container image repository | `jimmidyson/configmap-reload` -`configmapReload.prometheus.image.tag` | configmap-reload container image tag | `v0.3.0` -`configmapReload.prometheus.image.pullPolicy` | configmap-reload container image pull policy | `IfNotPresent` -`configmapReload.prometheus.extraArgs` | Additional configmap-reload container arguments | `{}` -`configmapReload.prometheus.extraVolumeDirs` | Additional configmap-reload volume directories | `{}` -`configmapReload.prometheus.extraConfigmapMounts` | Additional configmap-reload configMap mounts | `[]` -`configmapReload.prometheus.resources` | configmap-reload pod resource requests & limits | `{}` -`configmapReload.alertmanager.enabled` | If false, the configmap-reload container for AlertManager will not be deployed | `true` -`configmapReload.alertmanager.name` | configmap-reload container name | `configmap-reload` -`configmapReload.alertmanager.image.repository` | configmap-reload container image repository | `jimmidyson/configmap-reload` -`configmapReload.alertmanager.image.tag` | configmap-reload container image tag | `v0.3.0` -`configmapReload.alertmanager.image.pullPolicy` | configmap-reload container image pull policy | `IfNotPresent` -`configmapReload.alertmanager.extraArgs` | Additional configmap-reload container arguments | `{}` -`configmapReload.alertmanager.extraVolumeDirs` | Additional configmap-reload volume directories | `{}` -`configmapReload.alertmanager.extraConfigmapMounts` | Additional configmap-reload configMap mounts | `[]` -`configmapReload.alertmanager.resources` | configmap-reload pod resource requests & limits | `{}` -`initChownData.enabled` | If false, don't reset data ownership at startup | true -`initChownData.name` | init-chown-data container name | `init-chown-data` -`initChownData.image.repository` | init-chown-data container image repository | `busybox` -`initChownData.image.tag` | init-chown-data container image tag | `latest` -`initChownData.image.pullPolicy` | init-chown-data container image pull policy | `IfNotPresent` -`initChownData.resources` | init-chown-data pod resource requests & limits | `{}` -`kubeStateMetrics.enabled` | If true, create kube-state-metrics sub-chart, see the [kube-state-metrics chart for configuration options](https://github.com/helm/charts/tree/master/stable/kube-state-metrics) | `true` -`nodeExporter.enabled` | If true, create node-exporter | `true` -`nodeExporter.name` | node-exporter container name | `node-exporter` -`nodeExporter.image.repository` | node-exporter container image repository| `prom/node-exporter` -`nodeExporter.image.tag` | node-exporter container image tag | `v0.18.1` -`nodeExporter.image.pullPolicy` | node-exporter container image pull policy | `IfNotPresent` -`nodeExporter.extraArgs` | Additional node-exporter container arguments | `{}` -`nodeExporter.extraHostPathMounts` | Additional node-exporter hostPath mounts | `[]` -`nodeExporter.extraConfigmapMounts` | Additional node-exporter configMap mounts | `[]` -`nodeExporter.hostNetwork` | If true, node-exporter pods share the host network namespace | `true` -`nodeExporter.hostPID` | If true, node-exporter pods share the host PID namespace | `true` -`nodeExporter.nodeSelector` | node labels for node-exporter pod assignment | `{}` -`nodeExporter.podAnnotations` | annotations to be added to node-exporter pods | `{}` -`nodeExporter.pod.labels` | labels to be added to node-exporter pods | `{}` -`nodeExporter.podDisruptionBudget.enabled` | If true, create a PodDisruptionBudget | `false` -`nodeExporter.podDisruptionBudget.maxUnavailable` | Maximum unavailable instances in PDB | `1` -`nodeExporter.podSecurityPolicy.annotations` | Specify pod annotations in the pod security policy | `{}` | -`nodeExporter.podSecurityPolicy.enabled` | Specify if a Pod Security Policy for node-exporter must be created | `false` -`nodeExporter.tolerations` | node taints to tolerate (requires Kubernetes >=1.6) | `[]` -`nodeExporter.priorityClassName` | node-exporter priorityClassName | `nil` -`nodeExporter.resources` | node-exporter resource requests and limits (YAML) | `{}` -`nodeExporter.securityContext` | securityContext for containers in pod | `{}` -`nodeExporter.service.annotations` | annotations for node-exporter service | `{prometheus.io/scrape: "true"}` -`nodeExporter.service.clusterIP` | internal node-exporter cluster service IP | `None` -`nodeExporter.service.externalIPs` | node-exporter service external IP addresses | `[]` -`nodeExporter.service.hostPort` | node-exporter service host port | `9100` -`nodeExporter.service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `""` -`nodeExporter.service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to load balancer (if supported) | `[]` -`nodeExporter.service.servicePort` | node-exporter service port | `9100` -`nodeExporter.service.type` | type of node-exporter service to create | `ClusterIP` -`podSecurityPolicy.enabled` | If true, create & use pod security policies resources | `false` -`pushgateway.enabled` | If true, create pushgateway | `true` -`pushgateway.name` | pushgateway container name | `pushgateway` -`pushgateway.image.repository` | pushgateway container image repository | `prom/pushgateway` -`pushgateway.image.tag` | pushgateway container image tag | `v1.0.1` -`pushgateway.image.pullPolicy` | pushgateway container image pull policy | `IfNotPresent` -`pushgateway.extraArgs` | Additional pushgateway container arguments | `{}` -`pushgateway.ingress.enabled` | If true, pushgateway Ingress will be created | `false` -`pushgateway.ingress.annotations` | pushgateway Ingress annotations | `{}` -`pushgateway.ingress.hosts` | pushgateway Ingress hostnames | `[]` -`pushgateway.ingress.extraPaths` | Ingress extra paths to prepend to every pushgateway host configuration. Useful when configuring [custom actions with AWS ALB Ingress Controller](https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/#actions) | `[]` -`pushgateway.ingress.tls` | pushgateway Ingress TLS configuration (YAML) | `[]` -`pushgateway.nodeSelector` | node labels for pushgateway pod assignment | `{}` -`pushgateway.podAnnotations` | annotations to be added to pushgateway pods | `{}` -`pushgateway.podSecurityPolicy.annotations` | Specify pod annotations in the pod security policy | `{}` | -`pushgateway.tolerations` | node taints to tolerate (requires Kubernetes >=1.6) | `[]` -`pushgateway.replicaCount` | desired number of pushgateway pods | `1` -`pushgateway.podDisruptionBudget.enabled` | If true, create a PodDisruptionBudget | `false` -`pushgateway.podDisruptionBudget.maxUnavailable` | Maximum unavailable instances in PDB | `1` -`pushgateway.schedulerName` | pushgateway alternate scheduler name | `nil` -`pushgateway.persistentVolume.enabled` | If true, Prometheus pushgateway will create a Persistent Volume Claim | `false` -`pushgateway.persistentVolume.accessModes` | Prometheus pushgateway data Persistent Volume access modes | `[ReadWriteOnce]` -`pushgateway.persistentVolume.annotations` | Prometheus pushgateway data Persistent Volume annotations | `{}` -`pushgateway.persistentVolume.existingClaim` | Prometheus pushgateway data Persistent Volume existing claim name | `""` -`pushgateway.persistentVolume.mountPath` | Prometheus pushgateway data Persistent Volume mount root path | `/data` -`pushgateway.persistentVolume.size` | Prometheus pushgateway data Persistent Volume size | `2Gi` -`pushgateway.persistentVolume.storageClass` | Prometheus pushgateway data Persistent Volume Storage Class | `unset` -`pushgateway.persistentVolume.volumeBindingMode` | Prometheus pushgateway data Persistent Volume Binding Mode | `unset` -`pushgateway.persistentVolume.subPath` | Subdirectory of Prometheus server data Persistent Volume to mount | `""` -`pushgateway.priorityClassName` | pushgateway priorityClassName | `nil` -`pushgateway.resources` | pushgateway pod resource requests & limits | `{}` -`pushgateway.service.annotations` | annotations for pushgateway service | `{}` -`pushgateway.service.clusterIP` | internal pushgateway cluster service IP | `""` -`pushgateway.service.externalIPs` | pushgateway service external IP addresses | `[]` -`pushgateway.service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `""` -`pushgateway.service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to load balancer (if supported) | `[]` -`pushgateway.service.servicePort` | pushgateway service port | `9091` -`pushgateway.service.type` | type of pushgateway service to create | `ClusterIP` -`pushgateway.strategy` | Deployment strategy | `{ "type": "RollingUpdate" }` -`rbac.create` | If true, create & use RBAC resources | `true` -`server.enabled` | If false, Prometheus server will not be created | `true` -`server.name` | Prometheus server container name | `server` -`server.image.repository` | Prometheus server container image repository | `prom/prometheus` -`server.image.tag` | Prometheus server container image tag | `v2.16.0` -`server.image.pullPolicy` | Prometheus server container image pull policy | `IfNotPresent` -`server.configPath` | Path to a prometheus server config file on the container FS | `/etc/config/prometheus.yml` -`server.global.scrape_interval` | How frequently to scrape targets by default | `1m` -`server.global.scrape_timeout` | How long until a scrape request times out | `10s` -`server.global.evaluation_interval` | How frequently to evaluate rules | `1m` -`server.remoteWrite` | The remote write feature of Prometheus allow transparently sending samples. | `{}` -`server.remoteRead` | The remote read feature of Prometheus allow transparently receiving samples. | `{}` -`server.extraArgs` | Additional Prometheus server container arguments | `{}` -`server.extraFlags` | Additional Prometheus server container flags | `["web.enable-lifecycle"]` -`server.extraInitContainers` | Init containers to launch alongside the server | `[]` -`server.prefixURL` | The prefix slug at which the server can be accessed | `` -`server.baseURL` | The external url at which the server can be accessed | `` -`server.env` | Prometheus server environment variables | `[]` -`server.extraHostPathMounts` | Additional Prometheus server hostPath mounts | `[]` -`server.extraConfigmapMounts` | Additional Prometheus server configMap mounts | `[]` -`server.extraSecretMounts` | Additional Prometheus server Secret mounts | `[]` -`server.extraVolumeMounts` | Additional Prometheus server Volume mounts | `[]` -`server.extraVolumes` | Additional Prometheus server Volumes | `[]` -`server.configMapOverrideName` | Prometheus server ConfigMap override where full-name is `{{.Release.Name}}-{{.Values.server.configMapOverrideName}}` and setting this value will prevent the default server ConfigMap from being generated | `""` -`server.ingress.enabled` | If true, Prometheus server Ingress will be created | `false` -`server.ingress.annotations` | Prometheus server Ingress annotations | `[]` -`server.ingress.extraLabels` | Prometheus server Ingress additional labels | `{}` -`server.ingress.hosts` | Prometheus server Ingress hostnames | `[]` -`server.ingress.extraPaths` | Ingress extra paths to prepend to every Prometheus server host configuration. Useful when configuring [custom actions with AWS ALB Ingress Controller](https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/#actions) | `[]` -`server.ingress.tls` | Prometheus server Ingress TLS configuration (YAML) | `[]` -`server.nodeSelector` | node labels for Prometheus server pod assignment | `{}` -`server.tolerations` | node taints to tolerate (requires Kubernetes >=1.6) | `[]` -`server.affinity` | pod affinity | `{}` -`server.podDisruptionBudget.enabled` | If true, create a PodDisruptionBudget | `false` -`server.podDisruptionBudget.maxUnavailable` | Maximum unavailable instances in PDB | `1` -`server.priorityClassName` | Prometheus server priorityClassName | `nil` -`server.schedulerName` | Prometheus server alternate scheduler name | `nil` -`server.persistentVolume.enabled` | If true, Prometheus server will create a Persistent Volume Claim | `true` -`server.persistentVolume.accessModes` | Prometheus server data Persistent Volume access modes | `[ReadWriteOnce]` -`server.persistentVolume.annotations` | Prometheus server data Persistent Volume annotations | `{}` -`server.persistentVolume.existingClaim` | Prometheus server data Persistent Volume existing claim name | `""` -`server.persistentVolume.mountPath` | Prometheus server data Persistent Volume mount root path | `/data` -`server.persistentVolume.size` | Prometheus server data Persistent Volume size | `8Gi` -`server.persistentVolume.storageClass` | Prometheus server data Persistent Volume Storage Class | `unset` -`server.persistentVolume.volumeBindingMode` | Prometheus server data Persistent Volume Binding Mode | `unset` -`server.persistentVolume.subPath` | Subdirectory of Prometheus server data Persistent Volume to mount | `""` -`server.emptyDir.sizeLimit` | emptyDir sizeLimit if a Persistent Volume is not used | `""` -`server.podAnnotations` | annotations to be added to Prometheus server pods | `{}` -`server.podLabels` | labels to be added to Prometheus server pods | `{}` -`server.alertmanagers` | Prometheus AlertManager configuration for the Prometheus server | `{}` -`server.deploymentAnnotations` | annotations to be added to Prometheus server deployment | `{}` -`server.podSecurityPolicy.annotations` | Specify pod annotations in the pod security policy | `{}` | -`server.replicaCount` | desired number of Prometheus server pods | `1` -`server.statefulSet.enabled` | If true, use a statefulset instead of a deployment for pod management | `false` -`server.statefulSet.annotations` | annotations to be added to Prometheus server stateful set | `{}` -`server.statefulSet.labels` | labels to be added to Prometheus server stateful set | `{}` -`server.statefulSet.podManagementPolicy` | podManagementPolicy of server pods | `OrderedReady` -`server.statefulSet.headless.annotations` | annotations for Prometheus server headless service | `{}` -`server.statefulSet.headless.labels` | labels for Prometheus server headless service | `{}` -`server.statefulSet.headless.servicePort` | Prometheus server headless service port | `80` -`server.resources` | Prometheus server resource requests and limits | `{}` -`server.verticalAutoscaler.enabled` | If true a VPA object will be created for the controller (either StatefulSet or Deployemnt, based on above configs) | `false` -`server.securityContext` | Custom [security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) for server containers | `{}` -`server.service.annotations` | annotations for Prometheus server service | `{}` -`server.service.clusterIP` | internal Prometheus server cluster service IP | `""` -`server.service.externalIPs` | Prometheus server service external IP addresses | `[]` -`server.service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `""` -`server.service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to load balancer (if supported) | `[]` -`server.service.nodePort` | Port to be used as the service NodePort (ignored if `server.service.type` is not `NodePort`) | `0` -`server.service.servicePort` | Prometheus server service port | `80` -`server.service.sessionAffinity` | Session Affinity for server service, can be `None` or `ClientIP` | `None` -`server.service.type` | type of Prometheus server service to create | `ClusterIP` -`server.service.gRPC.enabled` | If true, open a second port on the service for gRPC | `false` -`server.service.gRPC.servicePort` | Prometheus service gRPC port, (ignored if `server.service.gRPC.enabled` is not `true`) | `10901` -`server.service.gRPC.nodePort` | Port to be used as gRPC nodePort in the prometheus service | `0` -`server.service.statefulsetReplica.enabled` | If true, send the traffic from the service to only one replica of the replicaset | `false` -`server.service.statefulsetReplica.replica` | Which replica to send the traffice to | `0` -`server.sidecarContainers` | array of snippets with your sidecar containers for prometheus server | `""` -`server.strategy` | Deployment strategy | `{ "type": "RollingUpdate" }` -`serviceAccounts.alertmanager.create` | If true, create the alertmanager service account | `true` -`serviceAccounts.alertmanager.name` | name of the alertmanager service account to use or create | `{{ prometheus.alertmanager.fullname }}` -`serviceAccounts.kubeStateMetrics.create` | If true, create the kubeStateMetrics service account | `true` -`serviceAccounts.kubeStateMetrics.name` | name of the kubeStateMetrics service account to use or create | `{{ prometheus.kubeStateMetrics.fullname }}` -`serviceAccounts.nodeExporter.create` | If true, create the nodeExporter service account | `true` -`serviceAccounts.nodeExporter.name` | name of the nodeExporter service account to use or create | `{{ prometheus.nodeExporter.fullname }}` -`serviceAccounts.pushgateway.create` | If true, create the pushgateway service account | `true` -`serviceAccounts.pushgateway.name` | name of the pushgateway service account to use or create | `{{ prometheus.pushgateway.fullname }}` -`serviceAccounts.server.create` | If true, create the server service account | `true` -`serviceAccounts.server.name` | name of the server service account to use or create | `{{ prometheus.server.fullname }}` -`server.terminationGracePeriodSeconds` | Prometheus server Pod termination grace period | `300` -`server.retention` | (optional) Prometheus data retention | `"15d"` -`serverFiles.alerts` | (Deprecated) Prometheus server alerts configuration | `{}` -`serverFiles.rules` | (Deprecated) Prometheus server rules configuration | `{}` -`serverFiles.alerting_rules.yml` | Prometheus server alerts configuration | `{}` -`serverFiles.recording_rules.yml` | Prometheus server rules configuration | `{}` -`serverFiles.prometheus.yml` | Prometheus server scrape configuration | example configuration -`extraScrapeConfigs` | Prometheus server additional scrape configuration | "" -`alertRelabelConfigs` | Prometheus server [alert relabeling configs](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#alert_relabel_configs) for H/A prometheus | "" -`networkPolicy.enabled` | Enable NetworkPolicy | `false` | - -Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, - -```console -$ helm install stable/prometheus --name my-release \ - --set server.terminationGracePeriodSeconds=360 -``` - -Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. For example, - -```console -$ helm install stable/prometheus --name my-release -f values.yaml -``` - -> **Tip**: You can use the default [values.yaml](values.yaml) - -Note that you have multiple yaml files. This is particularly useful when you have alerts belonging to multiple services in the cluster. For example, - -```yaml -# values.yaml -# ... - -# service1-alert.yaml -serverFiles: - alerts: - service1: - - alert: anAlert - # ... - -# service2-alert.yaml -serverFiles: - alerts: - service2: - - alert: anAlert - # ... -``` - -```console -$ helm install stable/prometheus --name my-release -f values.yaml -f service1-alert.yaml -f service2-alert.yaml -``` - -### RBAC Configuration -Roles and RoleBindings resources will be created automatically for `server` and `kubeStateMetrics` services. - -To manually setup RBAC you need to set the parameter `rbac.create=false` and specify the service account to be used for each service by setting the parameters: `serviceAccounts.{{ component }}.create` to `false` and `serviceAccounts.{{ component }}.name` to the name of a pre-existing service account. - -> **Tip**: You can refer to the default `*-clusterrole.yaml` and `*-clusterrolebinding.yaml` files in [templates](templates/) to customize your own. - -### ConfigMap Files -AlertManager is configured through [alertmanager.yml](https://prometheus.io/docs/alerting/configuration/). This file (and any others listed in `alertmanagerFiles`) will be mounted into the `alertmanager` pod. - -Prometheus is configured through [prometheus.yml](https://prometheus.io/docs/operating/configuration/). This file (and any others listed in `serverFiles`) will be mounted into the `server` pod. - -### Ingress TLS -If your cluster allows automatic creation/retrieval of TLS certificates (e.g. [kube-lego](https://github.com/jetstack/kube-lego)), please refer to the documentation for that mechanism. - -To manually configure TLS, first create/retrieve a key & certificate pair for the address(es) you wish to protect. Then create a TLS secret in the namespace: - -```console -kubectl create secret tls prometheus-server-tls --cert=path/to/tls.cert --key=path/to/tls.key -``` - -Include the secret's name, along with the desired hostnames, in the alertmanager/server Ingress TLS section of your custom `values.yaml` file: - -```yaml -server: - ingress: - ## If true, Prometheus server Ingress will be created - ## - enabled: true - - ## Prometheus server Ingress hostnames - ## Must be provided if Ingress is enabled - ## - hosts: - - prometheus.domain.com - - ## Prometheus server Ingress TLS configuration - ## Secrets must be manually created in the namespace - ## - tls: - - secretName: prometheus-server-tls - hosts: - - prometheus.domain.com -``` - -### NetworkPolicy - -Enabling Network Policy for Prometheus will secure connections to Alert Manager -and Kube State Metrics by only accepting connections from Prometheus Server. -All inbound connections to Prometheus Server are still allowed. - -To enable network policy for Prometheus, install a networking plugin that -implements the Kubernetes NetworkPolicy spec, and set `networkPolicy.enabled` to true. - -If NetworkPolicy is enabled for Prometheus' scrape targets, you may also need -to manually create a networkpolicy which allows it. diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/.helmignore b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/.helmignore deleted file mode 100644 index f0c131944..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/.helmignore +++ /dev/null @@ -1,21 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/Chart.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/Chart.yaml deleted file mode 100644 index 7752ccb44..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/Chart.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: v1 -appVersion: 1.9.5 -description: Install kube-state-metrics to generate and expose cluster-level metrics -home: https://github.com/kubernetes/kube-state-metrics/ -keywords: -- metric -- monitoring -- prometheus -- kubernetes -maintainers: -- email: jose@armesto.net - name: fiunchinho -- email: tariq.ibrahim@mulesoft.com - name: tariq1890 -- email: manuel@rueg.eu - name: mrueg -name: kube-state-metrics -sources: -- https://github.com/kubernetes/kube-state-metrics/ -version: 2.7.2 diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/OWNERS b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/OWNERS deleted file mode 100644 index 6ffd97d74..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/OWNERS +++ /dev/null @@ -1,8 +0,0 @@ -approvers: -- fiunchinho -- tariq1890 -- mrueg -reviewers: -- fiunchinho -- tariq1890 -- mrueg diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/README.md b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/README.md deleted file mode 100644 index 5c6456983..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# kube-state-metrics Helm Chart - -* Installs the [kube-state-metrics agent](https://github.com/kubernetes/kube-state-metrics). - -## Installing the Chart - -To install the chart with the release name `my-release`: - -```bash -$ helm install stable/kube-state-metrics -``` - -## Configuration - -| Parameter | Description | Default | -|:---------------------------------------------|:--------------------------------------------------------------------------------------|:-------------------------------------------| -| `image.repository` | The image repository to pull from | quay.io/coreos/kube-state-metrics | -| `image.tag` | The image tag to pull from | `v1.9.5` | -| `image.pullPolicy` | Image pull policy | `IfNotPresent` | -| `replicas` | Number of replicas | `1` | -| `autosharding.enabled` | Set to `true` to automatically shard data across `replicas` pods. EXPERIMENTAL | `false` | -| `service.port` | The port of the container | `8080` | -| `service.annotations` | Annotations to be added to the service | `{}` | -| `customLabels` | Custom labels to apply to service, deployment and pods | `{}` | -| `hostNetwork` | Whether or not to use the host network | `false` | -| `prometheusScrape` | Whether or not enable prom scrape | `true` | -| `rbac.create` | If true, create & use RBAC resources | `true` | -| `serviceAccount.create` | If true, create & use serviceAccount | `true` | -| `serviceAccount.name` | If not set & create is true, use template fullname | | -| `serviceAccount.imagePullSecrets` | Specify image pull secrets field | `[]` | -| `podSecurityPolicy.enabled` | If true, create & use PodSecurityPolicy resources | `false` | -| `podSecurityPolicy.annotations` | Specify pod annotations in the pod security policy | {} | -| `securityContext.enabled` | Enable security context | `true` | -| `securityContext.fsGroup` | Group ID for the container | `65534` | -| `securityContext.runAsUser` | User ID for the container | `65534` | -| `priorityClassName` | Name of Priority Class to assign pods | `nil` | -| `nodeSelector` | Node labels for pod assignment | {} | -| `affinity` | Affinity settings for pod assignment | {} | -| `tolerations` | Tolerations for pod assignment | [] | -| `podAnnotations` | Annotations to be added to the pod | {} | -| `resources` | kube-state-metrics resource requests and limits | {} | -| `collectors.certificatesigningrequests` | Enable the certificatesigningrequests collector. | `true` | -| `collectors.configmaps` | Enable the configmaps collector. | `true` | -| `collectors.cronjobs` | Enable the cronjobs collector. | `true` | -| `collectors.daemonsets` | Enable the daemonsets collector. | `true` | -| `collectors.deployments` | Enable the deployments collector. | `true` | -| `collectors.endpoints` | Enable the endpoints collector. | `true` | -| `collectors.horizontalpodautoscalers` | Enable the horizontalpodautoscalers collector. | `true` | -| `collectors.ingresses` | Enable the ingresses collector. | `true` | -| `collectors.jobs` | Enable the jobs collector. | `true` | -| `collectors.limitranges` | Enable the limitranges collector. | `true` | -| `collectors.mutatingwebhookconfigurations` | Enable the mutatingwebhookconfigurations collector. | `false` | -| `collectors.namespaces` | Enable the namespaces collector. | `true` | -| `collectors.nodes` | Enable the nodes collector. | `true` | -| `collectors.persistentvolumeclaims` | Enable the persistentvolumeclaims collector. | `true` | -| `collectors.persistentvolumes` | Enable the persistentvolumes collector. | `true` | -| `collectors.poddisruptionbudgets` | Enable the poddisruptionbudgets collector. | `true` | -| `collectors.pods` | Enable the pods collector. | `true` | -| `collectors.replicasets` | Enable the replicasets collector. | `true` | -| `collectors.replicationcontrollers` | Enable the replicationcontrollers collector. | `true` | -| `collectors.resourcequotas` | Enable the resourcequotas collector. | `true` | -| `collectors.secrets` | Enable the secrets collector. | `true` | -| `collectors.services` | Enable the services collector. | `true` | -| `collectors.statefulsets` | Enable the statefulsets collector. | `true` | -| `collectors.storageclasses` | Enable the storageclasses collector. | `true` | -| `collectors.validatingwebhookconfigurations` | Enable the validatingwebhookconfigurations collector. | `false` | -| `collectors.verticalpodautoscalers` | Enable the verticalpodautoscalers collector. | `false` | -| `collectors.volumeattachments` | Enable the volumeattachments collector. | `false` | -| `prometheus.monitor.enabled` | Set this to `true` to create ServiceMonitor for Prometheus operator | `false` | -| `prometheus.monitor.additionalLabels` | Additional labels that can be used so ServiceMonitor will be discovered by Prometheus | `{}` | -| `prometheus.monitor.namespace` | Namespace where servicemonitor resource should be created | `the same namespace as kube-state-metrics` | -| `prometheus.monitor.honorLabels` | Honor metric labels | `false` | -| `namespaceOverride` | Override the deployment namespace | `""` (`Release.Namespace`) | diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/NOTES.txt b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/NOTES.txt deleted file mode 100644 index 5a646e0cc..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/NOTES.txt +++ /dev/null @@ -1,10 +0,0 @@ -kube-state-metrics is a simple service that listens to the Kubernetes API server and generates metrics about the state of the objects. -The exposed metrics can be found here: -https://github.com/kubernetes/kube-state-metrics/blob/master/docs/README.md#exposed-metrics - -The metrics are exported on the HTTP endpoint /metrics on the listening port. -In your case, {{ template "kube-state-metrics.fullname" . }}.{{ template "kube-state-metrics.namespace" . }}.svc.cluster.local:{{ .Values.service.port }}/metrics - -They are served either as plaintext or protobuf depending on the Accept header. -They are designed to be consumed either by Prometheus itself or by a scraper that is compatible with scraping a Prometheus client endpoint. - diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/_helpers.tpl b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/_helpers.tpl deleted file mode 100644 index 6ae0e647f..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/_helpers.tpl +++ /dev/null @@ -1,47 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "kube-state-metrics.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "kube-state-metrics.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use -*/}} -{{- define "kube-state-metrics.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "kube-state-metrics.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts -*/}} -{{- define "kube-state-metrics.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrole.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrole.yaml deleted file mode 100644 index 319aec16c..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrole.yaml +++ /dev/null @@ -1,180 +0,0 @@ -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - name: {{ template "kube-state-metrics.fullname" . }} -rules: -{{ if .Values.collectors.certificatesigningrequests }} -- apiGroups: ["certificates.k8s.io"] - resources: - - certificatesigningrequests - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.configmaps }} -- apiGroups: [""] - resources: - - configmaps - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.cronjobs }} -- apiGroups: ["batch"] - resources: - - cronjobs - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.daemonsets }} -- apiGroups: ["extensions", "apps"] - resources: - - daemonsets - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.deployments }} -- apiGroups: ["extensions", "apps"] - resources: - - deployments - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.endpoints }} -- apiGroups: [""] - resources: - - endpoints - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.horizontalpodautoscalers }} -- apiGroups: ["autoscaling"] - resources: - - horizontalpodautoscalers - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.ingresses }} -- apiGroups: ["extensions", "networking.k8s.io"] - resources: - - ingresses - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.jobs }} -- apiGroups: ["batch"] - resources: - - jobs - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.limitranges }} -- apiGroups: [""] - resources: - - limitranges - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.mutatingwebhookconfigurations }} -- apiGroups: ["admissionregistration.k8s.io"] - resources: - - mutatingwebhookconfigurations - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.namespaces }} -- apiGroups: [""] - resources: - - namespaces - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.networkpolicies }} -- apiGroups: ["networking.k8s.io"] - resources: - - networkpolicies - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.nodes }} -- apiGroups: [""] - resources: - - nodes - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.persistentvolumeclaims }} -- apiGroups: [""] - resources: - - persistentvolumeclaims - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.persistentvolumes }} -- apiGroups: [""] - resources: - - persistentvolumes - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.poddisruptionbudgets }} -- apiGroups: ["policy"] - resources: - - poddisruptionbudgets - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.pods }} -- apiGroups: [""] - resources: - - pods - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.replicasets }} -- apiGroups: ["extensions", "apps"] - resources: - - replicasets - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.replicationcontrollers }} -- apiGroups: [""] - resources: - - replicationcontrollers - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.resourcequotas }} -- apiGroups: [""] - resources: - - resourcequotas - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.secrets }} -- apiGroups: [""] - resources: - - secrets - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.services }} -- apiGroups: [""] - resources: - - services - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.statefulsets }} -- apiGroups: ["apps"] - resources: - - statefulsets - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.storageclasses }} -- apiGroups: ["storage.k8s.io"] - resources: - - storageclasses - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.validatingwebhookconfigurations }} -- apiGroups: ["admissionregistration.k8s.io"] - resources: - - validatingwebhookconfigurations - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.volumeattachments }} -- apiGroups: ["storage.k8s.io"] - resources: - - volumeattachments - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.verticalpodautoscalers }} -- apiGroups: ["autoscaling.k8s.io"] - resources: - - verticalpodautoscalers - verbs: ["list", "watch"] -{{ end -}} -{{- end -}} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrolebinding.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrolebinding.yaml deleted file mode 100644 index 4635985aa..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - name: {{ template "kube-state-metrics.fullname" . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "kube-state-metrics.fullname" . }} -subjects: -- kind: ServiceAccount - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -{{- end -}} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/deployment.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/deployment.yaml deleted file mode 100644 index b6affcc20..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/deployment.yaml +++ /dev/null @@ -1,186 +0,0 @@ -apiVersion: apps/v1 -{{- if .Values.autosharding.enabled }} -kind: StatefulSet -{{- else }} -kind: Deployment -{{- end }} -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - app.kubernetes.io/instance: "{{ .Release.Name }}" - app.kubernetes.io/managed-by: "{{ .Release.Service }}" -{{- if .Values.customLabels }} -{{ toYaml .Values.customLabels | indent 4 }} -{{- end }} -spec: - selector: - matchLabels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - replicas: {{ .Values.replicas }} -{{- if .Values.autosharding.enabled }} - serviceName: {{ template "kube-state-metrics.fullname" . }} - volumeClaimTemplates: [] -{{- end }} - template: - metadata: - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - app.kubernetes.io/instance: "{{ .Release.Name }}" -{{- if .Values.customLabels }} -{{ toYaml .Values.customLabels | indent 8 }} -{{- end }} -{{- if .Values.podAnnotations }} - annotations: -{{ toYaml .Values.podAnnotations | indent 8 }} -{{- end }} - spec: - hostNetwork: {{ .Values.hostNetwork }} - serviceAccountName: {{ template "kube-state-metrics.serviceAccountName" . }} - {{- if .Values.securityContext.enabled }} - securityContext: - fsGroup: {{ .Values.securityContext.fsGroup }} - runAsUser: {{ .Values.securityContext.runAsUser }} - {{- end }} - {{- if .Values.priorityClassName }} - priorityClassName: {{ .Values.priorityClassName }} - {{- end }} - containers: - - name: {{ .Chart.Name }} -{{- if .Values.autosharding.enabled }} - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace -{{- end }} - args: -{{ if .Values.collectors.certificatesigningrequests }} - - --collectors=certificatesigningrequests -{{ end }} -{{ if .Values.collectors.configmaps }} - - --collectors=configmaps -{{ end }} -{{ if .Values.collectors.cronjobs }} - - --collectors=cronjobs -{{ end }} -{{ if .Values.collectors.daemonsets }} - - --collectors=daemonsets -{{ end }} -{{ if .Values.collectors.deployments }} - - --collectors=deployments -{{ end }} -{{ if .Values.collectors.endpoints }} - - --collectors=endpoints -{{ end }} -{{ if .Values.collectors.horizontalpodautoscalers }} - - --collectors=horizontalpodautoscalers -{{ end }} -{{ if .Values.collectors.ingresses }} - - --collectors=ingresses -{{ end }} -{{ if .Values.collectors.jobs }} - - --collectors=jobs -{{ end }} -{{ if .Values.collectors.limitranges }} - - --collectors=limitranges -{{ end }} -{{ if .Values.collectors.mutatingwebhookconfigurations }} - - --collectors=mutatingwebhookconfigurations -{{ end }} -{{ if .Values.collectors.namespaces }} - - --collectors=namespaces -{{ end }} -{{ if .Values.collectors.networkpolicies }} - - --collectors=networkpolicies -{{ end }} -{{ if .Values.collectors.nodes }} - - --collectors=nodes -{{ end }} -{{ if .Values.collectors.persistentvolumeclaims }} - - --collectors=persistentvolumeclaims -{{ end }} -{{ if .Values.collectors.persistentvolumes }} - - --collectors=persistentvolumes -{{ end }} -{{ if .Values.collectors.poddisruptionbudgets }} - - --collectors=poddisruptionbudgets -{{ end }} -{{ if .Values.collectors.pods }} - - --collectors=pods -{{ end }} -{{ if .Values.collectors.replicasets }} - - --collectors=replicasets -{{ end }} -{{ if .Values.collectors.replicationcontrollers }} - - --collectors=replicationcontrollers -{{ end }} -{{ if .Values.collectors.resourcequotas }} - - --collectors=resourcequotas -{{ end }} -{{ if .Values.collectors.secrets }} - - --collectors=secrets -{{ end }} -{{ if .Values.collectors.services }} - - --collectors=services -{{ end }} -{{ if .Values.collectors.statefulsets }} - - --collectors=statefulsets -{{ end }} -{{ if .Values.collectors.storageclasses }} - - --collectors=storageclasses -{{ end }} -{{ if .Values.collectors.validatingwebhookconfigurations }} - - --collectors=validatingwebhookconfigurations -{{ end }} -{{ if .Values.collectors.verticalpodautoscalers }} - - --collectors=verticalpodautoscalers -{{ end }} -{{ if .Values.collectors.volumeattachments }} - - --collectors=volumeattachments -{{ end }} -{{ if .Values.namespace }} - - --namespace={{ .Values.namespace }} -{{ end }} -{{ if .Values.autosharding.enabled }} - - --pod=$(POD_NAME) - - --pod-namespace=$(POD_NAMESPACE) -{{ end }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - ports: - - containerPort: 8080 - livenessProbe: - httpGet: - path: /healthz - port: 8080 - initialDelaySeconds: 5 - timeoutSeconds: 5 - readinessProbe: - httpGet: - path: / - port: 8080 - initialDelaySeconds: 5 - timeoutSeconds: 5 -{{- if .Values.resources }} - resources: -{{ toYaml .Values.resources | indent 10 }} -{{- end }} -{{- if .Values.affinity }} - affinity: -{{ toYaml .Values.affinity | indent 8 }} -{{- end }} -{{- if .Values.nodeSelector }} - nodeSelector: -{{ toYaml .Values.nodeSelector | indent 8 }} -{{- end }} -{{- if .Values.tolerations }} - tolerations: -{{ toYaml .Values.tolerations | indent 8 }} -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/podsecuritypolicy.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/podsecuritypolicy.yaml deleted file mode 100644 index aeff11791..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/podsecuritypolicy.yaml +++ /dev/null @@ -1,39 +0,0 @@ -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -{{- if .Values.podSecurityPolicy.annotations }} - annotations: -{{ toYaml .Values.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -spec: - privileged: false - volumes: - - 'secret' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrole.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrole.yaml deleted file mode 100644 index dcd65e13e..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrole.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.podSecurityPolicy.enabled -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - name: psp-{{ template "kube-state-metrics.fullname" . }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "kube-state-metrics.fullname" . }} -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrolebinding.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrolebinding.yaml deleted file mode 100644 index a206e640d..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrolebinding.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if and .Values.podSecurityPolicy.enabled -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - name: psp-{{ template "kube-state-metrics.fullname" . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: psp-{{ template "kube-state-metrics.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/service.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/service.yaml deleted file mode 100644 index 5dacf5217..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/service.yaml +++ /dev/null @@ -1,36 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - app.kubernetes.io/instance: "{{ .Release.Name }}" - app.kubernetes.io/managed-by: "{{ .Release.Service }}" -{{- if .Values.customLabels }} -{{ toYaml .Values.customLabels | indent 4 }} -{{- end }} - annotations: - {{- if .Values.prometheusScrape }} - prometheus.io/scrape: '{{ .Values.prometheusScrape }}' - {{- end }} - {{- if .Values.service.annotations }} - {{- toYaml .Values.service.annotations | nindent 4 }} - {{- end }} -spec: - type: "{{ .Values.service.type }}" - ports: - - name: "http" - protocol: TCP - port: {{ .Values.service.port }} - {{- if .Values.service.nodePort }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - targetPort: 8080 -{{- if .Values.service.loadBalancerIP }} - loadBalancerIP: "{{ .Values.service.loadBalancerIP }}" -{{- end }} - selector: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/serviceaccount.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/serviceaccount.yaml deleted file mode 100644 index 32bb1640f..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/serviceaccount.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -imagePullSecrets: -{{ toYaml .Values.serviceAccount.imagePullSecrets | indent 2 }} -{{- end -}} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/servicemonitor.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/servicemonitor.yaml deleted file mode 100644 index 54cde362d..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/servicemonitor.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.prometheus.monitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - app.kubernetes.io/instance: "{{ .Release.Name }}" - app.kubernetes.io/managed-by: "{{ .Release.Service }}" - {{- if .Values.prometheus.monitor.additionalLabels }} -{{ toYaml .Values.prometheus.monitor.additionalLabels | indent 4 }} - {{- end }} -spec: - selector: - matchLabels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - endpoints: - - port: http - {{- if .Values.prometheus.monitor.honorLabels }} - honorLabels: true - {{- end }} -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-role.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-role.yaml deleted file mode 100644 index bf5396072..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-role.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if and .Values.autosharding.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: stsdiscovery-{{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -rules: -- apiGroups: - - "" - resources: - - pods - verbs: - - get -- apiGroups: - - apps - resourceNames: - - kube-state-metrics - resources: - - statefulsets - verbs: - - get -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-rolebinding.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-rolebinding.yaml deleted file mode 100644 index 6a2e5bfe7..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-rolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and .Values.autosharding.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: stsdiscovery-{{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: stsdiscovery-{{ template "kube-state-metrics.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/values.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/values.yaml deleted file mode 100644 index 888ca544b..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/values.yaml +++ /dev/null @@ -1,126 +0,0 @@ -# Default values for kube-state-metrics. -prometheusScrape: true -image: - repository: quay.io/coreos/kube-state-metrics - tag: v1.9.5 - pullPolicy: IfNotPresent - -# If set to true, this will deploy kube-state-metrics as a StatefulSet and the data -# will be automatically sharded across <.Values.replicas> pods using the built-in -# autodiscovery feature: https://github.com/kubernetes/kube-state-metrics#automated-sharding -# This is an experimental feature and there are no stability guarantees. -autosharding: - enabled: false - -replicas: 1 - -service: - port: 8080 - # Default to clusterIP for backward compatibility - type: ClusterIP - nodePort: 0 - loadBalancerIP: "" - annotations: {} - -customLabels: {} - -hostNetwork: false - -rbac: - # If true, create & use RBAC resources - create: true - -serviceAccount: - # Specifies whether a ServiceAccount should be created, require rbac true - create: true - # The name of the ServiceAccount to use. - # If not set and create is true, a name is generated using the fullname template - name: - # Reference to one or more secrets to be used when pulling images - # ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - imagePullSecrets: [] - -prometheus: - monitor: - enabled: false - additionalLabels: {} - namespace: "" - honorLabels: false - -## Specify if a Pod Security Policy for kube-state-metrics must be created -## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ -## -podSecurityPolicy: - enabled: false - annotations: {} - ## Specify pod annotations - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl - ## - # seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' - # seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - # apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - - -securityContext: - enabled: true - runAsUser: 65534 - fsGroup: 65534 - -## Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -nodeSelector: {} - -## Affinity settings for pod assignment -## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ -affinity: {} - -## Tolerations for pod assignment -## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -tolerations: [] - -# Annotations to be added to the pod -podAnnotations: {} - -## Assign a PriorityClassName to pods if set -# priorityClassName: "" - -# Available collectors for kube-state-metrics. By default all available -# collectors are enabled. -collectors: - certificatesigningrequests: true - configmaps: true - cronjobs: true - daemonsets: true - deployments: true - endpoints: true - horizontalpodautoscalers: true - ingresses: true - jobs: true - limitranges: true - mutatingwebhookconfigurations: false - namespaces: true - networkpolicies: false - nodes: true - persistentvolumeclaims: true - persistentvolumes: true - poddisruptionbudgets: true - pods: true - replicasets: true - replicationcontrollers: true - resourcequotas: true - secrets: false - services: true - statefulsets: true - storageclasses: true - validatingwebhookconfigurations: false - verticalpodautoscalers: false - volumeattachments: false - -# Namespace to be enabled for collecting resources. By default all namespaces are collected. -# namespace: "" - -## Override the deployment namespace -## -namespaceOverride: "" diff --git a/charts/kubecost/charts/prometheus/requirements.yaml b/charts/kubecost/charts/prometheus/requirements.yaml deleted file mode 100644 index 6e079ae7d..000000000 --- a/charts/kubecost/charts/prometheus/requirements.yaml +++ /dev/null @@ -1,7 +0,0 @@ -dependencies: - - - name: kube-state-metrics - version: "2.7.*" - repository: https://kubernetes-charts.storage.googleapis.com/ - condition: kubeStateMetrics.enabled - diff --git a/charts/kubecost/charts/prometheus/templates/NOTES.txt b/charts/kubecost/charts/prometheus/templates/NOTES.txt deleted file mode 100644 index 0e8868f0b..000000000 --- a/charts/kubecost/charts/prometheus/templates/NOTES.txt +++ /dev/null @@ -1,112 +0,0 @@ -{{- if .Values.server.enabled -}} -The Prometheus server can be accessed via port {{ .Values.server.service.servicePort }} on the following DNS name from within your cluster: -{{ template "prometheus.server.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - -{{ if .Values.server.ingress.enabled -}} -From outside the cluster, the server URL(s) are: -{{- range .Values.server.ingress.hosts }} -http://{{ . }} -{{- end }} -{{- else }} -Get the Prometheus server URL by running these commands in the same shell: -{{- if contains "NodePort" .Values.server.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "prometheus.server.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.server.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "prometheus.server.fullname" . }}' - - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "prometheus.server.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo http://$SERVICE_IP:{{ .Values.server.service.servicePort }} -{{- else if contains "ClusterIP" .Values.server.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "prometheus.name" . }},component={{ .Values.server.name }}" -o jsonpath="{.items[0].metadata.name}") - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 9090 -{{- end }} -{{- end }} - -{{- if .Values.server.persistentVolume.enabled }} -{{- else }} -################################################################################# -###### WARNING: Persistence is disabled!!! You will lose your data when ##### -###### the Server pod is terminated. ##### -################################################################################# -{{- end }} -{{- end }} - -{{ if .Values.alertmanager.enabled }} -The Prometheus alertmanager can be accessed via port {{ .Values.alertmanager.service.servicePort }} on the following DNS name from within your cluster: -{{ template "prometheus.alertmanager.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - -{{ if .Values.alertmanager.ingress.enabled -}} -From outside the cluster, the alertmanager URL(s) are: -{{- range .Values.alertmanager.ingress.hosts }} -http://{{ . }} -{{- end }} -{{- else }} -Get the Alertmanager URL by running these commands in the same shell: -{{- if contains "NodePort" .Values.alertmanager.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "prometheus.alertmanager.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.alertmanager.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "prometheus.alertmanager.fullname" . }}' - - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "prometheus.alertmanager.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo http://$SERVICE_IP:{{ .Values.alertmanager.service.servicePort }} -{{- else if contains "ClusterIP" .Values.alertmanager.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "prometheus.name" . }},component={{ .Values.alertmanager.name }}" -o jsonpath="{.items[0].metadata.name}") - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 9093 -{{- end }} -{{- end }} - -{{- if .Values.alertmanager.persistentVolume.enabled }} -{{- else }} -################################################################################# -###### WARNING: Persistence is disabled!!! You will lose your data when ##### -###### the AlertManager pod is terminated. ##### -################################################################################# -{{- end }} -{{- end }} - -{{- if .Values.nodeExporter.podSecurityPolicy.enabled }} -{{- else }} -################################################################################# -###### WARNING: Pod Security Policy has been moved to a global property. ##### -###### use .Values.podSecurityPolicy.enabled with pod-based ##### -###### annotations ##### -###### (e.g. .Values.nodeExporter.podSecurityPolicy.annotations) ##### -################################################################################# -{{- end }} - -{{ if .Values.pushgateway.enabled }} -The Prometheus PushGateway can be accessed via port {{ .Values.pushgateway.service.servicePort }} on the following DNS name from within your cluster: -{{ template "prometheus.pushgateway.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - -{{ if .Values.pushgateway.ingress.enabled -}} -From outside the cluster, the pushgateway URL(s) are: -{{- range .Values.pushgateway.ingress.hosts }} -http://{{ . }} -{{- end }} -{{- else }} -Get the PushGateway URL by running these commands in the same shell: -{{- if contains "NodePort" .Values.pushgateway.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "prometheus.pushgateway.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.pushgateway.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "prometheus.pushgateway.fullname" . }}' - - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "prometheus.pushgateway.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo http://$SERVICE_IP:{{ .Values.pushgateway.service.servicePort }} -{{- else if contains "ClusterIP" .Values.pushgateway.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "prometheus.name" . }},component={{ .Values.pushgateway.name }}" -o jsonpath="{.items[0].metadata.name}") - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 9091 -{{- end }} -{{- end }} -{{- end }} - -For more information on running Prometheus, visit: -https://prometheus.io/ diff --git a/charts/kubecost/charts/prometheus/templates/_helpers.tpl b/charts/kubecost/charts/prometheus/templates/_helpers.tpl deleted file mode 100644 index 295aa01c5..000000000 --- a/charts/kubecost/charts/prometheus/templates/_helpers.tpl +++ /dev/null @@ -1,276 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "prometheus.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "prometheus.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create unified labels for prometheus components -*/}} -{{- define "prometheus.common.matchLabels" -}} -app: {{ template "prometheus.name" . }} -release: {{ .Release.Name }} -{{- end -}} - -{{- define "prometheus.common.metaLabels" -}} -chart: {{ template "prometheus.chart" . }} -heritage: {{ .Release.Service }} -{{- end -}} - -{{- define "prometheus.alertmanager.labels" -}} -{{ include "prometheus.alertmanager.matchLabels" . }} -{{ include "prometheus.common.metaLabels" . }} -{{- end -}} - -{{- define "prometheus.alertmanager.matchLabels" -}} -component: {{ .Values.alertmanager.name | quote }} -{{ include "prometheus.common.matchLabels" . }} -{{- end -}} - -{{- define "prometheus.kubeStateMetrics.labels" -}} -{{ include "prometheus.kubeStateMetrics.matchLabels" . }} -{{ include "prometheus.common.metaLabels" . }} -{{- end -}} - -{{- define "prometheus.kubeStateMetrics.matchLabels" -}} -component: {{ .Values.kubeStateMetrics.name | quote }} -{{ include "prometheus.common.matchLabels" . }} -{{- end -}} - -{{- define "prometheus.nodeExporter.labels" -}} -{{ include "prometheus.nodeExporter.matchLabels" . }} -{{ include "prometheus.common.metaLabels" . }} -{{- end -}} - -{{- define "prometheus.nodeExporter.matchLabels" -}} -component: {{ .Values.nodeExporter.name | quote }} -{{ include "prometheus.common.matchLabels" . }} -{{- end -}} - -{{- define "prometheus.pushgateway.labels" -}} -{{ include "prometheus.pushgateway.matchLabels" . }} -{{ include "prometheus.common.metaLabels" . }} -{{- end -}} - -{{- define "prometheus.pushgateway.matchLabels" -}} -component: {{ .Values.pushgateway.name | quote }} -{{ include "prometheus.common.matchLabels" . }} -{{- end -}} - -{{- define "prometheus.server.labels" -}} -{{ include "prometheus.server.matchLabels" . }} -{{ include "prometheus.common.metaLabels" . }} -{{- end -}} - -{{- define "prometheus.server.matchLabels" -}} -component: {{ .Values.server.name | quote }} -{{ include "prometheus.common.matchLabels" . }} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "prometheus.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified alertmanager name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} - -{{- define "prometheus.alertmanager.fullname" -}} -{{- if .Values.alertmanager.fullnameOverride -}} -{{- .Values.alertmanager.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- printf "%s-%s" .Release.Name .Values.alertmanager.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s-%s" .Release.Name $name .Values.alertmanager.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified kube-state-metrics name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "prometheus.kubeStateMetrics.fullname" -}} -{{- if .Values.kubeStateMetrics.fullnameOverride -}} -{{- .Values.kubeStateMetrics.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- printf "%s-%s" .Release.Name .Values.kubeStateMetrics.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s-%s" .Release.Name $name .Values.kubeStateMetrics.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified node-exporter name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "prometheus.nodeExporter.fullname" -}} -{{- if .Values.nodeExporter.fullnameOverride -}} -{{- .Values.nodeExporter.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- printf "%s-%s" .Release.Name .Values.nodeExporter.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s-%s" .Release.Name $name .Values.nodeExporter.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified Prometheus server name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "prometheus.server.fullname" -}} -{{- if .Values.server.fullnameOverride -}} -{{- .Values.server.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- printf "%s-%s" .Release.Name .Values.server.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s-%s" .Release.Name $name .Values.server.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified pushgateway name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "prometheus.pushgateway.fullname" -}} -{{- if .Values.pushgateway.fullnameOverride -}} -{{- .Values.pushgateway.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- printf "%s-%s" .Release.Name .Values.pushgateway.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s-%s" .Release.Name $name .Values.pushgateway.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "prometheus.deployment.apiVersion" -}} -{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.9-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} -{{/* -Return the appropriate apiVersion for daemonset. -*/}} -{{- define "prometheus.daemonset.apiVersion" -}} -{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.9-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "prometheus.networkPolicy.apiVersion" -}} -{{- if semverCompare ">=1.4-0, <1.7-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.7-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} -{{/* -Return the appropriate apiVersion for podsecuritypolicy. -*/}} -{{- define "prometheus.podSecurityPolicy.apiVersion" -}} -{{- if semverCompare ">=1.3-0, <1.10-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.10-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "policy/v1beta1" -}} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for the alertmanager component -*/}} -{{- define "prometheus.serviceAccountName.alertmanager" -}} -{{- if .Values.serviceAccounts.alertmanager.create -}} - {{ default (include "prometheus.alertmanager.fullname" .) .Values.serviceAccounts.alertmanager.name }} -{{- else -}} - {{ default "default" .Values.serviceAccounts.alertmanager.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for the kubeStateMetrics component -*/}} -{{- define "prometheus.serviceAccountName.kubeStateMetrics" -}} -{{- if .Values.serviceAccounts.kubeStateMetrics.create -}} - {{ default (include "prometheus.kubeStateMetrics.fullname" .) .Values.serviceAccounts.kubeStateMetrics.name }} -{{- else -}} - {{ default "default" .Values.serviceAccounts.kubeStateMetrics.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for the nodeExporter component -*/}} -{{- define "prometheus.serviceAccountName.nodeExporter" -}} -{{- if .Values.serviceAccounts.nodeExporter.create -}} - {{ default (include "prometheus.nodeExporter.fullname" .) .Values.serviceAccounts.nodeExporter.name }} -{{- else -}} - {{ default "default" .Values.serviceAccounts.nodeExporter.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for the pushgateway component -*/}} -{{- define "prometheus.serviceAccountName.pushgateway" -}} -{{- if .Values.serviceAccounts.pushgateway.create -}} - {{ default (include "prometheus.pushgateway.fullname" .) .Values.serviceAccounts.pushgateway.name }} -{{- else -}} - {{ default "default" .Values.serviceAccounts.pushgateway.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for the server component -*/}} -{{- define "prometheus.serviceAccountName.server" -}} -{{- if .Values.serviceAccounts.server.create -}} - {{ default (include "prometheus.server.fullname" .) .Values.serviceAccounts.server.name }} -{{- else -}} - {{ default "default" .Values.serviceAccounts.server.name }} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-clusterrole.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-clusterrole.yaml deleted file mode 100644 index 9bec69257..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-clusterrole.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.alertmanager.fullname" . }} -rules: -{{- if .Values.podSecurityPolicy.enabled }} - - apiGroups: - - extensions - resources: - - podsecuritypolicies - verbs: - - use - resourceNames: - - {{ template "prometheus.alertmanager.fullname" . }} -{{- else }} - [] -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-clusterrolebinding.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-clusterrolebinding.yaml deleted file mode 100644 index a058c7121..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-clusterrolebinding.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRoleBinding -metadata: - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.alertmanager.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "prometheus.serviceAccountName.alertmanager" . }} - namespace: {{ .Release.Namespace }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "prometheus.alertmanager.fullname" . }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-configmap.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-configmap.yaml deleted file mode 100644 index 09708915c..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-configmap.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled (and (empty .Values.alertmanager.configMapOverrideName) (empty .Values.alertmanager.configFromSecret)) -}} -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.alertmanager.fullname" . }} -data: -{{- $root := . -}} -{{- range $key, $value := .Values.alertmanagerFiles }} - {{- if $key | regexMatch ".*\\.ya?ml$" }} - {{ $key }}: | -{{ toYaml $value | default "{}" | indent 4 }} - {{- else }} - {{ $key }}: {{ toYaml $value | indent 4 }} - {{- end }} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-deployment.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-deployment.yaml deleted file mode 100644 index 892204ab2..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-deployment.yaml +++ /dev/null @@ -1,141 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled (not .Values.alertmanager.statefulSet.enabled) -}} -apiVersion: {{ template "prometheus.deployment.apiVersion" . }} -kind: Deployment -metadata: - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.alertmanager.fullname" . }} -spec: - selector: - matchLabels: - {{- include "prometheus.alertmanager.matchLabels" . | nindent 6 }} - replicas: {{ .Values.alertmanager.replicaCount }} - {{- if .Values.alertmanager.strategy }} - strategy: -{{ toYaml .Values.alertmanager.strategy | indent 4 }} - {{- end }} - template: - metadata: - {{- if .Values.alertmanager.podAnnotations }} - annotations: -{{ toYaml .Values.alertmanager.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 8 }} - {{- if .Values.alertmanager.podLabels}} - {{ toYaml .Values.alertmanager.podLabels | nindent 8 }} - {{- end}} - spec: -{{- if .Values.alertmanager.schedulerName }} - schedulerName: "{{ .Values.alertmanager.schedulerName }}" -{{- end }} - serviceAccountName: {{ template "prometheus.serviceAccountName.alertmanager" . }} -{{- if .Values.alertmanager.priorityClassName }} - priorityClassName: "{{ .Values.alertmanager.priorityClassName }}" -{{- end }} - containers: - - name: {{ template "prometheus.name" . }}-{{ .Values.alertmanager.name }} - image: "{{ .Values.alertmanager.image.repository }}:{{ .Values.alertmanager.image.tag }}" - imagePullPolicy: "{{ .Values.alertmanager.image.pullPolicy }}" - env: - {{- range $key, $value := .Values.alertmanager.extraEnv }} - - name: {{ $key }} - value: {{ $value }} - {{- end }} - - name: POD_IP - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: status.podIP - args: - - --config.file=/etc/config/{{ .Values.alertmanager.configFileName }} - - --storage.path={{ .Values.alertmanager.persistentVolume.mountPath }} - - --cluster.advertise-address=$(POD_IP):6783 - {{- range $key, $value := .Values.alertmanager.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- if .Values.alertmanager.baseURL }} - - --web.external-url={{ .Values.alertmanager.baseURL }} - {{- end }} - - ports: - - containerPort: 9093 - readinessProbe: - httpGet: - path: {{ .Values.alertmanager.prefixURL }}/-/ready - port: 9093 - initialDelaySeconds: 30 - timeoutSeconds: 30 - resources: -{{ toYaml .Values.alertmanager.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - - name: storage-volume - mountPath: "{{ .Values.alertmanager.persistentVolume.mountPath }}" - subPath: "{{ .Values.alertmanager.persistentVolume.subPath }}" - {{- range .Values.alertmanager.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - - {{- if .Values.configmapReload.alertmanager.enabled }} - - name: {{ template "prometheus.name" . }}-{{ .Values.alertmanager.name }}-{{ .Values.configmapReload.alertmanager.name }} - image: "{{ .Values.configmapReload.alertmanager.image.repository }}:{{ .Values.configmapReload.alertmanager.image.tag }}" - imagePullPolicy: "{{ .Values.configmapReload.alertmanager.image.pullPolicy }}" - args: - - --volume-dir=/etc/config - - --webhook-url=http://127.0.0.1:9093{{ .Values.alertmanager.prefixURL }}/-/reload - resources: -{{ toYaml .Values.configmapReload.alertmanager.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.alertmanager.nodeSelector }} - nodeSelector: -{{ toYaml .Values.alertmanager.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.alertmanager.securityContext }} - securityContext: -{{ toYaml .Values.alertmanager.securityContext | indent 8 }} - {{- end }} - {{- if .Values.alertmanager.tolerations }} - tolerations: -{{ toYaml .Values.alertmanager.tolerations | indent 8 }} - {{- end }} - {{- if .Values.alertmanager.affinity }} - affinity: -{{ toYaml .Values.alertmanager.affinity | indent 8 }} - {{- end }} - volumes: - - name: config-volume - {{- if empty .Values.alertmanager.configFromSecret }} - configMap: - name: {{ if .Values.alertmanager.configMapOverrideName }}{{ .Release.Name }}-{{ .Values.alertmanager.configMapOverrideName }}{{- else }}{{ template "prometheus.alertmanager.fullname" . }}{{- end }} - {{- else }} - secret: - secretName: {{ .Values.alertmanager.configFromSecret }} - {{- end }} - {{- range .Values.alertmanager.extraSecretMounts }} - - name: {{ .name }} - secret: - secretName: {{ .secretName }} - {{- end }} - - name: storage-volume - {{- if .Values.alertmanager.persistentVolume.enabled }} - persistentVolumeClaim: - claimName: {{ if .Values.alertmanager.persistentVolume.existingClaim }}{{ .Values.alertmanager.persistentVolume.existingClaim }}{{- else }}{{ template "prometheus.alertmanager.fullname" . }}{{- end }} - {{- else }} - emptyDir: {} - {{- end -}} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-ingress.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-ingress.yaml deleted file mode 100644 index dc6ba4418..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-ingress.yaml +++ /dev/null @@ -1,44 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.alertmanager.ingress.enabled -}} -{{- $releaseName := .Release.Name -}} -{{- $serviceName := include "prometheus.alertmanager.fullname" . }} -{{- $servicePort := .Values.alertmanager.service.servicePort -}} -{{- $extraPaths := .Values.alertmanager.ingress.extraPaths -}} -{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} -apiVersion: networking.k8s.io/v1beta1 -{{ else }} -apiVersion: extensions/v1beta1 -{{ end -}} -kind: Ingress -metadata: -{{- if .Values.alertmanager.ingress.annotations }} - annotations: -{{ toYaml .Values.alertmanager.ingress.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} -{{- range $key, $value := .Values.alertmanager.ingress.extraLabels }} - {{ $key }}: {{ $value }} -{{- end }} - name: {{ template "prometheus.alertmanager.fullname" . }} -spec: - rules: - {{- range .Values.alertmanager.ingress.hosts }} - {{- $url := splitList "/" . }} - - host: {{ first $url }} - http: - paths: -{{ if $extraPaths }} -{{ toYaml $extraPaths | indent 10 }} -{{- end }} - - path: /{{ rest $url | join "/" }} - backend: - serviceName: {{ $serviceName }} - servicePort: {{ $servicePort }} - {{- end -}} -{{- if .Values.alertmanager.ingress.tls }} - tls: -{{ toYaml .Values.alertmanager.ingress.tls | indent 4 }} - {{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-networkpolicy.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-networkpolicy.yaml deleted file mode 100644 index 62633d0bc..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-networkpolicy.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.networkPolicy.enabled -}} -apiVersion: {{ template "prometheus.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - name: {{ template "prometheus.alertmanager.fullname" . }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} -spec: - podSelector: - matchLabels: - {{- include "prometheus.alertmanager.matchLabels" . | nindent 6 }} - ingress: - - from: - - podSelector: - matchLabels: - {{- include "prometheus.server.matchLabels" . | nindent 12 }} - - ports: - - port: 9093 -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-pdb.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-pdb.yaml deleted file mode 100644 index bb190f23d..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-pdb.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.alertmanager.podDisruptionBudget.enabled }} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ template "prometheus.alertmanager.fullname" . }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} -spec: - maxUnavailable: {{ .Values.alertmanager.podDisruptionBudget.maxUnavailable }} - selector: - matchLabels: - {{- include "prometheus.alertmanager.labels" . | nindent 6 }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-podsecuritypolicy.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-podsecuritypolicy.yaml deleted file mode 100644 index da2fbbd1c..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-podsecuritypolicy.yaml +++ /dev/null @@ -1,50 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.rbac.create }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: {{ template "prometheus.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: {{ template "prometheus.alertmanager.fullname" . }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - annotations: -{{- if .Values.alertmanager.podSecurityPolicy.annotations }} -{{ toYaml .Values.alertmanager.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -spec: - privileged: false - allowPrivilegeEscalation: false - requiredDropCapabilities: - - ALL - volumes: - - 'configMap' - - 'persistentVolumeClaim' - - 'emptyDir' - - 'secret' - allowedHostPaths: - - pathPrefix: /etc - readOnly: true - - pathPrefix: {{ .Values.alertmanager.persistentVolume.mountPath }} - hostNetwork: false - hostPID: false - hostIPC: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: true -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-pvc.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-pvc.yaml deleted file mode 100644 index 58de9fd39..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-pvc.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if not .Values.alertmanager.statefulSet.enabled -}} -{{- if and .Values.alertmanager.enabled .Values.alertmanager.persistentVolume.enabled -}} -{{- if not .Values.alertmanager.persistentVolume.existingClaim -}} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - {{- if .Values.alertmanager.persistentVolume.annotations }} - annotations: -{{ toYaml .Values.alertmanager.persistentVolume.annotations | indent 4 }} - {{- end }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.alertmanager.fullname" . }} -spec: - accessModes: -{{ toYaml .Values.alertmanager.persistentVolume.accessModes | indent 4 }} -{{- if .Values.alertmanager.persistentVolume.storageClass }} -{{- if (eq "-" .Values.alertmanager.persistentVolume.storageClass) }} - storageClassName: "" -{{- else }} - storageClassName: "{{ .Values.alertmanager.persistentVolume.storageClass }}" -{{- end }} -{{- end }} -{{- if .Values.alertmanager.persistentVolume.volumeBindingMode }} - volumeBindingModeName: "{{ .Values.alertmanager.persistentVolume.volumeBindingMode }}" -{{- end }} - resources: - requests: - storage: "{{ .Values.alertmanager.persistentVolume.size }}" -{{- end -}} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-service-headless.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-service-headless.yaml deleted file mode 100644 index 1519344ba..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-service-headless.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.alertmanager.statefulSet.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.alertmanager.statefulSet.headless.annotations }} - annotations: -{{ toYaml .Values.alertmanager.statefulSet.headless.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} -{{- if .Values.alertmanager.statefulSet.headless.labels }} -{{ toYaml .Values.alertmanager.statefulSet.headless.labels | indent 4 }} -{{- end }} - name: {{ template "prometheus.alertmanager.fullname" . }}-headless -spec: - clusterIP: None - ports: - - name: http - port: {{ .Values.alertmanager.statefulSet.headless.servicePort }} - protocol: TCP - targetPort: 9093 -{{- if .Values.alertmanager.statefulSet.headless.enableMeshPeer }} - - name: meshpeer - port: 6783 - protocol: TCP - targetPort: 6783 -{{- end }} - selector: - {{- include "prometheus.alertmanager.matchLabels" . | nindent 4 }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-service.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-service.yaml deleted file mode 100644 index 9bc45f7c6..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-service.yaml +++ /dev/null @@ -1,54 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.alertmanager.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.alertmanager.service.annotations }} - annotations: -{{ toYaml .Values.alertmanager.service.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} -{{- if .Values.alertmanager.service.labels }} -{{ toYaml .Values.alertmanager.service.labels | indent 4 }} -{{- end }} - name: {{ template "prometheus.alertmanager.fullname" . }} -spec: -{{- if .Values.alertmanager.service.clusterIP }} - clusterIP: {{ .Values.alertmanager.service.clusterIP }} -{{- end }} -{{- if .Values.alertmanager.service.externalIPs }} - externalIPs: -{{ toYaml .Values.alertmanager.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.alertmanager.service.loadBalancerIP }} -{{- end }} -{{- if .Values.alertmanager.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.alertmanager.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} - ports: - - name: http - port: {{ .Values.alertmanager.service.servicePort }} - protocol: TCP - targetPort: 9093 - {{- if .Values.alertmanager.service.nodePort }} - nodePort: {{ .Values.alertmanager.service.nodePort }} - {{- end }} -{{- if .Values.alertmanager.service.enableMeshPeer }} - - name: meshpeer - port: 6783 - protocol: TCP - targetPort: 6783 -{{- end }} - selector: - {{- include "prometheus.alertmanager.matchLabels" . | nindent 4 }} -{{- if .Values.alertmanager.service.sessionAffinity }} - sessionAffinity: {{ .Values.alertmanager.service.sessionAffinity }} -{{- end }} - type: "{{ .Values.alertmanager.service.type }}" -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-serviceaccount.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-serviceaccount.yaml deleted file mode 100644 index d99c29996..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-serviceaccount.yaml +++ /dev/null @@ -1,10 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.serviceAccounts.alertmanager.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.serviceAccountName.alertmanager" . }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-statefulset.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-statefulset.yaml deleted file mode 100644 index 25a9b7a9c..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-statefulset.yaml +++ /dev/null @@ -1,154 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.alertmanager.statefulSet.enabled -}} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.alertmanager.fullname" . }} -spec: - serviceName: {{ template "prometheus.alertmanager.fullname" . }}-headless - selector: - matchLabels: - {{- include "prometheus.alertmanager.matchLabels" . | nindent 6 }} - replicas: {{ .Values.alertmanager.replicaCount }} - podManagementPolicy: {{ .Values.alertmanager.statefulSet.podManagementPolicy }} - template: - metadata: - {{- if .Values.alertmanager.podAnnotations }} - annotations: -{{ toYaml .Values.alertmanager.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 8 }} - spec: -{{- if .Values.alertmanager.affinity }} - affinity: -{{ toYaml .Values.alertmanager.affinity | indent 8 }} -{{- end }} -{{- if .Values.alertmanager.schedulerName }} - schedulerName: "{{ .Values.alertmanager.schedulerName }}" -{{- end }} - serviceAccountName: {{ template "prometheus.serviceAccountName.alertmanager" . }} -{{- if .Values.alertmanager.priorityClassName }} - priorityClassName: "{{ .Values.alertmanager.priorityClassName }}" -{{- end }} - containers: - - name: {{ template "prometheus.name" . }}-{{ .Values.alertmanager.name }} - image: "{{ .Values.alertmanager.image.repository }}:{{ .Values.alertmanager.image.tag }}" - imagePullPolicy: "{{ .Values.alertmanager.image.pullPolicy }}" - env: - {{- range $key, $value := .Values.alertmanager.extraEnv }} - - name: {{ $key }} - value: {{ $value }} - {{- end }} - - name: POD_IP - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: status.podIP - args: - - --config.file=/etc/config/alertmanager.yml - - --storage.path={{ .Values.alertmanager.persistentVolume.mountPath }} - - --cluster.advertise-address=$(POD_IP):6783 - {{- if .Values.alertmanager.statefulSet.headless.enableMeshPeer }} - - --cluster.listen-address=0.0.0.0:6783 - {{- range $n := until (.Values.alertmanager.replicaCount | int) }} - - --cluster.peer={{ template "prometheus.alertmanager.fullname" $ }}-{{ $n }}.{{ template "prometheus.alertmanager.fullname" $ }}-headless:6783 - {{- end }} - {{- end }} - {{- range $key, $value := .Values.alertmanager.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- if .Values.alertmanager.baseURL }} - - --web.external-url={{ .Values.alertmanager.baseURL }} - {{- end }} - - ports: - - containerPort: 9093 - readinessProbe: - httpGet: - path: {{ .Values.alertmanager.prefixURL }}/#/status - port: 9093 - initialDelaySeconds: 30 - timeoutSeconds: 30 - resources: -{{ toYaml .Values.alertmanager.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - - name: storage-volume - mountPath: "{{ .Values.alertmanager.persistentVolume.mountPath }}" - subPath: "{{ .Values.alertmanager.persistentVolume.subPath }}" - {{- range .Values.alertmanager.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- if .Values.configmapReload.alertmanager.enabled }} - - name: {{ template "prometheus.name" . }}-{{ .Values.alertmanager.name }}-{{ .Values.configmapReload.alertmanager.name }} - image: "{{ .Values.configmapReload.alertmanager.image.repository }}:{{ .Values.configmapReload.alertmanager.image.tag }}" - imagePullPolicy: "{{ .Values.configmapReload.alertmanager.image.pullPolicy }}" - args: - - --volume-dir=/etc/config - - --webhook-url=http://localhost:9093{{ .Values.alertmanager.prefixURL }}/-/reload - resources: -{{ toYaml .Values.configmapReload.alertmanager.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.alertmanager.nodeSelector }} - nodeSelector: -{{ toYaml .Values.alertmanager.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.alertmanager.securityContext }} - securityContext: -{{ toYaml .Values.alertmanager.securityContext | indent 8 }} - {{- end }} - {{- if .Values.alertmanager.tolerations }} - tolerations: -{{ toYaml .Values.alertmanager.tolerations | indent 8 }} - {{- end }} - volumes: - - name: config-volume - configMap: - name: {{ if .Values.alertmanager.configMapOverrideName }}{{ .Release.Name }}-{{ .Values.alertmanager.configMapOverrideName }}{{- else }}{{ template "prometheus.alertmanager.fullname" . }}{{- end }} - {{- range .Values.alertmanager.extraSecretMounts }} - - name: {{ .name }} - secret: - secretName: {{ .secretName }} - {{- end }} -{{- if .Values.alertmanager.persistentVolume.enabled }} - volumeClaimTemplates: - - metadata: - name: storage-volume - {{- if .Values.alertmanager.persistentVolume.annotations }} - annotations: -{{ toYaml .Values.alertmanager.persistentVolume.annotations | indent 10 }} - {{- end }} - spec: - accessModes: -{{ toYaml .Values.alertmanager.persistentVolume.accessModes | indent 10 }} - resources: - requests: - storage: "{{ .Values.alertmanager.persistentVolume.size }}" - {{- if .Values.server.persistentVolume.storageClass }} - {{- if (eq "-" .Values.server.persistentVolume.storageClass) }} - storageClassName: "" - {{- else }} - storageClassName: "{{ .Values.alertmanager.persistentVolume.storageClass }}" - {{- end }} - {{- end }} -{{- else }} - - name: storage-volume - emptyDir: {} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/node-exporter-daemonset.yaml b/charts/kubecost/charts/prometheus/templates/node-exporter-daemonset.yaml deleted file mode 100644 index fce0f2714..000000000 --- a/charts/kubecost/charts/prometheus/templates/node-exporter-daemonset.yaml +++ /dev/null @@ -1,125 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.nodeExporter.enabled -}} -apiVersion: {{ template "prometheus.daemonset.apiVersion" . }} -kind: DaemonSet -metadata: -{{- if .Values.nodeExporter.deploymentAnnotations }} - annotations: -{{ toYaml .Values.nodeExporter.deploymentAnnotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} - name: {{ template "prometheus.nodeExporter.fullname" . }} -spec: - selector: - matchLabels: - {{- include "prometheus.nodeExporter.matchLabels" . | nindent 6 }} - {{- if .Values.nodeExporter.updateStrategy }} - updateStrategy: -{{ toYaml .Values.nodeExporter.updateStrategy | indent 4 }} - {{- end }} - template: - metadata: - {{- if .Values.nodeExporter.podAnnotations }} - annotations: -{{ toYaml .Values.nodeExporter.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 8 }} -{{- if .Values.nodeExporter.pod.labels }} -{{ toYaml .Values.nodeExporter.pod.labels | indent 8 }} -{{- end }} - spec: - serviceAccountName: {{ template "prometheus.serviceAccountName.nodeExporter" . }} -{{- if .Values.nodeExporter.priorityClassName }} - priorityClassName: "{{ .Values.nodeExporter.priorityClassName }}" -{{- end }} - containers: - - name: {{ template "prometheus.name" . }}-{{ .Values.nodeExporter.name }} - image: "{{ .Values.nodeExporter.image.repository }}:{{ .Values.nodeExporter.image.tag }}" - imagePullPolicy: "{{ .Values.nodeExporter.image.pullPolicy }}" - args: - - --path.procfs=/host/proc - - --path.sysfs=/host/sys - {{- if .Values.nodeExporter.hostNetwork }} - - --web.listen-address=:{{ .Values.nodeExporter.service.hostPort }} - {{- end }} - {{- range $key, $value := .Values.nodeExporter.extraArgs }} - {{- if $value }} - - --{{ $key }}={{ $value }} - {{- else }} - - --{{ $key }} - {{- end }} - {{- end }} - ports: - - name: metrics - {{- if .Values.nodeExporter.hostNetwork }} - containerPort: {{ .Values.nodeExporter.service.hostPort }} - {{- else }} - containerPort: 9100 - {{- end }} - hostPort: {{ .Values.nodeExporter.service.hostPort }} - resources: -{{ toYaml .Values.nodeExporter.resources | indent 12 }} - volumeMounts: - - name: proc - mountPath: /host/proc - readOnly: true - - name: sys - mountPath: /host/sys - readOnly: true - {{- range .Values.nodeExporter.extraHostPathMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - readOnly: {{ .readOnly }} - {{- if .mountPropagation }} - mountPropagation: {{ .mountPropagation }} - {{- end }} - {{- end }} - {{- range .Values.nodeExporter.extraConfigmapMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.nodeExporter.hostNetwork }} - hostNetwork: true - {{- end }} - {{- if .Values.nodeExporter.hostPID }} - hostPID: true - {{- end }} - {{- if .Values.nodeExporter.tolerations }} - tolerations: -{{ toYaml .Values.nodeExporter.tolerations | indent 8 }} - {{- end }} - {{- if .Values.nodeExporter.nodeSelector }} - nodeSelector: -{{ toYaml .Values.nodeExporter.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.nodeExporter.securityContext }} - securityContext: -{{ toYaml .Values.nodeExporter.securityContext | indent 8 }} - {{- end }} - volumes: - - name: proc - hostPath: - path: /proc - - name: sys - hostPath: - path: /sys - {{- range .Values.nodeExporter.extraHostPathMounts }} - - name: {{ .name }} - hostPath: - path: {{ .hostPath }} - {{- end }} - {{- range .Values.nodeExporter.extraConfigmapMounts }} - - name: {{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} - -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/node-exporter-podsecuritypolicy.yaml b/charts/kubecost/charts/prometheus/templates/node-exporter-podsecuritypolicy.yaml deleted file mode 100644 index 243667dd1..000000000 --- a/charts/kubecost/charts/prometheus/templates/node-exporter-podsecuritypolicy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.nodeExporter.enabled .Values.rbac.create }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: {{ template "prometheus.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: {{ template "prometheus.nodeExporter.fullname" . }} - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} - annotations: -{{- if .Values.nodeExporter.podSecurityPolicy.annotations }} -{{ toYaml .Values.nodeExporter.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -spec: - privileged: false - allowPrivilegeEscalation: false - requiredDropCapabilities: - - ALL - volumes: - - 'configMap' - - 'hostPath' - - 'secret' - allowedHostPaths: - - pathPrefix: /proc - readOnly: true - - pathPrefix: /sys - readOnly: true - {{- range .Values.nodeExporter.extraHostPathMounts }} - - pathPrefix: {{ .hostPath }} - readOnly: {{ .readOnly }} - {{- end }} - hostNetwork: {{ .Values.nodeExporter.hostNetwork }} - hostPID: {{ .Values.nodeExporter.hostPID }} - hostIPC: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - hostPorts: - - min: 1 - max: 65535 -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/node-exporter-role.yaml b/charts/kubecost/charts/prometheus/templates/node-exporter-role.yaml deleted file mode 100644 index 1926db04e..000000000 --- a/charts/kubecost/charts/prometheus/templates/node-exporter-role.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.nodeExporter.enabled .Values.rbac.create }} -{{- if or (default .Values.nodeExporter.podSecurityPolicy.enabled false) (.Values.podSecurityPolicy.enabled) }} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: Role -metadata: - name: {{ template "prometheus.nodeExporter.fullname" . }} - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} - namespace: {{ .Release.Namespace }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "prometheus.nodeExporter.fullname" . }} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/node-exporter-rolebinding.yaml b/charts/kubecost/charts/prometheus/templates/node-exporter-rolebinding.yaml deleted file mode 100644 index fb39ab64f..000000000 --- a/charts/kubecost/charts/prometheus/templates/node-exporter-rolebinding.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.nodeExporter.enabled .Values.rbac.create }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "prometheus.nodeExporter.fullname" . }} - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} - namespace: {{ .Release.Namespace }} -roleRef: - kind: Role - name: {{ template "prometheus.nodeExporter.fullname" . }} - apiGroup: rbac.authorization.k8s.io -subjects: -- kind: ServiceAccount - name: {{ template "prometheus.serviceAccountName.nodeExporter" . }} - namespace: {{ .Release.Namespace }} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/node-exporter-service.yaml b/charts/kubecost/charts/prometheus/templates/node-exporter-service.yaml deleted file mode 100644 index 40cbd8d69..000000000 --- a/charts/kubecost/charts/prometheus/templates/node-exporter-service.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.nodeExporter.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.nodeExporter.service.annotations }} - annotations: -{{ toYaml .Values.nodeExporter.service.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} -{{- if .Values.nodeExporter.service.labels }} -{{ toYaml .Values.nodeExporter.service.labels | indent 4 }} -{{- end }} - name: {{ template "prometheus.nodeExporter.fullname" . }} -spec: -{{- if .Values.nodeExporter.service.clusterIP }} - clusterIP: {{ .Values.nodeExporter.service.clusterIP }} -{{- end }} -{{- if .Values.nodeExporter.service.externalIPs }} - externalIPs: -{{ toYaml .Values.nodeExporter.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.nodeExporter.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.nodeExporter.service.loadBalancerIP }} -{{- end }} -{{- if .Values.nodeExporter.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.nodeExporter.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} - ports: - - name: metrics - port: {{ .Values.nodeExporter.service.servicePort }} - protocol: TCP - {{- if .Values.nodeExporter.hostNetwork }} - targetPort: {{ .Values.nodeExporter.service.hostPort }} - {{- else }} - targetPort: 9100 - {{- end }} - selector: - {{- include "prometheus.nodeExporter.matchLabels" . | nindent 4 }} - type: "{{ .Values.nodeExporter.service.type }}" -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/node-exporter-serviceaccount.yaml b/charts/kubecost/charts/prometheus/templates/node-exporter-serviceaccount.yaml deleted file mode 100644 index b75c4a4b6..000000000 --- a/charts/kubecost/charts/prometheus/templates/node-exporter-serviceaccount.yaml +++ /dev/null @@ -1,10 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.nodeExporter.enabled .Values.serviceAccounts.nodeExporter.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} - name: {{ template "prometheus.serviceAccountName.nodeExporter" . }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-clusterrole.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-clusterrole.yaml deleted file mode 100644 index 9ea81e4a2..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-clusterrole.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.pushgateway.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - name: {{ template "prometheus.pushgateway.fullname" . }} -rules: -{{- if .Values.podSecurityPolicy.enabled }} - - apiGroups: - - extensions - resources: - - podsecuritypolicies - verbs: - - use - resourceNames: - - {{ template "prometheus.pushgateway.fullname" . }} -{{- else }} - [] -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-clusterrolebinding.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-clusterrolebinding.yaml deleted file mode 100644 index 475d9d63d..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-clusterrolebinding.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.pushgateway.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRoleBinding -metadata: - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - name: {{ template "prometheus.pushgateway.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "prometheus.serviceAccountName.pushgateway" . }} - namespace: {{ .Release.Namespace }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "prometheus.pushgateway.fullname" . }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-deployment.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-deployment.yaml deleted file mode 100644 index 9dec641fc..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-deployment.yaml +++ /dev/null @@ -1,99 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.pushgateway.enabled -}} -apiVersion: {{ template "prometheus.deployment.apiVersion" . }} -kind: Deployment -metadata: - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - name: {{ template "prometheus.pushgateway.fullname" . }} -spec: - selector: - {{- if .Values.schedulerName }} - schedulerName: "{{ .Values.schedulerName }}" - {{- end }} - matchLabels: - {{- include "prometheus.pushgateway.matchLabels" . | nindent 6 }} - replicas: {{ .Values.pushgateway.replicaCount }} - {{- if .Values.pushgateway.strategy }} - strategy: -{{ toYaml .Values.pushgateway.strategy | indent 4 }} - {{- end }} - template: - metadata: - {{- if .Values.pushgateway.podAnnotations }} - annotations: -{{ toYaml .Values.pushgateway.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 8 }} - spec: - serviceAccountName: {{ template "prometheus.serviceAccountName.pushgateway" . }} -{{- if .Values.pushgateway.priorityClassName }} - priorityClassName: "{{ .Values.pushgateway.priorityClassName }}" -{{- end }} - containers: - - name: {{ template "prometheus.name" . }}-{{ .Values.pushgateway.name }} - image: "{{ .Values.pushgateway.image.repository }}:{{ .Values.pushgateway.image.tag }}" - imagePullPolicy: "{{ .Values.pushgateway.image.pullPolicy }}" - args: - {{- range $key, $value := .Values.pushgateway.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - ports: - - containerPort: 9091 - livenessProbe: - httpGet: - {{- if (index .Values "pushgateway" "extraArgs" "web.route-prefix") }} - path: /{{ index .Values "pushgateway" "extraArgs" "web.route-prefix" }}/-/healthy - {{- else }} - path: /-/healthy - {{- end }} - port: 9091 - initialDelaySeconds: 10 - timeoutSeconds: 10 - readinessProbe: - httpGet: - {{- if (index .Values "pushgateway" "extraArgs" "web.route-prefix") }} - path: /{{ index .Values "pushgateway" "extraArgs" "web.route-prefix" }}/-/ready - {{- else }} - path: /-/ready - {{- end }} - port: 9091 - initialDelaySeconds: 10 - timeoutSeconds: 10 - resources: -{{ toYaml .Values.pushgateway.resources | indent 12 }} - {{- if .Values.pushgateway.persistentVolume.enabled }} - volumeMounts: - - name: storage-volume - mountPath: "{{ .Values.pushgateway.persistentVolume.mountPath }}" - subPath: "{{ .Values.pushgateway.persistentVolume.subPath }}" - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.pushgateway.nodeSelector }} - nodeSelector: -{{ toYaml .Values.pushgateway.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.pushgateway.securityContext }} - securityContext: -{{ toYaml .Values.pushgateway.securityContext | indent 8 }} - {{- end }} - {{- if .Values.pushgateway.tolerations }} - tolerations: -{{ toYaml .Values.pushgateway.tolerations | indent 8 }} - {{- end }} - {{- if .Values.pushgateway.affinity }} - affinity: -{{ toYaml .Values.pushgateway.affinity | indent 8 }} - {{- end }} - {{- if .Values.pushgateway.persistentVolume.enabled }} - volumes: - - name: storage-volume - persistentVolumeClaim: - claimName: {{ if .Values.pushgateway.persistentVolume.existingClaim }}{{ .Values.pushgateway.persistentVolume.existingClaim }}{{- else }}{{ template "prometheus.pushgateway.fullname" . }}{{- end }} - {{- end -}} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-ingress.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-ingress.yaml deleted file mode 100644 index 422129b6f..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-ingress.yaml +++ /dev/null @@ -1,41 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.pushgateway.enabled .Values.pushgateway.ingress.enabled -}} -{{- $releaseName := .Release.Name -}} -{{- $serviceName := include "prometheus.pushgateway.fullname" . }} -{{- $servicePort := .Values.pushgateway.service.servicePort -}} -{{- $extraPaths := .Values.pushgateway.ingress.extraPaths -}} -{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} -apiVersion: networking.k8s.io/v1beta1 -{{ else }} -apiVersion: extensions/v1beta1 -{{ end -}} -kind: Ingress -metadata: -{{- if .Values.pushgateway.ingress.annotations }} - annotations: -{{ toYaml .Values.pushgateway.ingress.annotations | indent 4}} -{{- end }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - name: {{ template "prometheus.pushgateway.fullname" . }} -spec: - rules: - {{- range .Values.pushgateway.ingress.hosts }} - {{- $url := splitList "/" . }} - - host: {{ first $url }} - http: - paths: -{{ if $extraPaths }} -{{ toYaml $extraPaths | indent 10 }} -{{- end }} - - path: /{{ rest $url | join "/" }} - backend: - serviceName: {{ $serviceName }} - servicePort: {{ $servicePort }} - {{- end -}} -{{- if .Values.pushgateway.ingress.tls }} - tls: -{{ toYaml .Values.pushgateway.ingress.tls | indent 4 }} - {{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-networkpolicy.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-networkpolicy.yaml deleted file mode 100644 index 70a5ada3b..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-networkpolicy.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.pushgateway.enabled .Values.networkPolicy.enabled -}} -apiVersion: {{ template "prometheus.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - name: {{ template "prometheus.pushgateway.fullname" . }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} -spec: - podSelector: - matchLabels: - {{- include "prometheus.pushgateway.matchLabels" . | nindent 6 }} - ingress: - - from: - - podSelector: - matchLabels: - {{- include "prometheus.server.matchLabels" . | nindent 12 }} - - ports: - - port: 9091 -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-pdb.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-pdb.yaml deleted file mode 100644 index edf2318fe..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-pdb.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.pushgateway.podDisruptionBudget.enabled }} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ template "prometheus.pushgateway.fullname" . }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} -spec: - maxUnavailable: {{ .Values.pushgateway.podDisruptionBudget.maxUnavailable }} - selector: - matchLabels: - {{- include "prometheus.pushgateway.labels" . | nindent 6 }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-podsecuritypolicy.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-podsecuritypolicy.yaml deleted file mode 100644 index 80617cbc7..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-podsecuritypolicy.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.rbac.create }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: {{ template "prometheus.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: {{ template "prometheus.pushgateway.fullname" . }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - annotations: -{{- if .Values.pushgateway.podSecurityPolicy.annotations }} -{{ toYaml .Values.pushgateway.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -spec: - privileged: false - allowPrivilegeEscalation: false - requiredDropCapabilities: - - ALL - volumes: - - 'persistentVolumeClaim' - - 'secret' - allowedHostPaths: - - pathPrefix: {{ .Values.pushgateway.persistentVolume.mountPath }} - hostNetwork: false - hostPID: false - hostIPC: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: true -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-pvc.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-pvc.yaml deleted file mode 100644 index 5b4eeb937..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-pvc.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.pushgateway.persistentVolume.enabled -}} -{{- if not .Values.pushgateway.persistentVolume.existingClaim -}} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - {{- if .Values.pushgateway.persistentVolume.annotations }} - annotations: -{{ toYaml .Values.pushgateway.persistentVolume.annotations | indent 4 }} - {{- end }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - name: {{ template "prometheus.pushgateway.fullname" . }} -spec: - accessModes: -{{ toYaml .Values.pushgateway.persistentVolume.accessModes | indent 4 }} -{{- if .Values.pushgateway.persistentVolume.storageClass }} -{{- if (eq "-" .Values.pushgateway.persistentVolume.storageClass) }} - storageClassName: "" -{{- else }} - storageClassName: "{{ .Values.pushgateway.persistentVolume.storageClass }}" -{{- end }} -{{- end }} -{{- if .Values.pushgateway.persistentVolume.volumeBindingMode }} - volumeBindingModeName: "{{ .Values.pushgateway.persistentVolume.volumeBindingMode }}" -{{- end }} - resources: - requests: - storage: "{{ .Values.pushgateway.persistentVolume.size }}" -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-service.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-service.yaml deleted file mode 100644 index ffcc4a20b..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-service.yaml +++ /dev/null @@ -1,42 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.pushgateway.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.pushgateway.service.annotations }} - annotations: -{{ toYaml .Values.pushgateway.service.annotations | indent 4}} -{{- end }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} -{{- if .Values.pushgateway.service.labels }} -{{ toYaml .Values.pushgateway.service.labels | indent 4}} -{{- end }} - name: {{ template "prometheus.pushgateway.fullname" . }} -spec: -{{- if .Values.pushgateway.service.clusterIP }} - clusterIP: {{ .Values.pushgateway.service.clusterIP }} -{{- end }} -{{- if .Values.pushgateway.service.externalIPs }} - externalIPs: -{{ toYaml .Values.pushgateway.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.pushgateway.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.pushgateway.service.loadBalancerIP }} -{{- end }} -{{- if .Values.pushgateway.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.pushgateway.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} - ports: - - name: http - port: {{ .Values.pushgateway.service.servicePort }} - protocol: TCP - targetPort: 9091 - selector: - {{- include "prometheus.pushgateway.matchLabels" . | nindent 4 }} - type: "{{ .Values.pushgateway.service.type }}" -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-serviceaccount.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-serviceaccount.yaml deleted file mode 100644 index 3b221e43d..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-serviceaccount.yaml +++ /dev/null @@ -1,10 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.pushgateway.enabled .Values.serviceAccounts.pushgateway.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - name: {{ template "prometheus.serviceAccountName.pushgateway" . }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-clusterrole.yaml b/charts/kubecost/charts/prometheus/templates/server-clusterrole.yaml deleted file mode 100644 index 410685193..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-clusterrole.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.server.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.server.fullname" . }} -rules: -{{- if .Values.podSecurityPolicy.enabled }} - - apiGroups: - - extensions - resources: - - podsecuritypolicies - verbs: - - use - resourceNames: - - {{ template "prometheus.server.fullname" . }} -{{- end }} - - apiGroups: - - "" - resources: - - nodes - - nodes/proxy - - nodes/metrics - - services - - endpoints - - pods - - ingresses - - configmaps - verbs: - - get - - list - - watch - - apiGroups: - - "extensions" - resources: - - ingresses/status - - ingresses - verbs: - - get - - list - - watch - - nonResourceURLs: - - "/metrics" - verbs: - - get -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-clusterrolebinding.yaml b/charts/kubecost/charts/prometheus/templates/server-clusterrolebinding.yaml deleted file mode 100644 index a89f3bd76..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-clusterrolebinding.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.server.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRoleBinding -metadata: - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.server.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "prometheus.serviceAccountName.server" . }} - namespace: {{ .Release.Namespace }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "prometheus.server.fullname" . }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-configmap.yaml b/charts/kubecost/charts/prometheus/templates/server-configmap.yaml deleted file mode 100644 index 52a5d5e53..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-configmap.yaml +++ /dev/null @@ -1,83 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if (empty .Values.server.configMapOverrideName) -}} -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.server.fullname" . }} -data: -{{- $root := . -}} -{{- range $key, $value := .Values.serverFiles }} - {{ $key }}: | -{{- if eq $key "prometheus.yml" }} - global: -{{ $root.Values.server.global | toYaml | trimSuffix "\n" | indent 6 }} -{{- if $root.Values.server.remoteWrite }} - remote_write: -{{ $root.Values.server.remoteWrite | toYaml | indent 4 }} -{{- end }} -{{- if $root.Values.server.remoteRead }} - remote_read: -{{ $root.Values.server.remoteRead | toYaml | indent 4 }} -{{- end }} -{{- end }} -{{- if eq $key "alerts" }} -{{- if and (not (empty $value)) (empty $value.groups) }} - groups: -{{- range $ruleKey, $ruleValue := $value }} - - name: {{ $ruleKey -}}.rules - rules: -{{ $ruleValue | toYaml | trimSuffix "\n" | indent 6 }} -{{- end }} -{{- else }} -{{ toYaml $value | indent 4 }} -{{- end }} -{{- else }} -{{ toYaml $value | default "{}" | indent 4 }} -{{- end }} -{{- if eq $key "prometheus.yml" -}} -{{- if $root.Values.extraScrapeConfigs }} -{{ tpl $root.Values.extraScrapeConfigs $root | indent 4 }} -{{- end -}} -{{- if or ($root.Values.alertmanager.enabled) ($root.Values.server.alertmanagers) }} - alerting: -{{- if $root.Values.alertRelabelConfigs }} -{{ $root.Values.alertRelabelConfigs | toYaml | trimSuffix "\n" | indent 6 }} -{{- end }} - alertmanagers: -{{- if $root.Values.server.alertmanagers }} -{{ toYaml $root.Values.server.alertmanagers | indent 8 }} -{{- else }} - - kubernetes_sd_configs: - - role: pod - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - {{- if $root.Values.alertmanager.prefixURL }} - path_prefix: {{ $root.Values.alertmanager.prefixURL }} - {{- end }} - relabel_configs: - - source_labels: [__meta_kubernetes_namespace] - regex: {{ $root.Release.Namespace }} - action: keep - - source_labels: [__meta_kubernetes_pod_label_app] - regex: {{ template "prometheus.name" $root }} - action: keep - - source_labels: [__meta_kubernetes_pod_label_component] - regex: alertmanager - action: keep - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_probe] - regex: {{ index $root.Values.alertmanager.podAnnotations "prometheus.io/probe" | default ".*" }} - action: keep - - source_labels: [__meta_kubernetes_pod_container_port_number] - regex: - action: drop -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-deployment.yaml b/charts/kubecost/charts/prometheus/templates/server-deployment.yaml deleted file mode 100644 index 4a1c14f08..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-deployment.yaml +++ /dev/null @@ -1,216 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if not .Values.server.statefulSet.enabled -}} -apiVersion: {{ template "prometheus.deployment.apiVersion" . }} -kind: Deployment -metadata: -{{- if .Values.server.deploymentAnnotations }} - annotations: -{{ toYaml .Values.server.deploymentAnnotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.server.fullname" . }} -spec: - selector: - matchLabels: - {{- include "prometheus.server.matchLabels" . | nindent 6 }} - replicas: {{ .Values.server.replicaCount }} - {{- if .Values.server.strategy }} - strategy: -{{ toYaml .Values.server.strategy | indent 4 }} - {{- end }} - template: - metadata: - {{- if .Values.server.podAnnotations }} - annotations: -{{ toYaml .Values.server.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 8 }} - {{- if .Values.server.podLabels}} - {{ toYaml .Values.server.podLabels | nindent 8 }} - {{- end}} - spec: -{{- if .Values.server.priorityClassName }} - priorityClassName: "{{ .Values.server.priorityClassName }}" -{{- end }} -{{- if .Values.server.schedulerName }} - schedulerName: "{{ .Values.server.schedulerName }}" -{{- end }} - serviceAccountName: {{ template "prometheus.serviceAccountName.server" . }} - {{- if .Values.server.extraInitContainers }} - initContainers: -{{ toYaml .Values.server.extraInitContainers | indent 8 }} - {{- end }} - containers: - {{- if .Values.configmapReload.prometheus.enabled }} - - name: {{ template "prometheus.name" . }}-{{ .Values.server.name }}-{{ .Values.configmapReload.prometheus.name }} - image: "{{ .Values.configmapReload.prometheus.image.repository }}:{{ .Values.configmapReload.prometheus.image.tag }}" - imagePullPolicy: "{{ .Values.configmapReload.prometheus.image.pullPolicy }}" - args: - - --volume-dir=/etc/config - - --webhook-url=http://127.0.0.1:9090{{ .Values.server.prefixURL }}/-/reload - {{- range $key, $value := .Values.configmapReload.prometheus.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- range .Values.configmapReload.prometheus.extraVolumeDirs }} - - --volume-dir={{ . }} - {{- end }} - resources: -{{ toYaml .Values.configmapReload.prometheus.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - {{- range .Values.configmapReload.prometheus.extraConfigmapMounts }} - - name: {{ $.Values.configmapReload.prometheus.name }}-{{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- end }} - - - name: {{ template "prometheus.name" . }}-{{ .Values.server.name }} - image: "{{ .Values.server.image.repository }}:{{ .Values.server.image.tag }}" - imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" - {{- if .Values.server.env }} - env: -{{ toYaml .Values.server.env | indent 12}} - {{- end }} - args: - {{- if .Values.server.retention }} - - --storage.tsdb.retention.time={{ .Values.server.retention }} - {{- end }} - - --config.file={{ .Values.server.configPath }} - - --storage.tsdb.path={{ .Values.server.persistentVolume.mountPath }} - - --web.console.libraries=/etc/prometheus/console_libraries - - --web.console.templates=/etc/prometheus/consoles - {{- range .Values.server.extraFlags }} - - --{{ . }} - {{- end }} - {{- if .Values.server.baseURL }} - - --web.external-url={{ .Values.server.baseURL }} - {{- end }} - - {{- range $key, $value := .Values.server.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - ports: - - containerPort: 9090 - readinessProbe: - httpGet: - path: {{ .Values.server.prefixURL }}/-/ready - port: 9090 - initialDelaySeconds: {{ .Values.server.readinessProbeInitialDelay }} - timeoutSeconds: {{ .Values.server.readinessProbeTimeout }} - failureThreshold: {{ .Values.server.readinessProbeFailureThreshold }} - successThreshold: {{ .Values.server.readinessProbeSuccessThreshold }} - livenessProbe: - httpGet: - path: {{ .Values.server.prefixURL }}/-/healthy - port: 9090 - initialDelaySeconds: {{ .Values.server.livenessProbeInitialDelay }} - timeoutSeconds: {{ .Values.server.livenessProbeTimeout }} - failureThreshold: {{ .Values.server.livenessProbeFailureThreshold }} - successThreshold: {{ .Values.server.livenessProbeSuccessThreshold }} - resources: -{{ toYaml .Values.server.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - - name: storage-volume - mountPath: {{ .Values.server.persistentVolume.mountPath }} - subPath: "{{ .Values.server.persistentVolume.subPath }}" - {{- range .Values.server.extraHostPathMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.server.extraConfigmapMounts }} - - name: {{ $.Values.server.name }}-{{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.server.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- if .Values.server.extraVolumeMounts }} - {{ toYaml .Values.server.extraVolumeMounts | nindent 12 }} - {{- end }} - {{- if .Values.server.sidecarContainers }} - {{- toYaml .Values.server.sidecarContainers | nindent 8 }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.server.nodeSelector }} - nodeSelector: -{{ toYaml .Values.server.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.server.securityContext }} - securityContext: -{{ toYaml .Values.server.securityContext | indent 8 }} - {{- end }} - {{- if .Values.server.tolerations }} - tolerations: -{{ toYaml .Values.server.tolerations | indent 8 }} - {{- end }} - {{- if .Values.server.affinity }} - affinity: -{{ toYaml .Values.server.affinity | indent 8 }} - {{- end }} - terminationGracePeriodSeconds: {{ .Values.server.terminationGracePeriodSeconds }} - volumes: - - name: config-volume - configMap: - name: {{ if .Values.server.configMapOverrideName }}{{ .Release.Name }}-{{ .Values.server.configMapOverrideName }}{{- else }}{{ template "prometheus.server.fullname" . }}{{- end }} - - name: storage-volume - {{- if .Values.server.persistentVolume.enabled }} - persistentVolumeClaim: - claimName: {{ if .Values.server.persistentVolume.existingClaim }}{{ .Values.server.persistentVolume.existingClaim }}{{- else }}{{ template "prometheus.server.fullname" . }}{{- end }} - {{- else }} - emptyDir: - {{- if .Values.server.emptyDir.sizeLimit }} - sizeLimit: {{ .Values.server.emptyDir.sizeLimit }} - {{- else }} - {} - {{- end -}} - {{- end -}} -{{- if .Values.server.extraVolumes }} -{{ toYaml .Values.server.extraVolumes | indent 8}} -{{- end }} - {{- range .Values.server.extraHostPathMounts }} - - name: {{ .name }} - hostPath: - path: {{ .hostPath }} - {{- end }} - {{- range .Values.configmapReload.prometheus.extraConfigmapMounts }} - - name: {{ $.Values.configmapReload.prometheus.name }}-{{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} - {{- range .Values.server.extraConfigmapMounts }} - - name: {{ $.Values.server.name }}-{{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} - {{- range .Values.server.extraSecretMounts }} - - name: {{ .name }} - secret: - secretName: {{ .secretName }} - {{- end }} - {{- range .Values.configmapReload.prometheus.extraConfigmapMounts }} - - name: {{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-ingress.yaml b/charts/kubecost/charts/prometheus/templates/server-ingress.yaml deleted file mode 100644 index 4cdca92a3..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-ingress.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if .Values.server.ingress.enabled -}} -{{- $releaseName := .Release.Name -}} -{{- $serviceName := include "prometheus.server.fullname" . }} -{{- $servicePort := .Values.server.service.servicePort -}} -{{- $extraPaths := .Values.server.ingress.extraPaths -}} -{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} -apiVersion: networking.k8s.io/v1beta1 -{{ else }} -apiVersion: extensions/v1beta1 -{{ end -}} -kind: Ingress -metadata: -{{- if .Values.server.ingress.annotations }} - annotations: -{{ toYaml .Values.server.ingress.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} -{{- range $key, $value := .Values.server.ingress.extraLabels }} - {{ $key }}: {{ $value }} -{{- end }} - name: {{ template "prometheus.server.fullname" . }} -spec: - rules: - {{- range .Values.server.ingress.hosts }} - {{- $url := splitList "/" . }} - - host: {{ first $url }} - http: - paths: -{{ if $extraPaths }} -{{ toYaml $extraPaths | indent 10 }} -{{- end }} - - path: /{{ rest $url | join "/" }} - backend: - serviceName: {{ $serviceName }} - servicePort: {{ $servicePort }} - {{- end -}} -{{- if .Values.server.ingress.tls }} - tls: -{{ toYaml .Values.server.ingress.tls | indent 4 }} - {{- end -}} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-networkpolicy.yaml b/charts/kubecost/charts/prometheus/templates/server-networkpolicy.yaml deleted file mode 100644 index 152f3a967..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-networkpolicy.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if .Values.networkPolicy.enabled }} -apiVersion: {{ template "prometheus.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - name: {{ template "prometheus.server.fullname" . }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} -spec: - podSelector: - matchLabels: - {{- include "prometheus.server.matchLabels" . | nindent 6 }} - ingress: - - ports: - - port: 9090 -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-pdb.yaml b/charts/kubecost/charts/prometheus/templates/server-pdb.yaml deleted file mode 100644 index ec90cd5c9..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-pdb.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.podDisruptionBudget.enabled }} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ template "prometheus.server.fullname" . }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} -spec: - maxUnavailable: {{ .Values.server.podDisruptionBudget.maxUnavailable }} - selector: - matchLabels: - {{- include "prometheus.server.labels" . | nindent 6 }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-podsecuritypolicy.yaml b/charts/kubecost/charts/prometheus/templates/server-podsecuritypolicy.yaml deleted file mode 100644 index 73bf065dc..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-podsecuritypolicy.yaml +++ /dev/null @@ -1,55 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.rbac.create }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: {{ template "prometheus.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: {{ template "prometheus.server.fullname" . }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - annotations: -{{- if .Values.server.podSecurityPolicy.annotations }} -{{ toYaml .Values.server.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -spec: - privileged: false - allowPrivilegeEscalation: false - allowedCapabilities: - - 'CHOWN' - volumes: - - 'configMap' - - 'persistentVolumeClaim' - - 'emptyDir' - - 'secret' - - 'hostPath' - allowedHostPaths: - - pathPrefix: /etc - readOnly: true - - pathPrefix: {{ .Values.server.persistentVolume.mountPath }} - {{- range .Values.server.extraHostPathMounts }} - - pathPrefix: {{ .hostPath }} - readOnly: {{ .readOnly }} - {{- end }} - hostNetwork: false - hostPID: false - hostIPC: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: false -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-pvc.yaml b/charts/kubecost/charts/prometheus/templates/server-pvc.yaml deleted file mode 100644 index 22cb51afc..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-pvc.yaml +++ /dev/null @@ -1,36 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if not .Values.server.statefulSet.enabled -}} -{{- if .Values.server.persistentVolume.enabled -}} -{{- if not .Values.server.persistentVolume.existingClaim -}} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - {{- if .Values.server.persistentVolume.annotations }} - annotations: -{{ toYaml .Values.server.persistentVolume.annotations | indent 4 }} - {{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.server.fullname" . }} -spec: - accessModes: -{{ toYaml .Values.server.persistentVolume.accessModes | indent 4 }} -{{- if .Values.server.persistentVolume.storageClass }} -{{- if (eq "-" .Values.server.persistentVolume.storageClass) }} - storageClassName: "" -{{- else }} - storageClassName: "{{ .Values.server.persistentVolume.storageClass }}" -{{- end }} -{{- end }} -{{- if .Values.server.persistentVolume.volumeBindingMode }} - volumeBindingModeName: "{{ .Values.server.persistentVolume.volumeBindingMode }}" -{{- end }} - resources: - requests: - storage: "{{ .Values.server.persistentVolume.size }}" -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-service-headless.yaml b/charts/kubecost/charts/prometheus/templates/server-service-headless.yaml deleted file mode 100644 index 018a75b79..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-service-headless.yaml +++ /dev/null @@ -1,28 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if .Values.server.statefulSet.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.server.statefulSet.headless.annotations }} - annotations: -{{ toYaml .Values.server.statefulSet.headless.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} -{{- if .Values.server.statefulSet.headless.labels }} -{{ toYaml .Values.server.statefulSet.headless.labels | indent 4 }} -{{- end }} - name: {{ template "prometheus.server.fullname" . }}-headless -spec: - clusterIP: None - ports: - - name: http - port: {{ .Values.server.statefulSet.headless.servicePort }} - protocol: TCP - targetPort: 9090 - selector: - {{- include "prometheus.server.matchLabels" . | nindent 4 }} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-service.yaml b/charts/kubecost/charts/prometheus/templates/server-service.yaml deleted file mode 100644 index e03faf974..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-service.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.server.service.annotations }} - annotations: -{{ toYaml .Values.server.service.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} -{{- if .Values.server.service.labels }} -{{ toYaml .Values.server.service.labels | indent 4 }} -{{- end }} - name: {{ template "prometheus.server.fullname" . }} -spec: -{{- if .Values.server.service.clusterIP }} - clusterIP: {{ .Values.server.service.clusterIP }} -{{- end }} -{{- if .Values.server.service.externalIPs }} - externalIPs: -{{ toYaml .Values.server.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.server.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.server.service.loadBalancerIP }} -{{- end }} -{{- if .Values.server.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.server.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} - ports: - - name: http - port: {{ .Values.server.service.servicePort }} - protocol: TCP - targetPort: 9090 - {{- if .Values.server.service.nodePort }} - nodePort: {{ .Values.server.service.nodePort }} - {{- end }} - {{- if .Values.server.service.gRPC.enabled }} - - name: grpc - port: {{ .Values.server.service.gRPC.servicePort }} - protocol: TCP - targetPort: 10901 - {{- if .Values.server.service.gRPC.nodePort }} - nodePort: {{ .Values.server.service.gRPC.nodePort }} - {{- end }} - {{- end }} - selector: - {{- if and .Values.server.statefulSet.enabled .Values.server.service.statefulsetReplica.enabled }} - statefulset.kubernetes.io/pod-name: {{ .Release.Name }}-{{ .Values.server.name }}-{{ .Values.server.service.statefulsetReplica.replica }} - {{- else -}} - {{- include "prometheus.server.matchLabels" . | nindent 4 }} -{{- if .Values.server.service.sessionAffinity }} - sessionAffinity: {{ .Values.server.service.sessionAffinity }} -{{- end }} - {{- end }} - type: "{{ .Values.server.service.type }}" -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-serviceaccount.yaml b/charts/kubecost/charts/prometheus/templates/server-serviceaccount.yaml deleted file mode 100644 index 6cf017c20..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if .Values.serviceAccounts.server.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.serviceAccountName.server" . }} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-statefulset.yaml b/charts/kubecost/charts/prometheus/templates/server-statefulset.yaml deleted file mode 100644 index 9369ddf38..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-statefulset.yaml +++ /dev/null @@ -1,224 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if .Values.server.statefulSet.enabled -}} -apiVersion: apps/v1 -kind: StatefulSet -metadata: -{{- if .Values.server.statefulSet.annotations }} - annotations: -{{ toYaml .Values.server.statefulSet.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - {{- if .Values.server.statefulSet.labels}} - {{ toYaml .Values.server.statefulSet.labels | nindent 4 }} - {{- end}} - name: {{ template "prometheus.server.fullname" . }} -spec: - serviceName: {{ template "prometheus.server.fullname" . }}-headless - selector: - matchLabels: - {{- include "prometheus.server.matchLabels" . | nindent 6 }} - replicas: {{ .Values.server.replicaCount }} - podManagementPolicy: {{ .Values.server.statefulSet.podManagementPolicy }} - template: - metadata: - {{- if .Values.server.podAnnotations }} - annotations: -{{ toYaml .Values.server.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 8 }} - {{- if .Values.server.statefulSet.labels}} - {{ toYaml .Values.server.statefulSet.labels | nindent 8 }} - {{- end}} - spec: -{{- if .Values.server.affinity }} - affinity: -{{ toYaml .Values.server.affinity | indent 8 }} -{{- end }} -{{- if .Values.server.priorityClassName }} - priorityClassName: "{{ .Values.server.priorityClassName }}" -{{- end }} -{{- if .Values.server.schedulerName }} - schedulerName: "{{ .Values.server.schedulerName }}" -{{- end }} - serviceAccountName: {{ template "prometheus.serviceAccountName.server" . }} - containers: - {{- if .Values.configmapReload.prometheus.enabled }} - - name: {{ template "prometheus.name" . }}-{{ .Values.server.name }}-{{ .Values.configmapReload.prometheus.name }} - image: "{{ .Values.configmapReload.prometheus.image.repository }}:{{ .Values.configmapReload.prometheus.image.tag }}" - imagePullPolicy: "{{ .Values.configmapReload.prometheus.image.pullPolicy }}" - args: - - --volume-dir=/etc/config - - --webhook-url=http://127.0.0.1:9090{{ .Values.server.prefixURL }}/-/reload - {{- range $key, $value := .Values.configmapReload.prometheus.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- range .Values.configmapReload.prometheus.extraVolumeDirs }} - - --volume-dir={{ . }} - {{- end }} - resources: -{{ toYaml .Values.configmapReload.prometheus.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - {{- range .Values.configmapReload.prometheus.extraConfigmapMounts }} - - name: {{ $.Values.configmapReload.prometheus.name }}-{{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- end }} - - name: {{ template "prometheus.name" . }}-{{ .Values.server.name }} - image: "{{ .Values.server.image.repository }}:{{ .Values.server.image.tag }}" - imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" - {{- if .Values.server.env }} - env: -{{ toYaml .Values.server.env | indent 12}} - {{- end }} - args: - {{- if .Values.server.retention }} - - --storage.tsdb.retention.time={{ .Values.server.retention }} - {{- end }} - - --config.file={{ .Values.server.configPath }} - - --storage.tsdb.path={{ .Values.server.persistentVolume.mountPath }} - - --web.console.libraries=/etc/prometheus/console_libraries - - --web.console.templates=/etc/prometheus/consoles - {{- range .Values.server.extraFlags }} - - --{{ . }} - {{- end }} - {{- range $key, $value := .Values.server.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- if .Values.server.baseURL }} - - --web.external-url={{ .Values.server.baseURL }} - {{- end }} - ports: - - containerPort: 9090 - readinessProbe: - httpGet: - path: {{ .Values.server.prefixURL }}/-/ready - port: 9090 - initialDelaySeconds: {{ .Values.server.readinessProbeInitialDelay }} - timeoutSeconds: {{ .Values.server.readinessProbeTimeout }} - livenessProbe: - httpGet: - path: {{ .Values.server.prefixURL }}/-/healthy - port: 9090 - initialDelaySeconds: {{ .Values.server.livenessProbeInitialDelay }} - timeoutSeconds: {{ .Values.server.livenessProbeTimeout }} - resources: -{{ toYaml .Values.server.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - - name: storage-volume - mountPath: {{ .Values.server.persistentVolume.mountPath }} - subPath: "{{ .Values.server.persistentVolume.subPath }}" - {{- range .Values.server.extraHostPathMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.server.extraConfigmapMounts }} - - name: {{ $.Values.server.name }}-{{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.server.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- if .Values.server.extraVolumeMounts }} - {{ toYaml .Values.server.extraVolumeMounts | nindent 12 }} - {{- end }} - {{- if .Values.server.sidecarContainers }} - {{- toYaml .Values.server.sidecarContainers | nindent 8 }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.server.nodeSelector }} - nodeSelector: -{{ toYaml .Values.server.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.server.securityContext }} - securityContext: -{{ toYaml .Values.server.securityContext | indent 8 }} - {{- end }} - {{- if .Values.server.tolerations }} - tolerations: -{{ toYaml .Values.server.tolerations | indent 8 }} - {{- end }} - {{- if .Values.server.affinity }} - affinity: -{{ toYaml .Values.server.affinity | indent 8 }} - {{- end }} - terminationGracePeriodSeconds: {{ .Values.server.terminationGracePeriodSeconds }} - volumes: - - name: config-volume - configMap: - name: {{ if .Values.server.configMapOverrideName }}{{ .Release.Name }}-{{ .Values.server.configMapOverrideName }}{{- else }}{{ template "prometheus.server.fullname" . }}{{- end }} - {{- range .Values.server.extraHostPathMounts }} - - name: {{ .name }} - hostPath: - path: {{ .hostPath }} - {{- end }} - {{- range .Values.configmapReload.prometheus.extraConfigmapMounts }} - - name: {{ $.Values.configmapReload.prometheus.name }}-{{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} - {{- range .Values.server.extraConfigmapMounts }} - - name: {{ $.Values.server.name }}-{{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} - {{- range .Values.server.extraSecretMounts }} - - name: {{ .name }} - secret: - secretName: {{ .secretName }} - {{- end }} - {{- range .Values.configmapReload.prometheus.extraConfigmapMounts }} - - name: {{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} -{{- if .Values.server.extraVolumes }} -{{ toYaml .Values.server.extraVolumes | indent 8}} -{{- end }} -{{- if .Values.server.persistentVolume.enabled }} - volumeClaimTemplates: - - metadata: - name: storage-volume - {{- if .Values.server.persistentVolume.annotations }} - annotations: -{{ toYaml .Values.server.persistentVolume.annotations | indent 10 }} - {{- end }} - spec: - accessModes: -{{ toYaml .Values.server.persistentVolume.accessModes | indent 10 }} - resources: - requests: - storage: "{{ .Values.server.persistentVolume.size }}" - {{- if .Values.server.persistentVolume.storageClass }} - {{- if (eq "-" .Values.server.persistentVolume.storageClass) }} - storageClassName: "" - {{- else }} - storageClassName: "{{ .Values.server.persistentVolume.storageClass }}" - {{- end }} - {{- end }} -{{- else }} - - name: storage-volume - emptyDir: {} -{{- end }} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-vpa.yaml b/charts/kubecost/charts/prometheus/templates/server-vpa.yaml deleted file mode 100644 index 8aec16ad5..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-vpa.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if .Values.server.verticalAutoscaler.enabled -}} -apiVersion: autoscaling.k8s.io/v1beta2 -kind: VerticalPodAutoscaler -metadata: - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.server.fullname" . }}-vpa -spec: - targetRef: -{{- if .Values.server.statefulSet.enabled }} - apiVersion: "apps/v1" - kind: StatefulSet -{{- else }} - apiVersion: "extensions/v1beta1" - kind: Deployment -{{- end }} - name: {{ template "prometheus.server.fullname" . }} - updatePolicy: - updateMode: {{ .Values.server.verticalAutoscaler.updateMode | default "Off" | quote }} - resourcePolicy: - containerPolicies: {{ .Values.server.verticalAutoscaler.containerPolicies | default list | toYaml | trim | nindent 4 }} -{{- end -}} {{/* if .Values.server.verticalAutoscaler.enabled */}} -{{- end -}} {{/* .Values.server.enabled */}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/values.yaml b/charts/kubecost/charts/prometheus/values.yaml deleted file mode 100644 index 3d44e7f59..000000000 --- a/charts/kubecost/charts/prometheus/values.yaml +++ /dev/null @@ -1,1387 +0,0 @@ -rbac: - create: true - -podSecurityPolicy: - enabled: false - -imagePullSecrets: -# - name: "image-pull-secret" - -## Define serviceAccount names for components. Defaults to component's fully qualified name. -## -serviceAccounts: - alertmanager: - create: true - name: - nodeExporter: - create: true - name: - pushgateway: - create: true - name: - server: - create: true - name: - -alertmanager: - ## If false, alertmanager will not be installed - ## - enabled: true - - strategy: - type: Recreate - rollingUpdate: null - - ## alertmanager container name - ## - name: alertmanager - - ## alertmanager container image - ## - image: - repository: prom/alertmanager - tag: v0.20.0 - pullPolicy: IfNotPresent - - ## alertmanager priorityClassName - ## - priorityClassName: "" - - ## Additional alertmanager container arguments - ## - extraArgs: {} - - ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug - ## so that the various internal URLs are still able to access as they are in the default case. - ## (Optional) - prefixURL: "" - - ## External URL which can access alertmanager - baseURL: "http://localhost:9093" - - ## Additional alertmanager container environment variable - ## For instance to add a http_proxy - ## - extraEnv: {} - - ## Additional alertmanager Secret mounts - # Defines additional mounts with secrets. Secrets must be manually created in the namespace. - extraSecretMounts: [] - # - name: secret-files - # mountPath: /etc/secrets - # subPath: "" - # secretName: alertmanager-secret-files - # readOnly: true - - ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.alertmanager.configMapOverrideName}} - ## Defining configMapOverrideName will cause templates/alertmanager-configmap.yaml - ## to NOT generate a ConfigMap resource - ## - configMapOverrideName: "" - - ## The name of a secret in the same kubernetes namespace which contains the Alertmanager config - ## Defining configFromSecret will cause templates/alertmanager-configmap.yaml - ## to NOT generate a ConfigMap resource - ## - configFromSecret: "" - - ## The configuration file name to be loaded to alertmanager - ## Must match the key within configuration loaded from ConfigMap/Secret - ## - configFileName: alertmanager.yml - - ingress: - ## If true, alertmanager Ingress will be created - ## - enabled: false - - ## alertmanager Ingress annotations - ## - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: 'true' - - ## alertmanager Ingress additional labels - ## - extraLabels: {} - - ## alertmanager Ingress hostnames with optional path - ## Must be provided if Ingress is enabled - ## - hosts: [] - # - alertmanager.domain.com - # - domain.com/alertmanager - - ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services. - extraPaths: [] - # - path: /* - # backend: - # serviceName: ssl-redirect - # servicePort: use-annotation - - ## alertmanager Ingress TLS configuration - ## Secrets must be manually created in the namespace - ## - tls: [] - # - secretName: prometheus-alerts-tls - # hosts: - # - alertmanager.domain.com - - ## Alertmanager Deployment Strategy type - # strategy: - # type: Recreate - - ## Node tolerations for alertmanager scheduling to nodes with taints - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - - ## Node labels for alertmanager pod assignment - ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## Pod affinity - ## - affinity: {} - - ## PodDisruptionBudget settings - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ - ## - podDisruptionBudget: - enabled: false - maxUnavailable: 1 - - ## Use an alternate scheduler, e.g. "stork". - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - # schedulerName: - - persistentVolume: - ## If true, alertmanager will create/use a Persistent Volume Claim - ## If false, use emptyDir - ## - enabled: true - - ## alertmanager data Persistent Volume access modes - ## Must match those of existing PV or dynamic provisioner - ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ - ## - accessModes: - - ReadWriteOnce - - ## alertmanager data Persistent Volume Claim annotations - ## - annotations: {} - - ## alertmanager data Persistent Volume existing claim name - ## Requires alertmanager.persistentVolume.enabled: true - ## If defined, PVC must be created manually before volume will be bound - existingClaim: "" - - ## alertmanager data Persistent Volume mount root path - ## - mountPath: /data - - ## alertmanager data Persistent Volume size - ## - size: 2Gi - - ## alertmanager data Persistent Volume Storage Class - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is - ## set, choosing the default provisioner. (gp2 on AWS, standard on - ## GKE, AWS & OpenStack) - ## - # storageClass: "-" - - ## alertmanager data Persistent Volume Binding Mode - ## If defined, volumeBindingMode: - ## If undefined (the default) or set to null, no volumeBindingMode spec is - ## set, choosing the default mode. - ## - # volumeBindingMode: "" - - ## Subdirectory of alertmanager data Persistent Volume to mount - ## Useful if the volume's root directory is not empty - ## - subPath: "" - - ## Annotations to be added to alertmanager pods - ## - podAnnotations: {} - ## Tell prometheus to use a specific set of alertmanager pods - ## instead of all alertmanager pods found in the same namespace - ## Useful if you deploy multiple releases within the same namespace - ## - ## prometheus.io/probe: alertmanager-teamA - - ## Labels to be added to Prometheus AlertManager pods - ## - podLabels: {} - - ## Specify if a Pod Security Policy for node-exporter must be created - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ - ## - podSecurityPolicy: - annotations: {} - ## Specify pod annotations - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl - ## - # seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' - # seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - # apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - - ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below) - ## - replicaCount: 1 - - statefulSet: - ## If true, use a statefulset instead of a deployment for pod management. - ## This allows to scale replicas to more than 1 pod - ## - enabled: false - - podManagementPolicy: OrderedReady - - ## Alertmanager headless service to use for the statefulset - ## - headless: - annotations: {} - labels: {} - - ## Enabling peer mesh service end points for enabling the HA alert manager - ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md - # enableMeshPeer : true - - servicePort: 80 - - ## alertmanager resource requests and limits - ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - # limits: - # cpu: 10m - # memory: 32Mi - # requests: - # cpu: 10m - # memory: 32Mi - - ## Security context to be added to alertmanager pods - ## - securityContext: - runAsUser: 65534 - runAsNonRoot: true - runAsGroup: 65534 - fsGroup: 65534 - - service: - annotations: {} - labels: {} - clusterIP: "" - - ## Enabling peer mesh service end points for enabling the HA alert manager - ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md - # enableMeshPeer : true - - ## List of IP addresses at which the alertmanager service is available - ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips - ## - externalIPs: [] - - loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 80 - # nodePort: 30000 - sessionAffinity: None - type: ClusterIP - -## Monitors ConfigMap changes and POSTs to a URL -## Ref: https://github.com/jimmidyson/configmap-reload -## -configmapReload: - prometheus: - ## If false, the configmap-reload container will not be deployed - ## - enabled: true - - ## configmap-reload container name - ## - name: configmap-reload - - ## configmap-reload container image - ## - image: - repository: jimmidyson/configmap-reload - tag: v0.3.0 - pullPolicy: IfNotPresent - - ## Additional configmap-reload container arguments - ## - extraArgs: {} - ## Additional configmap-reload volume directories - ## - extraVolumeDirs: [] - - - ## Additional configmap-reload mounts - ## - extraConfigmapMounts: [] - # - name: prometheus-alerts - # mountPath: /etc/alerts.d - # subPath: "" - # configMap: prometheus-alerts - # readOnly: true - - - ## configmap-reload resource requests and limits - ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - alertmanager: - ## If false, the configmap-reload container will not be deployed - ## - enabled: true - - ## configmap-reload container name - ## - name: configmap-reload - - ## configmap-reload container image - ## - image: - repository: jimmidyson/configmap-reload - tag: v0.3.0 - pullPolicy: IfNotPresent - - ## Additional configmap-reload container arguments - ## - extraArgs: {} - ## Additional configmap-reload volume directories - ## - extraVolumeDirs: [] - - - ## Additional configmap-reload mounts - ## - extraConfigmapMounts: [] - # - name: prometheus-alerts - # mountPath: /etc/alerts.d - # subPath: "" - # configMap: prometheus-alerts - # readOnly: true - - - ## configmap-reload resource requests and limits - ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - -kubeStateMetrics: - ## If false, kube-state-metrics sub-chart will not be installed - ## Please see https://github.com/helm/charts/tree/master/stable/kube-state-metrics for configurable values - ## - enabled: true - -nodeExporter: - ## If false, node-exporter will not be installed - ## - enabled: true - - ## If true, node-exporter pods share the host network namespace - ## - hostNetwork: true - - ## If true, node-exporter pods share the host PID namespace - ## - hostPID: true - - ## node-exporter container name - ## - name: node-exporter - - ## node-exporter container image - ## - image: - repository: prom/node-exporter - tag: v0.18.1 - pullPolicy: IfNotPresent - - ## Specify if a Pod Security Policy for node-exporter must be created - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ - ## - podSecurityPolicy: - annotations: {} - ## Specify pod annotations - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl - ## - # seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' - # seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - # apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - - ## node-exporter priorityClassName - ## - priorityClassName: "" - - ## Custom Update Strategy - ## - updateStrategy: - type: RollingUpdate - - ## Additional node-exporter container arguments - ## - extraArgs: {} - - ## Additional node-exporter hostPath mounts - ## - extraHostPathMounts: [] - # - name: textfile-dir - # mountPath: /srv/txt_collector - # hostPath: /var/lib/node-exporter - # readOnly: true - # mountPropagation: HostToContainer - - extraConfigmapMounts: [] - # - name: certs-configmap - # mountPath: /prometheus - # configMap: certs-configmap - # readOnly: true - - ## Node tolerations for node-exporter scheduling to nodes with taints - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - - ## Node labels for node-exporter pod assignment - ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## Annotations to be added to node-exporter pods - ## - podAnnotations: {} - - ## Labels to be added to node-exporter pods - ## - pod: - labels: {} - - ## PodDisruptionBudget settings - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ - ## - podDisruptionBudget: - enabled: false - maxUnavailable: 1 - - ## node-exporter resource limits & requests - ## Ref: https://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - # limits: - # cpu: 200m - # memory: 50Mi - # requests: - # cpu: 100m - # memory: 30Mi - - ## Security context to be added to node-exporter pods - ## - securityContext: {} - # runAsUser: 0 - - service: - annotations: - prometheus.io/scrape: "true" - labels: {} - - # Exposed as a headless service: - # https://kubernetes.io/docs/concepts/services-networking/service/#headless-services - clusterIP: None - - ## List of IP addresses at which the node-exporter service is available - ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips - ## - externalIPs: [] - - hostPort: 9100 - loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 9100 - type: ClusterIP - -server: - ## Prometheus server container name - ## - enabled: true - name: server - sidecarContainers: - strategy: - type: Recreate - rollingUpdate: null - - ## Prometheus server container image - ## - image: - repository: prom/prometheus - tag: v2.17.2 - pullPolicy: IfNotPresent - - ## prometheus server priorityClassName - ## - priorityClassName: "" - - ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug - ## so that the various internal URLs are still able to access as they are in the default case. - ## (Optional) - prefixURL: "" - - ## External URL which can access alertmanager - ## Maybe same with Ingress host name - baseURL: "" - - ## Additional server container environment variables - ## - ## You specify this manually like you would a raw deployment manifest. - ## This means you can bind in environment variables from secrets. - ## - ## e.g. static environment variable: - ## - name: DEMO_GREETING - ## value: "Hello from the environment" - ## - ## e.g. secret environment variable: - ## - name: USERNAME - ## valueFrom: - ## secretKeyRef: - ## name: mysecret - ## key: username - env: [] - - extraFlags: - - web.enable-lifecycle - ## web.enable-admin-api flag controls access to the administrative HTTP API which includes functionality such as - ## deleting time series. This is disabled by default. - # - web.enable-admin-api - ## - ## storage.tsdb.no-lockfile flag controls BD locking - # - storage.tsdb.no-lockfile - ## - ## storage.tsdb.wal-compression flag enables compression of the write-ahead log (WAL) - # - storage.tsdb.wal-compression - - ## Path to a configuration file on prometheus server container FS - configPath: /etc/config/prometheus.yml - - global: - ## How frequently to scrape targets by default - ## - scrape_interval: 1m - ## How long until a scrape request times out - ## - scrape_timeout: 10s - ## How frequently to evaluate rules - ## - evaluation_interval: 1m - ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write - ## - remoteWrite: {} - ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read - ## - remoteRead: {} - - ## Additional Prometheus server container arguments - ## - extraArgs: {} - - ## Additional InitContainers to initialize the pod - ## - extraInitContainers: [] - - ## Additional Prometheus server Volume mounts - ## - extraVolumeMounts: [] - - ## Additional Prometheus server Volumes - ## - extraVolumes: [] - - ## Additional Prometheus server hostPath mounts - ## - extraHostPathMounts: [] - # - name: certs-dir - # mountPath: /etc/kubernetes/certs - # subPath: "" - # hostPath: /etc/kubernetes/certs - # readOnly: true - - extraConfigmapMounts: [] - # - name: certs-configmap - # mountPath: /prometheus - # subPath: "" - # configMap: certs-configmap - # readOnly: true - - ## Additional Prometheus server Secret mounts - # Defines additional mounts with secrets. Secrets must be manually created in the namespace. - extraSecretMounts: [] - # - name: secret-files - # mountPath: /etc/secrets - # subPath: "" - # secretName: prom-secret-files - # readOnly: true - - ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.server.configMapOverrideName}} - ## Defining configMapOverrideName will cause templates/server-configmap.yaml - ## to NOT generate a ConfigMap resource - ## - configMapOverrideName: "" - - ingress: - ## If true, Prometheus server Ingress will be created - ## - enabled: false - - ## Prometheus server Ingress annotations - ## - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: 'true' - - ## Prometheus server Ingress additional labels - ## - extraLabels: {} - - ## Prometheus server Ingress hostnames with optional path - ## Must be provided if Ingress is enabled - ## - hosts: [] - # - prometheus.domain.com - # - domain.com/prometheus - - ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services. - extraPaths: [] - # - path: /* - # backend: - # serviceName: ssl-redirect - # servicePort: use-annotation - - ## Prometheus server Ingress TLS configuration - ## Secrets must be manually created in the namespace - ## - tls: [] - # - secretName: prometheus-server-tls - # hosts: - # - prometheus.domain.com - - ## Server Deployment Strategy type - # strategy: - # type: Recreate - - ## Node tolerations for server scheduling to nodes with taints - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - - ## Node labels for Prometheus server pod assignment - ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## Pod affinity - ## - affinity: {} - - ## PodDisruptionBudget settings - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ - ## - podDisruptionBudget: - enabled: false - maxUnavailable: 1 - - ## Use an alternate scheduler, e.g. "stork". - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - # schedulerName: - - persistentVolume: - ## If true, Prometheus server will create/use a Persistent Volume Claim - ## If false, use emptyDir - ## - enabled: true - - ## Prometheus server data Persistent Volume access modes - ## Must match those of existing PV or dynamic provisioner - ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ - ## - accessModes: - - ReadWriteOnce - - ## Prometheus server data Persistent Volume annotations - ## - annotations: {} - - ## Prometheus server data Persistent Volume existing claim name - ## Requires server.persistentVolume.enabled: true - ## If defined, PVC must be created manually before volume will be bound - existingClaim: "" - - ## Prometheus server data Persistent Volume mount root path - ## - mountPath: /data - - ## Prometheus server data Persistent Volume size - ## - size: 8Gi - - ## Prometheus server data Persistent Volume Storage Class - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is - ## set, choosing the default provisioner. (gp2 on AWS, standard on - ## GKE, AWS & OpenStack) - ## - # storageClass: "-" - - ## Prometheus server data Persistent Volume Binding Mode - ## If defined, volumeBindingMode: - ## If undefined (the default) or set to null, no volumeBindingMode spec is - ## set, choosing the default mode. - ## - # volumeBindingMode: "" - - ## Subdirectory of Prometheus server data Persistent Volume to mount - ## Useful if the volume's root directory is not empty - ## - subPath: "" - - emptyDir: - sizeLimit: "" - - ## Annotations to be added to Prometheus server pods - ## - podAnnotations: {} - # iam.amazonaws.com/role: prometheus - - ## Labels to be added to Prometheus server pods - ## - podLabels: {} - - ## Prometheus AlertManager configuration - ## - alertmanagers: [] - - ## Specify if a Pod Security Policy for node-exporter must be created - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ - ## - podSecurityPolicy: - annotations: {} - ## Specify pod annotations - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl - ## - # seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' - # seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - # apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - - ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below) - ## - replicaCount: 1 - - statefulSet: - ## If true, use a statefulset instead of a deployment for pod management. - ## This allows to scale replicas to more than 1 pod - ## - enabled: false - - annotations: {} - labels: {} - podManagementPolicy: OrderedReady - - ## Alertmanager headless service to use for the statefulset - ## - headless: - annotations: {} - labels: {} - servicePort: 80 - - ## Prometheus server readiness and liveness probe initial delay and timeout - ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ - ## - readinessProbeInitialDelay: 30 - readinessProbeTimeout: 30 - readinessProbeFailureThreshold: 3 - readinessProbeSuccessThreshold: 1 - livenessProbeInitialDelay: 30 - livenessProbeTimeout: 30 - livenessProbeFailureThreshold: 3 - livenessProbeSuccessThreshold: 1 - - ## Prometheus server resource requests and limits - ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - # limits: - # cpu: 500m - # memory: 512Mi - # requests: - # cpu: 500m - # memory: 512Mi - - ## Vertical Pod Autoscaler config - ## Ref: https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler - verticalAutoscaler: - ## If true a VPA object will be created for the controller (either StatefulSet or Deployemnt, based on above configs) - enabled: false - # updateMode: "Auto" - # containerPolicies: - # - containerName: 'prometheus-server' - - ## Security context to be added to server pods - ## - securityContext: - runAsUser: 65534 - runAsNonRoot: true - runAsGroup: 65534 - fsGroup: 65534 - - service: - annotations: {} - labels: {} - clusterIP: "" - - ## List of IP addresses at which the Prometheus server service is available - ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips - ## - externalIPs: [] - - loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 80 - sessionAffinity: None - type: ClusterIP - - ## Enable gRPC port on service to allow auto discovery with thanos-querier - gRPC: - enabled: false - servicePort: 10901 - # nodePort: 10901 - - ## If using a statefulSet (statefulSet.enabled=true), configure the - ## service to connect to a specific replica to have a consistent view - ## of the data. - statefulsetReplica: - enabled: false - replica: 0 - - ## Prometheus server pod termination grace period - ## - terminationGracePeriodSeconds: 300 - - ## Prometheus data retention period (default if not specified is 15 days) - ## - retention: "15d" - -pushgateway: - ## If false, pushgateway will not be installed - ## - enabled: true - - ## Use an alternate scheduler, e.g. "stork". - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - # schedulerName: - - ## pushgateway container name - ## - name: pushgateway - - ## pushgateway container image - ## - image: - repository: prom/pushgateway - tag: v1.0.1 - pullPolicy: IfNotPresent - - ## pushgateway priorityClassName - ## - priorityClassName: "" - - ## Additional pushgateway container arguments - ## - ## for example: persistence.file: /data/pushgateway.data - extraArgs: {} - - ingress: - ## If true, pushgateway Ingress will be created - ## - enabled: false - - ## pushgateway Ingress annotations - ## - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: 'true' - - ## pushgateway Ingress hostnames with optional path - ## Must be provided if Ingress is enabled - ## - hosts: [] - # - pushgateway.domain.com - # - domain.com/pushgateway - - ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services. - extraPaths: [] - # - path: /* - # backend: - # serviceName: ssl-redirect - # servicePort: use-annotation - - ## pushgateway Ingress TLS configuration - ## Secrets must be manually created in the namespace - ## - tls: [] - # - secretName: prometheus-alerts-tls - # hosts: - # - pushgateway.domain.com - - ## Node tolerations for pushgateway scheduling to nodes with taints - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - - ## Node labels for pushgateway pod assignment - ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## Annotations to be added to pushgateway pods - ## - podAnnotations: {} - - ## Specify if a Pod Security Policy for node-exporter must be created - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ - ## - podSecurityPolicy: - annotations: {} - ## Specify pod annotations - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl - ## - # seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' - # seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - # apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - - replicaCount: 1 - - ## PodDisruptionBudget settings - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ - ## - podDisruptionBudget: - enabled: false - maxUnavailable: 1 - - ## pushgateway resource requests and limits - ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - # limits: - # cpu: 10m - # memory: 32Mi - # requests: - # cpu: 10m - # memory: 32Mi - - ## Security context to be added to push-gateway pods - ## - securityContext: - runAsUser: 65534 - runAsNonRoot: true - - service: - annotations: - prometheus.io/probe: pushgateway - labels: {} - clusterIP: "" - - ## List of IP addresses at which the pushgateway service is available - ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips - ## - externalIPs: [] - - loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 9091 - type: ClusterIP - - strategy: - type: Recreate - rollingUpdate: null - - - persistentVolume: - ## If true, pushgateway will create/use a Persistent Volume Claim - ## If false, use emptyDir - ## - enabled: false - - ## pushgateway data Persistent Volume access modes - ## Must match those of existing PV or dynamic provisioner - ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ - ## - accessModes: - - ReadWriteOnce - - ## pushgateway data Persistent Volume Claim annotations - ## - annotations: {} - - ## pushgateway data Persistent Volume existing claim name - ## Requires pushgateway.persistentVolume.enabled: true - ## If defined, PVC must be created manually before volume will be bound - existingClaim: "" - - ## pushgateway data Persistent Volume mount root path - ## - mountPath: /data - - ## pushgateway data Persistent Volume size - ## - size: 2Gi - - ## pushgateway data Persistent Volume Storage Class - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is - ## set, choosing the default provisioner. (gp2 on AWS, standard on - ## GKE, AWS & OpenStack) - ## - # storageClass: "-" - - ## pushgateway data Persistent Volume Binding Mode - ## If defined, volumeBindingMode: - ## If undefined (the default) or set to null, no volumeBindingMode spec is - ## set, choosing the default mode. - ## - # volumeBindingMode: "" - - ## Subdirectory of pushgateway data Persistent Volume to mount - ## Useful if the volume's root directory is not empty - ## - subPath: "" - - -## alertmanager ConfigMap entries -## -alertmanagerFiles: - alertmanager.yml: - global: {} - # slack_api_url: '' - - receivers: - - name: default-receiver - # slack_configs: - # - channel: '@you' - # send_resolved: true - - route: - group_wait: 10s - group_interval: 5m - receiver: default-receiver - repeat_interval: 3h - -## Prometheus server ConfigMap entries -## -serverFiles: - - ## Alerts configuration - ## Ref: https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/ - alerting_rules.yml: {} - # groups: - # - name: Instances - # rules: - # - alert: InstanceDown - # expr: up == 0 - # for: 5m - # labels: - # severity: page - # annotations: - # description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.' - # summary: 'Instance {{ $labels.instance }} down' - ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use alerting_rules.yml - alerts: {} - - ## Records configuration - ## Ref: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/ - recording_rules.yml: {} - ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use recording_rules.yml - rules: {} - - prometheus.yml: - rule_files: - - /etc/config/recording_rules.yml - - /etc/config/alerting_rules.yml - ## Below two files are DEPRECATED will be removed from this default values file - - /etc/config/rules - - /etc/config/alerts - - scrape_configs: - - job_name: prometheus - static_configs: - - targets: - - localhost:9090 - - # A scrape configuration for running Prometheus on a Kubernetes cluster. - # This uses separate scrape configs for cluster components (i.e. API server, node) - # and services to allow each to use different authentication configs. - # - # Kubernetes labels will be added as Prometheus labels on metrics via the - # `labelmap` relabeling action. - - - job_name: 'kubernetes-nodes-cadvisor' - - # Default to scraping over https. If required, just disable this or change to - # `http`. - scheme: https - - # This TLS & bearer token file config is used to connect to the actual scrape - # endpoints for cluster components. This is separate to discovery auth - # configuration because discovery & scraping are two separate concerns in - # Prometheus. The discovery auth config is automatic if Prometheus runs inside - # the cluster. Otherwise, more config options have to be provided within the - # . - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - # If your node certificates are self-signed or use a different CA to the - # master CA, then disable certificate verification below. Note that - # certificate verification is an integral part of a secure infrastructure - # so this should only be disabled in a controlled environment. You can - # disable certificate verification by uncommenting the line below. - # - insecure_skip_verify: true - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - - kubernetes_sd_configs: - - role: node - - # This configuration will work only on kubelet 1.7.3+ - # As the scrape endpoints for cAdvisor have changed - # if you are using older version you need to change the replacement to - # replacement: /api/v1/nodes/$1:4194/proxy/metrics - # more info here https://github.com/coreos/prometheus-operator/issues/633 - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - target_label: __address__ - replacement: kubernetes.default.svc:443 - - source_labels: [__meta_kubernetes_node_name] - regex: (.+) - target_label: __metrics_path__ - replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor - - metric_relabel_configs: - - source_labels: [ __name__ ] - regex: (container_cpu_usage_seconds_total|container_memory_working_set_bytes|container_network_receive_errors_total|container_network_transmit_errors_total|container_network_receive_packets_dropped_total|container_network_transmit_packets_dropped_total|container_memory_usage_bytes|container_cpu_cfs_throttled_periods_total|container_cpu_cfs_periods_total|container_fs_usage_bytes|container_fs_limit_bytes|container_cpu_cfs_periods_total|container_fs_inodes_free|container_fs_inodes_total|container_fs_usage_bytes|container_fs_limit_bytes|container_cpu_cfs_throttled_periods_total|container_cpu_cfs_periods_total|container_network_receive_bytes_total|container_network_transmit_bytes_total|container_fs_inodes_free|container_fs_inodes_total|container_fs_usage_bytes|container_fs_limit_bytes|container_spec_cpu_shares|container_spec_memory_limit_bytes|container_network_receive_bytes_total|container_network_transmit_bytes_total|container_fs_reads_bytes_total|container_network_receive_bytes_total|container_fs_writes_bytes_total|container_fs_reads_bytes_total|cadvisor_version_info) - action: keep - - source_labels: [ container ] - target_label: container_name - regex: (.+) - action: replace - - source_labels: [ pod ] - target_label: pod_name - regex: (.+) - action: replace - - # Scrape config for service endpoints. - # - # The relabeling allows the actual service scrape endpoint to be configured - # via the following annotations: - # - # * `prometheus.io/scrape`: Only scrape services that have a value of `true` - # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need - # to set this to `https` & most likely set the `tls_config` of the scrape config. - # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. - # * `prometheus.io/port`: If the metrics are exposed on a different port to the - # service then set this appropriately. - - job_name: 'kubernetes-service-endpoints' - - kubernetes_sd_configs: - - role: endpoints - - relabel_configs: - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] - action: keep - regex: true - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] - action: replace - target_label: __scheme__ - regex: (https?) - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] - action: replace - target_label: __address__ - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [__meta_kubernetes_namespace] - action: replace - target_label: kubernetes_namespace - - source_labels: [__meta_kubernetes_service_name] - action: replace - target_label: kubernetes_name - - source_labels: [__meta_kubernetes_pod_node_name] - action: replace - target_label: kubernetes_node - metric_relabel_configs: - - source_labels: [ __name__ ] - regex: (container_cpu_allocation|container_cpu_usage_seconds_total|container_fs_limit_bytes|container_memory_allocation_bytes|container_memory_usage_bytes|container_memory_working_set_bytes|container_network_receive_bytes_total|container_network_transmit_bytes_total|deployment_match_labels|kube_deployment_spec_replicas|kube_deployment_status_replicas_available|kube_job_status_failed|kube_namespace_annotations|kube_namespace_labels|kube_node_info|kube_node_labels|kube_node_status_capacity_cpu_cores|kube_node_status_capacity_memory_bytes|kube_node_status_condition|kube_persistentvolume_capacity_bytes|kube_persistentvolume_status_phase|kube_persistentvolumeclaim_info|kube_persistentvolumeclaim_resource_requests_storage_bytes|kube_persistentvolumeclaim_resource_requests_storage_bytes|container_memory_allocation_bytes|kube_pod_container_resource_limits_cpu_cores|kube_pod_container_resource_limits_memory_bytes|kube_pod_container_resource_requests_cpu_cores|kube_pod_container_resource_requests_cpu_cores|container_cpu_usage_seconds_total|kube_pod_container_resource_requests_memory_bytes|kube_pod_container_resource_requests_memory_bytes|kube_node_status_capacity_memory_bytes|kube_pod_container_resource_requests|kube_pod_container_status_restarts_total|kube_pod_container_status_running|kube_pod_container_status_terminated_reason|kube_pod_labels|kube_pod_owner|kube_pod_status_phase|kubecost_cluster_memory_working_set_bytes|kubecost_pod_network_egress_bytes_total|node_cpu_hourly_cost|node_cpu_seconds_total|node_disk_reads_completed|node_disk_reads_completed_total|node_disk_writes_completed|node_disk_writes_completed_total|node_filesystem_device_error|node_gpu_hourly_cost|node_memory_Buffers_bytes|node_memory_Cached_bytes|node_memory_MemAvailable_bytes|node_memory_MemFree_bytes|node_memory_MemTotal_bytes|node_network_transmit_bytes_total|node_ram_hourly_cost|pod_pvc_allocation|pv_hourly_cost|service_selector_labels|statefulSet_match_labels|up|kube_node_status_allocatable_cpu_cores|kube_node_status_allocatable_memory_bytes|container_fs_writes_bytes_total|kube_deployment_status_replicas|kube_statefulset_replicas|kube_daemonset_status_desired_number_scheduled|kube_deployment_status_replicas_available|kube_statefulset_status_replicas|kube_daemonset_status_number_ready|kube_deployment_status_replicas|kube_statefulset_replicas|kube_daemonset_status_desired_number_scheduled|kube_replicaset_owner|kube_pod_container_info) - action: keep - - # Scrape config for slow service endpoints; same as above, but with a larger - # timeout and a larger interval - # - # The relabeling allows the actual service scrape endpoint to be configured - # via the following annotations: - # - # * `prometheus.io/scrape-slow`: Only scrape services that have a value of `true` - # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need - # to set this to `https` & most likely set the `tls_config` of the scrape config. - # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. - # * `prometheus.io/port`: If the metrics are exposed on a different port to the - # service then set this appropriately. - - job_name: 'kubernetes-service-endpoints-slow' - - scrape_interval: 5m - scrape_timeout: 30s - - kubernetes_sd_configs: - - role: endpoints - - relabel_configs: - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape_slow] - action: keep - regex: true - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] - action: replace - target_label: __scheme__ - regex: (https?) - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] - action: replace - target_label: __address__ - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [__meta_kubernetes_namespace] - action: replace - target_label: kubernetes_namespace - - source_labels: [__meta_kubernetes_service_name] - action: replace - target_label: kubernetes_name - - source_labels: [__meta_kubernetes_pod_node_name] - action: replace - target_label: kubernetes_node - - - job_name: 'prometheus-pushgateway' - honor_labels: true - - kubernetes_sd_configs: - - role: service - - relabel_configs: - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe] - action: keep - regex: pushgateway - - # Example scrape config for probing services via the Blackbox Exporter. - # - # The relabeling allows the actual service scrape endpoint to be configured - # via the following annotations: - # - # * `prometheus.io/probe`: Only probe services that have a value of `true` - - job_name: 'kubernetes-services' - - metrics_path: /probe - params: - module: [http_2xx] - - kubernetes_sd_configs: - - role: service - - relabel_configs: - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe] - action: keep - regex: true - - source_labels: [__address__] - target_label: __param_target - - target_label: __address__ - replacement: blackbox - - source_labels: [__param_target] - target_label: instance - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [__meta_kubernetes_namespace] - target_label: kubernetes_namespace - - source_labels: [__meta_kubernetes_service_name] - target_label: kubernetes_name - -# adds additional scrape configs to prometheus.yml -# must be a string so you have to add a | after extraScrapeConfigs: -# example adds prometheus-blackbox-exporter scrape config -extraScrapeConfigs: - # - job_name: 'prometheus-blackbox-exporter' - # metrics_path: /probe - # params: - # module: [http_2xx] - # static_configs: - # - targets: - # - https://example.com - # relabel_configs: - # - source_labels: [__address__] - # target_label: __param_target - # - source_labels: [__param_target] - # target_label: instance - # - target_label: __address__ - # replacement: prometheus-blackbox-exporter:9115 - -# Adds option to add alert_relabel_configs to avoid duplicate alerts in alertmanager -# useful in H/A prometheus with different external labels but the same alerts -alertRelabelConfigs: - # alert_relabel_configs: - # - source_labels: [dc] - # regex: (.+)\d+ - # target_label: dc - -networkPolicy: - ## Enable creation of NetworkPolicy resources. - ## - enabled: false diff --git a/charts/kubecost/charts/thanos/.helmignore b/charts/kubecost/charts/thanos/.helmignore deleted file mode 100644 index f0c131944..000000000 --- a/charts/kubecost/charts/thanos/.helmignore +++ /dev/null @@ -1,21 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj diff --git a/charts/kubecost/charts/thanos/Chart.yaml b/charts/kubecost/charts/thanos/Chart.yaml deleted file mode 100644 index bf76cbf27..000000000 --- a/charts/kubecost/charts/thanos/Chart.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -appVersion: 0.15.0 -description: Thanos is a set of components that can be composed into a highly available - metric system with unlimited storage capacity, which can be added seamlessly on - top of existing Prometheus deployments. -icon: https://raw.githubusercontent.com/thanos-io/thanos/master/website/static/Thanos-logo_full.svg -keywords: -- thanos -- prometheus -- metrics -maintainers: -- email: info@banzaicloud.com - name: Banzai Cloud -name: thanos -sources: -- https://github.com/thanos-io/thanos -- https://github.com/banzaicloud/banzai-charts/tree/master/thanos -version: 0.15.0 diff --git a/charts/kubecost/charts/thanos/requirements.yaml b/charts/kubecost/charts/thanos/requirements.yaml deleted file mode 100644 index e69de29bb..000000000 diff --git a/charts/kubecost/charts/thanos/templates/NOTES.txt b/charts/kubecost/charts/thanos/templates/NOTES.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/charts/kubecost/charts/thanos/templates/_helpers.tpl b/charts/kubecost/charts/thanos/templates/_helpers.tpl deleted file mode 100644 index 7b5fb57d8..000000000 --- a/charts/kubecost/charts/thanos/templates/_helpers.tpl +++ /dev/null @@ -1,51 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "thanos.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "thanos.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "thanos.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - - -{{/* -Create a default fully qualified component name from the full app name and a component name. -We truncate the full name at 63 - 1 (last dash) - len(component name) chars because some Kubernetes name fields are limited to this (by the DNS naming spec) -and we want to make sure that the component is included in the name. -*/}} -{{- define "thanos.componentname" -}} -{{- $global := index . 0 -}} -{{- $component := index . 1 | trimPrefix "-" -}} -{{- printf "%s-%s" (include "thanos.fullname" $global | trunc (sub 62 (len $component) | int) | trimSuffix "-" ) $component | trimSuffix "-" -}} -{{- end -}} - -{{/* - -*/}} -{{- define "thanos.secretname" }} -{{- default (include "thanos.name" .) .Values.storeSecretName }} -{{- end }} diff --git a/charts/kubecost/charts/thanos/templates/bucket-deployment.yaml b/charts/kubecost/charts/thanos/templates/bucket-deployment.yaml deleted file mode 100644 index e8757af68..000000000 --- a/charts/kubecost/charts/thanos/templates/bucket-deployment.yaml +++ /dev/null @@ -1,87 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.bucket.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "thanos.componentname" (list $ "bucket") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: bucket -{{ with .Values.bucket.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end -}} - {{- with .Values.bucket.deploymentAnnotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.bucket.replicaCount | default 1 }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: bucket -{{ with .Values.bucket.deploymentMatchLabels }}{{ toYaml . | indent 6 }}{{ end }} - template: - metadata: - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: bucket -{{ with .Values.bucket.labels }}{{ toYaml . | indent 8 }}{{ end }} - {{- with .Values.bucket.annotations }} - annotations: {{ toYaml . | nindent 8 }} - {{- end }} - spec: - containers: - - name: thanos-bucket - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: {{- with .Values.bucket.extraEnv }}{{ toYaml . | nindent 8 }}{{- end }} - args: - - "tools" - - "bucket" - - "web" - - "--log.level={{ .Values.bucket.logLevel }}" - - "--http-address=0.0.0.0:{{ .Values.bucket.http.port }}" - - "--objstore.config-file=/etc/config/object-store.yaml" - {{- if .Values.bucket.refresh }} - - "--refresh={{ .Values.bucket.refresh }}" - {{- end }} - {{- if .Values.bucket.timeout }} - - "--timeout={{ .Values.bucket.timeout }}" - {{- end }} - {{- if .Values.bucket.label }} - - "--label={{ .Values.bucket.label }}" - {{- end }} - {{ with .Values.bucket.extraArgs }}{{ toYaml . | nindent 8 }}{{- end }} - ports: - - name: http - containerPort: {{ .Values.bucket.http.port }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - resources: {{ toYaml .Values.bucket.resources | nindent 10 }} - volumes: - - name: config-volume - secret: - secretName: {{ include "thanos.secretname" . }} - {{- with .Values.bucket.securityContext }} - securityContext: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.bucket.nodeSelector }} - nodeSelector: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.bucket.affinity }} - affinity: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.bucket.tolerations }} - tolerations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.bucket.serviceAccount }} - serviceAccountName: "{{ . }}" - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/bucket-ingress.yaml b/charts/kubecost/charts/thanos/templates/bucket-ingress.yaml deleted file mode 100644 index 28b037bda..000000000 --- a/charts/kubecost/charts/thanos/templates/bucket-ingress.yaml +++ /dev/null @@ -1,42 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if and .Values.bucket.enabled .Values.bucket.http.ingress.enabled }} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ include "thanos.componentname" (list $ "bucket") }} - {{- with .Values.bucket.http.ingress.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: bucket - {{- if .Values.bucket.http.ingress.labels }} -{{ toYaml .Values.bucket.http.ingress.labels | indent 4 }} - {{- end }} -spec: - {{- if .Values.bucket.http.ingress.tls }} - tls: - {{- range .Values.bucket.http.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.bucket.http.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $.Values.bucket.http.ingress.path }} - backend: - serviceName: {{ include "thanos.componentname" (list $ "bucket") }} - servicePort: {{ $.Values.bucket.http.port }} - {{- end }} -{{ end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/bucket-poddisruptionbudget.yaml b/charts/kubecost/charts/thanos/templates/bucket-poddisruptionbudget.yaml deleted file mode 100644 index fb3fd1cb7..000000000 --- a/charts/kubecost/charts/thanos/templates/bucket-poddisruptionbudget.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.bucket.enabled .Values.bucket.podDisruptionBudget.enabled }} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ include "thanos.componentname" (list $ "bucket") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: bucket -{{ with .Values.bucket.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - {{- if .Values.bucket.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.bucket.podDisruptionBudget.minAvailable }} - {{- end }} - {{- if .Values.bucket.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.bucket.podDisruptionBudget.maxUnavailable }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/component: bucket -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/bucket-service.yaml b/charts/kubecost/charts/thanos/templates/bucket-service.yaml deleted file mode 100644 index 0d56d8a2b..000000000 --- a/charts/kubecost/charts/thanos/templates/bucket-service.yaml +++ /dev/null @@ -1,30 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.bucket.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "bucket") }} - {{- with .Values.bucket.http.service.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: bucket -{{ with .Values.bucket.http.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - ports: - - port: {{ .Values.bucket.http.port }} - protocol: TCP - targetPort: http - name: http - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: bucket -{{ with .Values.bucket.http.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} -{{ end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/compact-deployment.yaml b/charts/kubecost/charts/thanos/templates/compact-deployment.yaml deleted file mode 100644 index a5b0347ad..000000000 --- a/charts/kubecost/charts/thanos/templates/compact-deployment.yaml +++ /dev/null @@ -1,108 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.compact.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "thanos.componentname" (list $ "compact") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: compact -{{ with .Values.compact.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end -}} - {{- with .Values.compact.deploymentAnnotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.compact.replicaCount | default 1 }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: compact -{{ with .Values.compact.deploymentMatchLabels }}{{ toYaml . | indent 6 }}{{ end }} - template: - metadata: - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: compact -{{ with .Values.compact.labels }}{{ toYaml . | indent 8 }}{{ end }} - {{- with .Values.compact.annotations }} - annotations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.compact.metrics.annotations.enabled }} - prometheus.io/scrape: "true" - prometheus.io/port: "{{ .Values.compact.http.port }}" - {{- end }} - spec: - containers: - - name: thanos-compact - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: {{- with .Values.compact.extraEnv }}{{ toYaml . | nindent 8 }}{{- end }} - args: - - "compact" - - "--log.level={{ .Values.compact.logLevel }}" - - "--http-address=0.0.0.0:{{ .Values.compact.http.port }}" - - "--objstore.config-file=/etc/config/object-store.yaml" - - "--data-dir=/var/thanos/compact" - - "--consistency-delay={{ .Values.compact.consistencyDelay }}" - - "--retention.resolution-raw={{ .Values.compact.retentionResolutionRaw }}" - - "--retention.resolution-5m={{ .Values.compact.retentionResolution5m }}" - - "--retention.resolution-1h={{ .Values.compact.retentionResolution1h }}" - - "--block-sync-concurrency={{ .Values.compact.blockSyncConcurrency }}" - - "--compact.concurrency={{ .Values.compact.compactConcurrency }}" -{{- if .Values.compact.disableDownsampling }} - - "--downsampling.disable" -{{- end }} - - "--wait" -{{ with .Values.compact.extraArgs }}{{ toYaml . | indent 8 }}{{- end }} - ports: - - name: http - containerPort: {{ .Values.compact.http.port }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - - name: data-volume - mountPath: /var/thanos/compact - resources: {{ toYaml .Values.compact.resources | nindent 10 }} - volumes: - - name: data-volume - {{- if .Values.compact.dataVolume }} - {{- if .Values.compact.dataVolume.persistentVolumeClaim }} - {{- if .Values.compact.dataVolume.persistentVolumeClaim.claimName }} - persistentVolumeClaim: - claimName: {{ .Values.compact.dataVolume.persistentVolumeClaim.claimName }} - {{- else }} - emptyDir: {} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - - name: config-volume - secret: - secretName: {{ include "thanos.secretname" . }} - {{- with .Values.compact.securityContext }} - securityContext: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.compact.nodeSelector }} - nodeSelector: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.compact.affinity }} - affinity: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.compact.tolerations }} - tolerations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.compact.serviceAccount }} - serviceAccountName: "{{ . }}" - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/compact-pvc.yaml b/charts/kubecost/charts/thanos/templates/compact-pvc.yaml deleted file mode 100644 index f6b33e491..000000000 --- a/charts/kubecost/charts/thanos/templates/compact-pvc.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.compact.enabled }} -{{- if .Values.compact.dataVolume -}} -{{- if .Values.compact.dataVolume.persistentVolumeClaim -}} -{{- if .Values.compact.dataVolume.persistentVolumeClaim.claimName -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ .Values.compact.dataVolume.persistentVolumeClaim.claimName }} -spec: - accessModes: - - ReadWriteOnce - {{- if .Values.compact.dataVolume.persistentVolumeClaim.storageClass }} - storageClassName: {{ .Values.compact.dataVolume.persistentVolumeClaim.storageClass }} - {{- end }} - resources: - requests: - {{- if .Values.compact.dataVolume.persistentVolumeClaim.storage }} - storage: {{ .Values.compact.dataVolume.persistentVolumeClaim.storage }} - {{- else }} - storage: 100Gi - {{- end }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/compact-service.yaml b/charts/kubecost/charts/thanos/templates/compact-service.yaml deleted file mode 100644 index 080821849..000000000 --- a/charts/kubecost/charts/thanos/templates/compact-service.yaml +++ /dev/null @@ -1,30 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.compact.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "compact") }} - {{- with .Values.compact.http.service.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: compact -{{ with .Values.compact.http.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - ports: - - port: {{ .Values.compact.http.port }} - protocol: TCP - targetPort: http - name: http - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: compact -{{ with .Values.compact.http.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} -{{ end}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/compact-servicemonitor.yaml b/charts/kubecost/charts/thanos/templates/compact-servicemonitor.yaml deleted file mode 100644 index bc224d802..000000000 --- a/charts/kubecost/charts/thanos/templates/compact-servicemonitor.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.compact.enabled .Values.compact.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "thanos.componentname" (list $ "compact") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: compact -{{ with .Values.compact.metrics.serviceMonitor.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - jobLabel: thanos-compact - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: compact - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - endpoints: - - port: http - interval: {{ .Values.compact.metrics.serviceMonitor.interval | default "15s" }} - {{- with .Values.compact.metrics.serviceMonitor.relabellings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-deployment.yaml b/charts/kubecost/charts/thanos/templates/query-deployment.yaml deleted file mode 100644 index 74e96d09c..000000000 --- a/charts/kubecost/charts/thanos/templates/query-deployment.yaml +++ /dev/null @@ -1,148 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.query.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "thanos.componentname" (list $ "query") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query -{{ with .Values.query.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end }} - {{- with .Values.query.deploymentAnnotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if not .Values.query.autoscaling.enabled }} - replicas: {{ .Values.query.replicaCount | default 1 }} -{{- end }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query -{{ with .Values.query.deploymentMatchLabels }}{{ toYaml . | indent 6 }}{{ end }} - template: - metadata: - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query -{{ with .Values.query.labels }}{{ toYaml . | indent 8 }}{{ end }} - {{- with .Values.query.annotations }} - annotations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.query.metrics.annotations.enabled }} - prometheus.io/scrape: "true" - prometheus.io/port: "{{ .Values.query.http.port }}" - {{- end }} - spec: - containers: - - name: thanos-query - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - args: - - "query" - - "--log.level={{ .Values.query.logLevel }}" - - "--grpc-address=0.0.0.0:{{ .Values.query.grpc.port }}" - - "--http-address=0.0.0.0:{{ .Values.query.http.port }}" - - "--query.timeout={{ .Values.query.timeout }}" - - "--query.max-concurrent={{ .Values.query.maxConcurrent }}" - {{- if .Values.query.autoDownsampling }} - - "--query.auto-downsampling" - {{- end }} - {{- if .Values.query.replicaLabel }} - - "--query.replica-label={{ .Values.query.replicaLabel }}" - {{- end }} - {{- if .Values.query.webRoutePrefix }} - - "--web.route-prefix={{ .Values.query.webRoutePrefix }}" - {{- end }} - {{- if .Values.query.webExternalPrefix }} - - "--web.external-prefix={{ .Values.query.webExternalPrefix }}" - {{- end }} - {{- if .Values.query.webPrefixHeader }} - - "--web.prefix-header={{ .Values.query.webPrefixHeader }}" - {{- end }} - {{- if .Values.query.storeDNSResolver }} - - "--store.sd-dns-resolver={{ .Values.query.storeDNSResolver }}" - {{- end }} - {{- if .Values.query.storeDNSDiscovery }} - - "--store=dnssrv+_grpc._tcp.{{ include "thanos.componentname" (list $ "store") }}-grpc.{{ .Release.Namespace }}.svc" - {{- end }} - {{- if .Values.query.sidecarDNSDiscovery }} - - "--store=dnssrv+_grpc._tcp.{{ include "thanos.componentname" (list $ "sidecar") }}-grpc.{{ .Release.Namespace }}.svc" - {{- end }} - {{- range .Values.query.stores }} - - "--store={{ . }}" - {{- end }} - {{- range .Values.query.serviceDiscoveryFiles }} - - "--store.sd-files={{ . }}" - {{- end }} - {{- range .Values.query.serviceDiscoveryFileConfigMaps }} - - "--store.sd-files=/etc/query/{{ . }}/*.yaml" - - "--store.sd-files=/etc/query/{{ . }}/*.yml" - - "--store.sd-files=/etc/query/{{ . }}/*.json" - {{- end }} - {{- if .Values.query.serviceDiscoveryInterval }} - - "--store.sd-interval={{ .Values.query.serviceDiscoveryInterval }}" - {{- end }} - - {{- if .Values.query.extraArgs }} - {{ toYaml .Values.query.extraArgs | nindent 8 }} - {{- end }} - ports: - - name: http - containerPort: {{ .Values.query.http.port }} - - name: grpc - containerPort: {{ .Values.query.grpc.port }} - resources: - {{ toYaml .Values.query.resources | nindent 10 }} - env: - {{- toYaml .Values.query.extraEnv | nindent 10 }} - volumeMounts: - {{- range .Values.query.serviceDiscoveryFileConfigMaps }} - - mountPath: /etc/query/{{ . }} - name: {{ . }} - {{- end }} - {{- if .Values.query.certSecretName }} - - mountPath: /etc/certs - name: {{ .Values.query.certSecretName }} - readOnly: true - {{- end }} - livenessProbe: - httpGet: - path: /-/healthy - port: http - volumes: - {{- range .Values.query.serviceDiscoveryFileConfigMaps }} - - name: {{ . }} - configMap: - defaultMode: 420 - name: {{ . }} - {{- end }} - {{- if .Values.query.certSecretName }} - - name: {{ .Values.query.certSecretName }} - secret: - defaultMode: 420 - secretName: {{ .Values.query.certSecretName }} - {{- end }} - {{- with .Values.query.securityContext }} - securityContext: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.query.nodeSelector }} - nodeSelector: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.query.affinity }} - affinity: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.query.tolerations }} - tolerations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.query.serviceAccount }} - serviceAccountName: "{{ . }}" - {{- end }} -{{ end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-frontend-deployment.yaml b/charts/kubecost/charts/thanos/templates/query-frontend-deployment.yaml deleted file mode 100644 index 05c32682d..000000000 --- a/charts/kubecost/charts/thanos/templates/query-frontend-deployment.yaml +++ /dev/null @@ -1,122 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.queryFrontend.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "thanos.componentname" (list $ "query-frontend") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end }} - {{- with .Values.queryFrontend.deploymentAnnotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if not .Values.queryFrontend.autoscaling.enabled }} - replicas: {{ .Values.queryFrontend.replicaCount | default 1 }} -{{- end }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.deploymentMatchLabels }}{{ toYaml . | indent 6 }}{{ end }} - template: - metadata: - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.labels }}{{ toYaml . | indent 8 }}{{ end }} - {{- with .Values.queryFrontend.annotations }} - annotations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.queryFrontend.metrics.annotations.enabled }} - prometheus.io/scrape: "true" - prometheus.io/port: "{{ .Values.queryFrontend.http.port }}" - {{- end }} - spec: - containers: - - name: thanos-query-frontend - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - args: - - "query-frontend" - - "--log.level={{ .Values.queryFrontend.logLevel }}" - - "--http-address=0.0.0.0:{{ .Values.queryFrontend.http.port }}" - - "--query-frontend.downstream-url=http://{{ include "thanos.componentname" (list $ "query") }}-http.{{ .Release.Namespace }}:{{ .Values.query.http.port }}" - - "--query-range.split-interval={{ .Values.queryFrontend.splitInterval }}" - - "--query-range.max-retries-per-request={{ .Values.queryFrontend.maxRetriesPerRequest }}" - - "--query-range.max-query-length={{ .Values.queryFrontend.maxQueryLength }}" - - "--query-range.max-query-parallelism={{ .Values.queryFrontend.maxQueryParallelism }}" - - "--query-range.response-cache-max-freshness={{ .Values.queryFrontend.responseCacheMaxFreshness }}" - {{- if .Values.queryFrontend.responseCache.enabled }} - {{- with .Values.queryFrontend.responseCache }} - - |- - --query-range.response-cache-config= - config: - max_size: {{ quote .maxSize }} - max_size_items: {{ .maxSizeItems }} - validity: {{ quote .validity }} - type: "in-memory" - {{- end }} - {{- else if .Values.queryFrontend.responseCacheConfigFile }} - - "--query-range.response-cache-config-file={{ .Values.queryFrontend.responseCacheConfigFile }}" - {{- else if .Values.queryFrontend.responseCacheConfig }} - - |- - --query-range.response-cache-config={{ toYaml .Values.queryFrontend.responseCacheConfig | nindent 12 }} - {{- end }} - {{- if .Values.queryFrontend.compressResponses }} - - "--query-frontend.compress-responses" - {{- end }} - {{- if .Values.queryFrontend.partialResponse }} - - "--query-range.partial-response" - {{- end }} - {{- if .Values.queryFrontend.extraArgs }} - {{ toYaml .Values.queryFrontend.extraArgs | nindent 8 }} - {{- end }} - ports: - - name: http - containerPort: {{ .Values.queryFrontend.http.port }} - resources: - {{ toYaml .Values.queryFrontend.resources | nindent 10 }} - env: - {{- toYaml .Values.queryFrontend.extraEnv | nindent 10 }} - volumeMounts: - {{- if .Values.queryFrontend.certSecretName }} - - mountPath: /etc/certs - name: {{ .Values.queryFrontend.certSecretName }} - readOnly: true - {{- end }} - livenessProbe: - httpGet: - path: /-/healthy - port: http - volumes: - {{- if .Values.queryFrontend.certSecretName }} - - name: {{ .Values.queryFrontend.certSecretName }} - secret: - defaultMode: 420 - secretName: {{ .Values.queryFrontend.certSecretName }} - {{- end }} - {{- with .Values.queryFrontend.securityContext }} - securityContext: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.queryFrontend.nodeSelector }} - nodeSelector: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.queryFrontend.affinity }} - affinity: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.queryFrontend.tolerations }} - tolerations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.queryFrontend.serviceAccount }} - serviceAccountName: "{{ . }}" - {{- end }} -{{ end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-frontend-horizontalpodautoscaler.yaml b/charts/kubecost/charts/thanos/templates/query-frontend-horizontalpodautoscaler.yaml deleted file mode 100644 index 3d08e459b..000000000 --- a/charts/kubecost/charts/thanos/templates/query-frontend-horizontalpodautoscaler.yaml +++ /dev/null @@ -1,37 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.queryFrontend.enabled }} -{{- if .Values.queryFrontend.autoscaling.enabled }} -apiVersion: autoscaling/v2beta1 -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "thanos.componentname" (list $ "query-frontend") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query-frontend -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "thanos.componentname" (list $ "query-frontend") }} - minReplicas: {{ .Values.queryFrontend.autoscaling.minReplicas }} - maxReplicas: {{ .Values.queryFrontend.autoscaling.maxReplicas }} - metrics: -{{- with .Values.queryFrontend.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - targetAverageUtilization: {{ . }} -{{- end }} -{{- with .Values.queryFrontend.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - targetAverageUtilization: {{ . }} -{{- end }} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-frontend-ingress.yml b/charts/kubecost/charts/thanos/templates/query-frontend-ingress.yml deleted file mode 100644 index 5423cecf2..000000000 --- a/charts/kubecost/charts/thanos/templates/query-frontend-ingress.yml +++ /dev/null @@ -1,45 +0,0 @@ ---- -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.queryFrontend.enabled .Values.queryFrontend.http.ingress.enabled }} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ include "thanos.componentname" (list $ "query-frontend") }}-http - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query-frontend - {{- if .Values.queryFrontend.http.ingress.labels }} - {{ toYaml .Values.queryFrontend.http.ingress.labels | indent 4 }} - {{- end }} - {{- with .Values.queryFrontend.http.ingress.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if .Values.queryFrontend.http.ingress.tls }} - tls: - {{- range .Values.queryFrontend.http.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - {{- if .secretName }} - secretName: {{ .secretName }} - {{- end}} - {{- end }} - {{- end }} - rules: - {{- range .Values.queryFrontend.http.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $.Values.queryFrontend.http.ingress.path }} - backend: - serviceName: {{ include "thanos.componentname" (list $ "query-frontend") }}-http - servicePort: {{ $.Values.queryFrontend.http.port }} - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-frontend-poddisruptionbudget.yaml b/charts/kubecost/charts/thanos/templates/query-frontend-poddisruptionbudget.yaml deleted file mode 100644 index 5cfef4756..000000000 --- a/charts/kubecost/charts/thanos/templates/query-frontend-poddisruptionbudget.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.queryFrontend.enabled .Values.queryFrontend.podDisruptionBudget.enabled }} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ include "thanos.componentname" (list $ "query-frontend") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - {{- if .Values.queryFrontend.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.queryFrontend.podDisruptionBudget.minAvailable }} - {{- end }} - {{- if .Values.queryFrontend.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.queryFrontend.podDisruptionBudget.maxUnavailable }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/component: query-frontend -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-frontend-service.yaml b/charts/kubecost/charts/thanos/templates/query-frontend-service.yaml deleted file mode 100644 index 2521e898a..000000000 --- a/charts/kubecost/charts/thanos/templates/query-frontend-service.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.queryFrontend.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "query-frontend") }}-http - {{- with .Values.queryFrontend.http.service.annotations }} - annotations: {{ toYaml .| nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.http.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: {{ .Values.queryFrontend.http.service.type }} - {{- if .Values.queryFrontend.http.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ .Values.queryFrontend.http.externalTrafficPolicy }} - {{- end }} - ports: - - port: {{ .Values.queryFrontend.http.port }} - targetPort: http - protocol: TCP - name: http - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.http.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-frontend-servicemonitor.yaml b/charts/kubecost/charts/thanos/templates/query-frontend-servicemonitor.yaml deleted file mode 100644 index 004367519..000000000 --- a/charts/kubecost/charts/thanos/templates/query-frontend-servicemonitor.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.queryFrontend.enabled .Values.queryFrontend.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "thanos.componentname" (list $ "query-frontend") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.metrics.serviceMonitor.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - jobLabel: thanos-query - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query-frontend - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - endpoints: - - port: http - interval: {{ .Values.queryFrontend.metrics.serviceMonitor.interval | default "15s" }} - {{- with .Values.queryFrontend.metrics.serviceMonitor.relabellings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-horizontalpodautoscaler.yaml b/charts/kubecost/charts/thanos/templates/query-horizontalpodautoscaler.yaml deleted file mode 100644 index 9b38473d8..000000000 --- a/charts/kubecost/charts/thanos/templates/query-horizontalpodautoscaler.yaml +++ /dev/null @@ -1,37 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.query.enabled }} -{{- if .Values.query.autoscaling.enabled }} -apiVersion: autoscaling/v2beta1 -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "thanos.componentname" (list $ "query") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "thanos.componentname" (list $ "query") }} - minReplicas: {{ .Values.query.autoscaling.minReplicas }} - maxReplicas: {{ .Values.query.autoscaling.maxReplicas }} - metrics: -{{- with .Values.query.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - targetAverageUtilization: {{ . }} -{{- end }} -{{- with .Values.query.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - targetAverageUtilization: {{ . }} -{{- end }} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-ingress.yml b/charts/kubecost/charts/thanos/templates/query-ingress.yml deleted file mode 100644 index cfda4a0e3..000000000 --- a/charts/kubecost/charts/thanos/templates/query-ingress.yml +++ /dev/null @@ -1,89 +0,0 @@ ---- -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.query.enabled .Values.query.http.ingress.enabled }} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ include "thanos.componentname" (list $ "query") }}-http - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query - {{- if .Values.query.http.ingress.labels }} - {{ toYaml .Values.query.http.ingress.labels | indent 4 }} - {{- end }} - {{- with .Values.query.http.ingress.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if .Values.query.http.ingress.tls }} - tls: - {{- range .Values.query.http.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - {{- if .secretName }} - secretName: {{ .secretName }} - {{- end}} - {{- end }} - {{- end }} - rules: - {{- range .Values.query.http.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $.Values.query.http.ingress.path }} - backend: - serviceName: {{ include "thanos.componentname" (list $ "query") }}-http - servicePort: {{ $.Values.query.http.port }} - {{- end }} -{{- end }} - -{{- if and .Values.query.enabled .Values.query.grpc.ingress.enabled }} ---- -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ include "thanos.componentname" (list $ "query") }}-grpc - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query - {{- if .Values.query.grpc.ingress.labels }} - {{ toYaml .Values.grpc.ingress.labels | indent 4 }} - {{- end }} - {{- with .Values.query.grpc.ingress.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if .Values.query.grpc.ingress.tls }} - tls: - {{- range .Values.query.grpc.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - {{- if .secretName }} - secretName: {{ .secretName }} - {{- end}} - {{- end }} - {{- end }} - rules: - {{- range .Values.query.grpc.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $.Values.query.grpc.ingress.path }} - backend: - serviceName: {{ include "thanos.componentname" (list $ "query") }}-grpc - servicePort: {{ $.Values.query.http.port }} - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-poddisruptionbudget.yaml b/charts/kubecost/charts/thanos/templates/query-poddisruptionbudget.yaml deleted file mode 100644 index efc2c817c..000000000 --- a/charts/kubecost/charts/thanos/templates/query-poddisruptionbudget.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.query.enabled .Values.query.podDisruptionBudget.enabled }} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ include "thanos.componentname" (list $ "query") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query -{{ with .Values.query.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - {{- if .Values.query.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.query.podDisruptionBudget.minAvailable }} - {{- end }} - {{- if .Values.query.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.query.podDisruptionBudget.maxUnavailable }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/component: query -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-service.yaml b/charts/kubecost/charts/thanos/templates/query-service.yaml deleted file mode 100644 index 89178a4e1..000000000 --- a/charts/kubecost/charts/thanos/templates/query-service.yaml +++ /dev/null @@ -1,65 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.query.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "query") }}-grpc - {{- with .Values.query.grpc.service.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query -{{ with .Values.query.grpc.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: ClusterIP - clusterIP: None - ports: - - port: {{ .Values.query.grpc.port }} - targetPort: grpc - protocol: TCP - name: grpc - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query -{{ with .Values.query.grpc.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} - ---- - -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "query") }}-http - {{- with .Values.query.http.service.annotations }} - annotations: {{ toYaml .| nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query -{{ with .Values.query.http.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: {{ .Values.query.http.service.type }} - {{- if .Values.query.http.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ .Values.query.http.externalTrafficPolicy }} - {{- end }} - ports: - - port: {{ .Values.query.http.port }} - targetPort: http - protocol: TCP - name: http - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query -{{ with .Values.query.http.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-servicemonitor.yaml b/charts/kubecost/charts/thanos/templates/query-servicemonitor.yaml deleted file mode 100644 index 673445428..000000000 --- a/charts/kubecost/charts/thanos/templates/query-servicemonitor.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.query.enabled .Values.query.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "thanos.componentname" (list $ "query") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query -{{ with .Values.query.metrics.serviceMonitor.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - jobLabel: thanos-query - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - endpoints: - - port: http - interval: {{ .Values.query.metrics.serviceMonitor.interval | default "15s" }} - {{- with .Values.query.metrics.serviceMonitor.relabellings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/sidecar-service.yaml b/charts/kubecost/charts/thanos/templates/sidecar-service.yaml deleted file mode 100644 index 021bdfaf9..000000000 --- a/charts/kubecost/charts/thanos/templates/sidecar-service.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.sidecar.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "sidecar") }}-grpc - {{- with .Values.sidecar.grpc.service.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: sidecar -{{ with .Values.sidecar.grpc.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: ClusterIP - clusterIP: None - ports: - - port: {{ .Values.sidecar.grpc.port }} - protocol: TCP - targetPort: grpc - name: grpc - selector: - app: prometheus -{{ with .Values.sidecar.grpc.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} - ---- - -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "sidecar") }}-http - {{- with .Values.sidecar.http.service.annotations }} - annotations: {{ toYaml .| nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: sidecar -{{ with .Values.store.http.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: {{ .Values.sidecar.http.service.type }} - {{- if .Values.sidecar.http.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ .Values.sidecar.http.externalTrafficPolicy }} - {{- end }} - ports: - - port: {{ .Values.sidecar.http.port }} - targetPort: http - protocol: TCP - name: http - selector: - app: prometheus -{{ with .Values.sidecar.http.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/sidecar-servicemonitor.yaml b/charts/kubecost/charts/thanos/templates/sidecar-servicemonitor.yaml deleted file mode 100644 index 6271a23ca..000000000 --- a/charts/kubecost/charts/thanos/templates/sidecar-servicemonitor.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.sidecar.enabled .Values.sidecar.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "thanos.componentname" (list $ "sidecar") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: sidecar -{{ with .Values.sidecar.metrics.serviceMonitor.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - jobLabel: thanos-sidecar - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: sidecar - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - endpoints: - - port: http - interval: {{ .Values.sidecar.metrics.serviceMonitor.interval | default "15s" }} - {{- with .Values.sidecar.metrics.serviceMonitor.relabellings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/store-deployment.yaml b/charts/kubecost/charts/thanos/templates/store-deployment.yaml deleted file mode 100644 index d8f0d3b1b..000000000 --- a/charts/kubecost/charts/thanos/templates/store-deployment.yaml +++ /dev/null @@ -1,121 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.store.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "thanos.componentname" (list $ "store") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: store -{{ with .Values.store.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end }} - {{- with .Values.store.deploymentAnnotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.store.replicaCount | default 1 }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: store -{{ with .Values.store.deploymentMatchLabels }}{{ toYaml . | indent 6 }}{{ end }} - template: - metadata: - labels: -{{ with .Values.store.labels }}{{ toYaml . | indent 8 }}{{ end }} - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: store - {{- with .Values.store.annotations }} - annotations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.store.metrics.annotations.enabled }} - prometheus.io/scrape: "true" - prometheus.io/port: "{{ .Values.store.http.port }}" - {{- end }} - spec: - containers: - - name: thanos-store - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - args: - - "store" - - "--data-dir=/var/thanos/store" - - "--log.level={{ .Values.store.logLevel }}" - - "--http-address=0.0.0.0:{{ .Values.store.http.port }}" - - "--grpc-address=0.0.0.0:{{ .Values.store.grpc.port }}" - - "--objstore.config-file=/etc/config/object-store.yaml" - {{- if .Values.store.indexCacheSize }} - - "--index-cache-size={{ .Values.store.indexCacheSize }}" - {{- end }} - {{- if .Values.store.chunkPoolSize }} - - "--chunk-pool-size={{ .Values.store.chunkPoolSize }}" - {{- end }} - {{- if .Values.store.grpcSeriesSampleLimit }} - - "--store.grpc.series-sample-limit={{ .Values.store.grpcSeriesSampleLimit }}" - {{- end }} - {{- if .Values.store.grpcSeriesMaxConcurrency }} - - "--store.grpc.series-max-concurrency={{ .Values.store.grpcSeriesMaxConcurrency }}" - {{- end }} - {{- if .Values.store.syncBlockDuration }} - - "--sync-block-duration={{ .Values.store.syncBlockDuration }}" - {{- end }} - {{- if .Values.store.blockSyncConcurrency }} - - "--block-sync-concurrency={{ .Values.store.blockSyncConcurrency }}" - {{- end }} - {{- if .Values.store.extraArgs }} - {{ toYaml .Values.store.extraArgs | nindent 8 }} - {{- end }} - ports: - - name: http - containerPort: {{ .Values.store.http.port }} - - name: grpc - containerPort: {{ .Values.store.grpc.port }} - env: - {{- toYaml .Values.store.extraEnv | nindent 10 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - - name: data - mountPath: /var/thanos/store - {{- if .Values.store.certSecretName }} - - mountPath: /etc/certs - name: {{ .Values.store.certSecretName }} - readOnly: true - {{- end }} - resources: - {{ toYaml .Values.store.resources | nindent 10 }} - volumes: - - name: data - emptyDir: {} - - name: config-volume - secret: - secretName: {{ include "thanos.secretname" . }} - {{- if .Values.store.certSecretName }} - - name: {{ .Values.store.certSecretName }} - secret: - defaultMode: 420 - secretName: {{ .Values.store.certSecretName }} - {{- end }} - {{- with .Values.store.securityContext }} - securityContext: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.store.nodeSelector }} - nodeSelector: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.store.affinity }} - affinity: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.store.tolerations }} - tolerations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.store.serviceAccount }} - serviceAccountName: "{{ . }}" - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/store-ingress.yaml b/charts/kubecost/charts/thanos/templates/store-ingress.yaml deleted file mode 100644 index 4d18c019e..000000000 --- a/charts/kubecost/charts/thanos/templates/store-ingress.yaml +++ /dev/null @@ -1,85 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.store.enabled .Values.store.http.ingress.enabled }} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ include "thanos.componentname" (list $ "store") }}-http - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: store - {{- if .Values.store.http.ingress.labels }} - {{ toYaml .Values.store.http.ingress.labels | indent 4 }} - {{- end }} - {{- with .Values.store.http.ingress.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if .Values.store.http.ingress.tls }} - tls: - {{- range .Values.store.http.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.store.http.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $.Values.store.http.ingress.path }} - backend: - serviceName: {{ include "thanos.componentname" (list $ "store") }}-http - servicePort: {{ $.Values.store.http.port }} - {{- end }} -{{- end }} - ---- - - {{- if and .Values.store.enabled .Values.store.grpc.ingress.enabled }} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ include "thanos.componentname" (list $ "store") }}-grpc - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: store - {{- if .Values.store.grpc.ingress.labels }} - {{ toYaml .Values.grpc.ingress.labels | indent 4 }} - {{- end }} - {{- with .Values.store.grpc.ingress.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if .Values.store.grpc.ingress.tls }} - tls: - {{- range .Values.store.grpc.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.store.grpc.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $.Values.store.grpc.ingress.path }} - backend: - serviceName: {{ include "thanos.componentname" (list $ "store") }}-grpc - servicePort: {{ $.Values.store.http.port }} - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/store-service.yaml b/charts/kubecost/charts/thanos/templates/store-service.yaml deleted file mode 100644 index ce5894fa3..000000000 --- a/charts/kubecost/charts/thanos/templates/store-service.yaml +++ /dev/null @@ -1,65 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.store.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "store") }}-grpc - {{- with .Values.store.grpc.service.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: store -{{ with .Values.store.grpc.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: ClusterIP - clusterIP: None - ports: - - port: {{ .Values.store.grpc.port }} - targetPort: grpc - protocol: TCP - name: grpc - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: store -{{ with .Values.store.grpc.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} - ---- - -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "store") }}-http - {{- with .Values.store.http.service.annotations }} - annotations: {{ toYaml .| nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: store -{{ with .Values.store.http.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: {{ .Values.store.http.service.type }} - {{- if .Values.store.http.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ .Values.store.http.externalTrafficPolicy }} - {{- end }} - ports: - - port: {{ .Values.store.http.port }} - targetPort: http - protocol: TCP - name: http - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: store -{{ with .Values.store.http.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/store-servicemonitor.yaml b/charts/kubecost/charts/thanos/templates/store-servicemonitor.yaml deleted file mode 100644 index c181c6416..000000000 --- a/charts/kubecost/charts/thanos/templates/store-servicemonitor.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.store.enabled .Values.store.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "thanos.componentname" (list $ "store") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: store -{{ with .Values.store.metrics.serviceMonitor.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - jobLabel: thanos-store - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: store - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - endpoints: - - port: http - interval: {{ .Values.store.metrics.serviceMonitor.interval | default "15s" }} - {{- with .Values.store.metrics.serviceMonitor.relabellings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/values.yaml b/charts/kubecost/charts/thanos/values.yaml deleted file mode 100644 index 0a11a2627..000000000 --- a/charts/kubecost/charts/thanos/values.yaml +++ /dev/null @@ -1,739 +0,0 @@ -image: - repository: thanosio/thanos - tag: v0.15.0 - pullPolicy: IfNotPresent - -store: - enabled: true - # Maximum size of items held in the index cache. - indexCacheSize: 250MB - # Maximum size of concurrently allocatable bytes for chunks. - chunkPoolSize: 2GB - # Maximum amount of samples returned via a single series call. 0 means no limit. - # NOTE: for efficiency we take 120 as the number of samples in chunk (it cannot be bigger than that), - # so the actual number of samples might be lower, even though the maximum could be hit. - grpcSeriesSampleLimit: 0 - # Maximum number of concurrent Series calls. - grpcSeriesMaxConcurrency: 20 - # Repeat interval for syncing the blocks between local and remote view. - syncBlockDuration: 3m - # Number of goroutines to use when syncing blocks from object storage. - blockSyncConcurrency: 20 - # Log filtering level. - logLevel: info - # Add extra environment variables to store - extraEnv: [] - # - name: ENV - # value: value - # - # Add extra arguments to the store service - extraArgs: [] - # - "--extraargs=extravalue" - # - # Number of replicas running from store component - replicaCount: 1 - # Extra labels for store pod template - labels: {} - # cluster: example - # - # Extra annotations for store pod template - annotations: {} - # example.com: default - # - # Add extra labels to store deployment - deploymentLabels: {} - # extraLabel: extraLabelValue - # - # Add extra annotations to store deployment - deploymentAnnotations: {} - # extraAnnotation: extraAnnotationValue - # - # Add extra selector matchLabels to store deployment - deploymentMatchLabels: {} - # Enable metrics collecting for store service - metrics: - # This is the Prometheus annotation type scraping configuration - annotations: - enabled: false - # Enable ServiceMonitor https://github.com/coreos/prometheus-operator - serviceMonitor: - enabled: false - # Labels for prometheus-operator to find servicemonitor - labels: {} - # The grpc endpoint to communicate with other components - grpc: - # grpc listen port number - port: 10901 - # Service definition for query grpc service - service: - # Annotations to query grpc service - annotations: {} - # Labels to query grpc service - labels: {} - matchLabels: {} - # Set up ingress for the grpc service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - - # The http endpoint to communicate with other components - http: - # http listen port number - port: 10902 - # Service definition for query http service - service: - type: ClusterIP - # Annotations to query http service - annotations: {} - # Labels to query http service - labels: {} - matchLabels: {} - # Set up ingress for the http service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - # Optional securityContext - securityContext: {} - resources: {} - # limits: - # cpu: 2000m - # memory: 16Gi - # requests: - # cpu: 1000m - # memory: 4Gi - # - # Node tolerations for server scheduling to nodes with taints - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - # - # Node labels for store pod assignment - # Ref: https://kubernetes.io/docs/user-guide/node-selection/ - # - nodeSelector: {} - # - # Pod affinity - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity - affinity: {} - serviceAccount: "" - -# Query Frontend Component -queryFrontend: - enabled: true - - # Split queries by an interval and execute in parallel, 0 disables it. - splitInterval: 24h - - # Maximum number of retries for a single request; beyond this, the downstream error is returned. - maxRetriesPerRequest: 5 - - # Limit the query time range (end - start time) in the query-frontend, 0 disables it. - maxQueryLength: 0 - - # Maximum number of queries will be scheduled in parallel by the frontend.\ - maxQueryParallelism: 14 - - # Most recent allowed cacheable result, to prevent caching very recent results that might still be in flux. - responseCacheMaxFreshness: 1m - - # Path to YAML file that contains response cache configuration. - # responseCacheConfigFile: - - # Response Cache Configuration - responseCache: - enabled: false - maxSize: 512MB - maxSizeItems: 0 - validity: 10m - - # Response cache configuration content - # responseCacheConfig: - - # Enable partial response for queries if no partial_response param is specified. --no-query-range.partial-response for disabling. - # partialResponse: false - - # Compress HTTP responses. - compressResponses: true - - logLevel: info - # Add extra environment variables to query - extraEnv: [] - # - name: ENV - # value: value - # - # Add extra arguments to the query service - extraArgs: [] - # - "--extraargs=extravalue" - # - # Number of replicas running from query component - replicaCount: 1 - # Enable HPA for query component - autoscaling: - enabled: false - minReplicas: 2 - maxReplicas: 3 - targetCPUUtilizationPercentage: 50 - targetMemoryUtilizationPercentage: 50 - # Enable podDisruptionBudget for query component - podDisruptionBudget: - enabled: false - # minAvailable and maxUnavailable can't be used simultaneous. Choose one. - minAvailable: 1 - # maxUnavailable: 50% - - serviceAccount: "" - - # The http endpoint to communicate with other components - http: - # http listen port number - port: 10902 - # Service definition for query http service - service: - type: ClusterIP - # Annotations to query http service - annotations: {} - # Labels to query http service - labels: {} - matchLabels: {} - # Set up ingress for the http service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - - certSecretName: "" - # Extra labels for query pod template - labels: {} - # cluster: example - # - # Extra annotations for query pod template - annotations: {} - # example.com: default - # - # Add extra labels to query deployment - deploymentLabels: {} - # extraLabel: extraLabelValue - # - # Add extra annotations to query deployment - deploymentAnnotations: {} - # extraAnnotation: extraAnnotationValue - # - # Add extra selector matchLabels to query deployment - deploymentMatchLabels: {} - - # Enable metrics collecting for query service - metrics: - # This is the Prometheus annotation type scraping configuration - annotations: - enabled: false - # Enable ServiceMonitor https://github.com/coreos/prometheus-operator - serviceMonitor: - enabled: false - # Labels for prometheus-operator to find servicemonitor - labels: {} - - # Optional securityContext - securityContext: {} - resources: {} - # limits: - # cpu: 2000m - # memory: 16Gi - # requests: - # cpu: 1000m - # memory: 4Gi - # - # Node tolerations for server scheduling to nodes with taints - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - # - # Node labels for compact pod assignment - # Ref: https://kubernetes.io/docs/user-guide/node-selection/ - # - nodeSelector: {} - # - # Pod affinity - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity - affinity: {} - -query: - enabled: true - # Label to treat as a replica indicator along which data is deduplicated. - # Still you will be able to query without deduplication using 'dedup=false' parameter. - replicaLabel: "" - # Prefix for API and UI endpoints. This allows thanos UI to be served on a sub-path. - # This option is analogous to --web.route-prefix of Promethus. - webRoutePrefix: "" - # Static prefix for all HTML links and redirect - # URLs in the UI query web interface. Actual - # endpoints are still served on / or the - # web.route-prefix. This allows thanos UI to be - # served behind a reverse proxy that strips a URL - # sub-path. - webExternalPrefix: "" - # Name of HTTP request header used for dynamic prefixing of UI links and redirects. - # This option is ignored if web.external-prefix argument is set. Security risk: enable this - # option only if a reverse proxy in front of thanos is resetting the header. The --web.prefix-header=X-Forwarded-Prefix option - # can be useful, for example, if Thanos UI is served via Traefik reverse proxy with PathPrefixStrip option enabled, which sends the - # stripped prefix value in X-Forwarded-Prefix header. This allows thanos UI to be served on a sub-path - webPrefixHeader: "" - # Maximum time to process query by query node. - timeout: 2m - # Maximum number of queries processed concurrently by query node. - maxConcurrent: 16 - # Maximum number of select requests made concurrently per a query. - maxConcurrentSelect: 4 - # Enable automatic adjustment (step / 5) to what source of data should be used in store gateways - # if no max_source_resolution param is specified. - autoDownsampling: false - # https://github.com/improbable-eng/thanos/issues/1015 - storeDNSResolver: miekgdns - # Enable DNS discovery for stores - storeDNSDiscovery: true - # Enable DNS discovery for sidecars (this is for the chart built-in sidecar service) - sidecarDNSDiscovery: true - # Addresses of statically configured store API servers (repeatable). - # The scheme may be prefixed with 'dns+' or 'dnssrv+' to detect store API servers through respective DNS lookups. - stores: [] - # - "dnssrv+_grpc._tcp...svc" - # - # Path to files that contains addresses of store API servers. The path can be a glob pattern (repeatable). - serviceDiscoveryFiles: [] - # Names of configmaps that contain addresses of store API servers, used for file service discovery. - serviceDiscoveryFileConfigMaps: [] - # Refresh interval to re-read file SD files. It is used as a resync fallback. - serviceDiscoveryInterval: 5m - # Log filtering level. - logLevel: info - # Add extra environment variables to query - extraEnv: [] - # - name: ENV - # value: value - # - # Add extra arguments to the query service - extraArgs: [] - # - "--extraargs=extravalue" - # - # Number of replicas running from query component - replicaCount: 1 - # Enable HPA for query component - autoscaling: - enabled: false - minReplicas: 2 - maxReplicas: 3 - targetCPUUtilizationPercentage: 50 - targetMemoryUtilizationPercentage: 50 - # Enable podDisruptionBudget for query component - podDisruptionBudget: - enabled: false - # minAvailable and maxUnavailable can't be used simultaneous. Choose one. - minAvailable: 1 - # maxUnavailable: 50% - - # The http endpoint to communicate with other components - http: - # http listen port number - port: 10902 - # Service definition for query http service - service: - type: ClusterIP - # Annotations to query http service - annotations: {} - # Labels to query http service - labels: {} - matchLabels: {} - # Set up ingress for the http service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - - certSecretName: "" - # Extra labels for query pod template - labels: {} - # cluster: example - # - # Extra annotations for query pod template - annotations: {} - # example.com: default - # - # Add extra labels to query deployment - deploymentLabels: {} - # extraLabel: extraLabelValue - # - # Add extra annotations to query deployment - deploymentAnnotations: {} - # extraAnnotation: extraAnnotationValue - # - # Add extra selector matchLabels to query deployment - deploymentMatchLabels: {} - - # Enable metrics collecting for query service - metrics: - # This is the Prometheus annotation type scraping configuration - annotations: - enabled: false - # Enable ServiceMonitor https://github.com/coreos/prometheus-operator - serviceMonitor: - enabled: false - # Labels for prometheus-operator to find servicemonitor - labels: {} - - # Optional securityContext - securityContext: {} - resources: {} - # limits: - # cpu: 2000m - # memory: 16Gi - # requests: - # cpu: 1000m - # memory: 4Gi - # - # Node tolerations for server scheduling to nodes with taints - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - # - # Node labels for compact pod assignment - # Ref: https://kubernetes.io/docs/user-guide/node-selection/ - # - nodeSelector: {} - # - # Pod affinity - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity - affinity: {} - - # The grpc endpoint to communicate with other components - grpc: - # grpc listen port number - port: 10901 - # Service definition for query grpc service - service: - # Annotations to query grpc service - annotations: {} - # labels to query grpc service - labels: {} - matchLabels: {} - # Set up ingress for the grpc service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - serviceAccount: "" - -compact: - enabled: true - # Minimum age of fresh (non-compacted) blocks before they are being processed. - # Malformed blocks older than the maximum of consistency-delay and 30m0s will be removed. - consistencyDelay: 30m - # How long to retain raw samples in bucket. Setting this to 0d will retain samples of this resolution forever - retentionResolutionRaw: 1825d - # How long to retain samples of resolution 1 (5 minutes) in bucket. Setting this to 0d will retain samples of this resolution forever - retentionResolution5m: 1825d - # How long to retain samples of resolution 2 (1 hour) in bucket. Setting this to 0d will retain samples of this resolution forever - retentionResolution1h: 1825d - # Number of goroutines to use when compacting groups. - compactConcurrency: 1 - # Number of goroutines to use when syncing block metadata from object storage. - blockSyncConcurrency: 20 - # Disables Downsampling data - disableDownsampling: false - # Log filtering level. - logLevel: info - # Compact service listening http port - http: - port: 10902 - service: - labels: {} - # Add extra environment variables to compact - extraEnv: - # - name: ENV - # value: value - # - # Add extra arguments to the compact service - extraArgs: - # - "--extraargs=extravalue" - # - # Data volume for the compactor to store temporary data defaults to emptyDir - # dataVolume: - # persistentVolumeClaim: - # claimName: compact-data-volume - # storage: 100Gi - # Extra labels for compact pod template - labels: {} - # cluster: example - # - # Extra annotations for compact pod template - annotations: {} - # example.com: default - # - # Add extra labels to compact deployment - deploymentLabels: {} - # extraLabel: extraLabelValue - # - # Add extra annotations to compact deployment - deploymentAnnotations: {} - # extraAnnotation: extraAnnotationValue - # - # Add extra selector matchLabels to compact deployment - deploymentMatchLabels: {} - # - # Enable metrics collecting for compact service - metrics: - # This is the Prometheus annotation type scraping configuration - annotations: - enabled: false - # Enable ServiceMonitor https://github.com/coreos/prometheus-operator - serviceMonitor: - enabled: false - # Labels for prometheus-operator to find servicemonitor - labels: {} - serviceAccount: "" - - # Optional securityContext - securityContext: {} - resources: {} - # limits: - # cpu: 2000m - # memory: 16Gi - # requests: - # cpu: 1000m - # memory: 4Gi - # - # Node tolerations for server scheduling to nodes with taints - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - # - # Node labels for compact pod assignment - # Ref: https://kubernetes.io/docs/user-guide/node-selection/ - # - nodeSelector: {} - # - # Pod affinity - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity - affinity: {} - -bucket: - enabled: true - # Number of replicas running from bucket component - replicaCount: 1 - # Log filtering level. - logLevel: info - # Refresh interval to download metadata from remote storage - refresh: 30m - # Timeout to download metadata from remote storage - timeout: 5m - # Prometheus label to use as timeline title - label: "" - # The http endpoint to communicate with other components - http: - # http listen port number - port: 8080 - # Service definition for bucket http service - service: - type: ClusterIP - # Annotations to bucket http service - annotations: {} - # Labels to bucket http service - labels: {} - matchLabels: {} - # Set up ingress for the http service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - # Add extra environment variables to bucket - extraEnv: - # - name: ENV - # value: value - # - # Add extra arguments to the bucket service - extraArgs: - # - "--extraargs=extravalue" - # - # Extra labels for bucket pod template - labels: {} - # cluster: example - # - # Extra annotations for bucket pod template - annotations: {} - # example.com: default - # - # Add extra labels to bucket deployment - deploymentLabels: {} - # extraLabel: extraLabelValue - # - # Add extra annotations to bucket deployment - deploymentAnnotations: {} - # - # Add extra selector matchLabels to bucket deployment - deploymentMatchLabels: {} - - # Enable podDisruptionBudget for bucket component - podDisruptionBudget: - enabled: false - # minAvailable and maxUnavailable can't be used simultaneous. Choose one. - minAvailable: 1 - # maxUnavailable: 50% - - # Optional securityContext - securityContext: {} - resources: {} - # limits: - # cpu: 2000m - # memory: 16Gi - # requests: - # cpu: 1000m - # memory: 4Gi - # - # Node tolerations for server scheduling to nodes with taints - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - # - # Node labels for bucket pod assignment - # Ref: https://kubernetes.io/docs/user-guide/node-selection/ - # - nodeSelector: {} - # - # Pod affinity - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity - affinity: {} - serviceAccount: "" - -sidecar: - # NOTE: This is only the service references for the sidecar - enabled: true - # Enable metrics collecting for sidecar service - metrics: - # Enable ServiceMonitor https://github.com/coreos/prometheus-operator - serviceMonitor: - enabled: false - # Labels for prometheus-operator to find servicemonitor - labels: {} - # The grpc endpoint to communicate with other components - grpc: - # grpc listen port number - port: 10901 - # Service definition for sidecar grpc service - service: - # Annotations to sidecar grpc service - annotations: {} - # Labels to sidecar grpc service - labels: {} - matchLabels: {} - # Set up ingress for the grpc service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - - # The http endpoint to communicate with other components - http: - # http listen port number - port: 10902 - # Service definition for sidecar http service - service: - type: ClusterIP - # Annotations to sidecar http service - annotations: {} - # Labels to sidecar http service - labels: {} - matchLabels: {} - # Set up ingress for the http service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -storeSecretName: diff --git a/charts/kubecost/cluster-metrics.json b/charts/kubecost/cluster-metrics.json deleted file mode 100644 index 0e6638252..000000000 --- a/charts/kubecost/cluster-metrics.json +++ /dev/null @@ -1,1663 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "Cost metrics from the Kubecost product", - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": 7, - "iteration": 1558062099204, - "links": [], - "panels": [ - { - "content": "Note: this dashboard requires Kubecost metrics to be available in your Prometheus deployment. [Learn more](https://github.com/kubecost/cost-model/blob/master/PROMETHEUS.md)", - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 27, - "links": [], - "mode": "markdown", - "title": "", - "transparent": true, - "type": "text" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Monthly run rate of CPU + GPU costs based on currently provisioned resources.", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 6, - "x": 0, - "y": 2 - }, - "hideTimeOverride": true, - "id": 2, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "sum(\n avg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100) +\n avg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n)", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "CPU Cost", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Monthly run rate of memory costs based on currently provisioned expenses.", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 6, - "x": 6, - "y": 2 - }, - "hideTimeOverride": true, - "id": 3, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "sum(\n avg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n)", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "Memory Cost", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Monthly run rate of attached storage and PV costs based on currently provisioned resources.", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 6, - "x": 12, - "y": 2 - }, - "hideTimeOverride": true, - "id": 4, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "sum(avg(pv_hourly_cost) by (persistentvolume) * 730 * avg(kube_persistentvolume_capacity_bytes) by (persistentvolume) / 1024 / 1024 / 1024) \n+\nsum(sum(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "Storage Cost", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Sum of compute, memory, storage and network costs.", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 7, - "w": 6, - "x": 18, - "y": 2 - }, - "hideTimeOverride": true, - "id": 11, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "# Compute\nsum(\n avg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100) +\n avg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n) +\n\n\n# Memory\nsum(\n avg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n) +\n\n# Storage \n\nsum(avg(pv_hourly_cost) by (persistentvolume) * 730 * avg(kube_persistentvolume_capacity_bytes) by (persistentvolume) / 1024 / 1024 / 1024) \n+\nsum(sum(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "Total Cost", - "type": "singlestat", - "valueFontSize": "120%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Current CPU use from applications divided by allocatable CPUs", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 0, - "y": 5 - }, - "height": "180px", - "hideTimeOverride": true, - "id": 13, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(\n sum(\n count(irate(container_cpu_usage_seconds_total{id=\"/\"}[10m])) by (instance)\n * on (instance) \n sum(irate(container_cpu_usage_seconds_total{id=\"/\"}[10m])) by (instance)\n ) \n / \n (sum (kube_node_status_allocatable_cpu_cores))\n) * 100", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "30, 80", - "timeFrom": "", - "title": "CPU Utilization", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Current CPU reservation requests from applications vs allocatable CPU", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 3, - "y": 5 - }, - "height": "180px", - "id": 15, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "SUM(kube_pod_container_resource_requests_cpu_cores) / SUM(kube_node_status_allocatable_cpu_cores) * 100", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "30, 80", - "title": "CPU Requests", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource": "default-kubecost", - "description": "Current RAM use vs RAM available", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 6, - "y": 5 - }, - "height": "180px", - "hideTimeOverride": true, - "id": 17, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "SUM(container_memory_usage_bytes{namespace!=\"\"}) / SUM(kube_node_status_allocatable_memory_bytes) * 100", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "refId": "A", - "step": 10 - }, - { - "expr": "", - "format": "time_series", - "intervalFactor": 1, - "refId": "B" - } - ], - "thresholds": "30,80", - "timeFrom": "", - "title": "RAM Utilization", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource": "default-kubecost", - "description": "Current RAM requests vs RAM available", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 9, - "y": 5 - }, - "height": "180px", - "id": 19, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(\n sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\"})\n /\n sum(kube_node_status_allocatable_memory_bytes)\n) * 100", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "30,80", - "title": "RAM Requests", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "This gauge shows the current standard storage use, including cluster storage, vs storage available", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 5 - }, - "height": "180px", - "hideTimeOverride": true, - "id": 21, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum (\n sum(kube_persistentvolumeclaim_info) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kubelet_volume_stats_used_bytes) by (persistentvolumeclaim, namespace) or up * 0\n + sum(container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"})\n) /\nsum (\n sum(kube_persistentvolumeclaim_info) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n + sum(container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"})\n) * 100", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "30, 80", - "timeFrom": "", - "title": "Storage Utilization", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "Monthly run rate of CPU + GPU costs", - "fill": 1, - "gridPos": { - "h": 7, - "w": 6, - "x": 0, - "y": 9 - }, - "id": 6, - "interval": "1m", - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n avg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 +\n avg(node_gpu_hourly_cost) by (node) * 730\n)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "compute cost", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Compute Cost", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "currencyUSD", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "Monthly run rate of memory costs", - "fill": 1, - "gridPos": { - "h": 7, - "w": 6, - "x": 6, - "y": 9 - }, - "id": 9, - "interval": "1m", - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n avg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730\n)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "memory cost", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Memory Cost", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "currencyUSD", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "Monthly run rate of attached disk + PV storage costs", - "fill": 1, - "gridPos": { - "h": 7, - "w": 6, - "x": 12, - "y": 9 - }, - "id": 10, - "interval": "1m", - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n avg(avg_over_time(pv_hourly_cost[$timeRange] offset 1m)) by (persistentvolume) * 730 \n * avg(avg_over_time(kube_persistentvolume_capacity_bytes[$timeRange] offset 1m)) by (persistentvolume) / 1024 / 1024 / 1024\n) +\nsum(avg(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "storage cost", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Storage Cost", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "Sum of compute, memory, and storage costs", - "fill": 1, - "gridPos": { - "h": 7, - "w": 6, - "x": 18, - "y": 9 - }, - "id": 22, - "interval": "1m", - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "# Compute\nsum(\n avg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100) +\n avg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n) +\n\n\n# Memory\nsum(\n avg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n) +\n\n# Storage \n\nsum(avg(pv_hourly_cost) by (persistentvolume) * 730 * avg(kube_persistentvolume_capacity_bytes) by (persistentvolume) / 1024 / 1024 / 1024) \n+\nsum(sum(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "total cost", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Total Cost", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "columns": [], - "datasource": "default-kubecost", - "description": "Cost of by resource class of currently provisioned nodes", - "fontSize": "100%", - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 8, - "links": [], - "pageSize": null, - "scroll": true, - "showHeader": true, - "sort": { - "col": 4, - "desc": false - }, - "styles": [ - { - "alias": "", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Time", - "thresholds": [], - "type": "hidden", - "unit": "short" - }, - { - "alias": "Compute Cost", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Cost", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #A", - "thresholds": [], - "type": "number", - "unit": "currencyUSD" - }, - { - "alias": "Mem Cost", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #B", - "thresholds": [], - "type": "number", - "unit": "currencyUSD" - }, - { - "alias": "Total", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #C", - "thresholds": [], - "type": "number", - "unit": "currencyUSD" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "instance", - "thresholds": [], - "type": "hidden", - "unit": "short" - }, - { - "alias": "GPU", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #D", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "decimals": 2, - "pattern": "/.*/", - "thresholds": [], - "type": "number", - "unit": "short" - } - ], - "targets": [ - { - "expr": "avg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost or up * 0) by (node) * 730 * (1-$useDiscount/100)", - "format": "table", - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - }, - { - "expr": "avg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)", - "format": "table", - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "refId": "B" - }, - { - "expr": "avg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100)", - "format": "table", - "instant": true, - "intervalFactor": 1, - "refId": "D" - }, - { - "expr": "# CPU \navg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost or up * 0) by (node) * 730 * (1-$useDiscount/100) +\n# GPU\navg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100) +\n# Memory\navg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n", - "format": "table", - "instant": true, - "intervalFactor": 1, - "refId": "C" - } - ], - "title": "Cost by node", - "transform": "table", - "type": "table" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "Monthly run rate of attached disk + PV storage costs based on currently provisioned resources.", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 25, - "interval": "1m", - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n avg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 +\n avg(node_gpu_hourly_cost) by (node) * 730\n)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "cpu", - "refId": "B" - }, - { - "expr": "sum(\n avg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730\n)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "memory", - "refId": "A" - }, - { - "expr": "sum(\n avg(avg_over_time(pv_hourly_cost[$timeRange] offset 1m)) by (persistentvolume) * 730 \n * avg(avg_over_time(kube_persistentvolume_capacity_bytes[$timeRange] offset 1m)) by (persistentvolume) / 1024 / 1024 / 1024\n) +\nsum(avg(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "storage", - "refId": "C" - }, - { - "expr": "SUM(rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]) / 1024 / 1024 / 1024 ) * (60 * 60 * 24 * 30) * $percentEgress * $egressCost ", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "network", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Cost by Resource", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "currencyUSD", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 16, - "style": "dark", - "tags": [ - "cost", - "utilization", - "metrics" - ], - "templating": { - "list": [ - { - "auto": true, - "auto_count": 1, - "auto_min": "1m", - "current": { - "text": "auto", - "value": "$__auto_interval_timeRange" - }, - "hide": 2, - "label": null, - "name": "timeRange", - "options": [ - { - "selected": true, - "text": "auto", - "value": "$__auto_interval_timeRange" - }, - { - "selected": false, - "text": "1h", - "value": "1h" - }, - { - "selected": false, - "text": "6h", - "value": "6h" - }, - { - "selected": false, - "text": "12h", - "value": "12h" - }, - { - "selected": false, - "text": "1d", - "value": "1d" - }, - { - "selected": false, - "text": "7d", - "value": "7d" - }, - { - "selected": false, - "text": "14d", - "value": "14d" - }, - { - "selected": false, - "text": "30d", - "value": "30d" - }, - { - "selected": false, - "text": "90d", - "value": "90d" - } - ], - "query": "1h,6h,12h,1d,7d,14d,30d,90d", - "refresh": 2, - "skipUrlSync": false, - "type": "interval" - }, - { - "current": { - "text": ".04", - "value": ".04" - }, - "hide": 2, - "label": "Cost per Gb hour for attached disks", - "name": "localStorageGBCost", - "options": [ - { - "selected": true, - "text": ".04", - "value": ".04" - } - ], - "query": ".04", - "skipUrlSync": false, - "type": "constant" - }, - { - "current": { - "tags": [], - "text": "0", - "value": "0" - }, - "hide": 0, - "label": "Sustained Use Discount %", - "name": "useDiscount", - "options": [ - { - "selected": true, - "text": "0", - "value": "0" - } - ], - "query": "0", - "skipUrlSync": false, - "type": "constant" - }, - { - "current": { - "text": ".1", - "value": ".1" - }, - "hide": 2, - "label": null, - "name": "percentEgress", - "options": [ - { - "selected": true, - "text": ".1", - "value": ".1" - } - ], - "query": ".1", - "skipUrlSync": false, - "type": "constant" - }, - { - "current": { - "text": ".12", - "value": ".12" - }, - "hide": 2, - "label": null, - "name": "egressCost", - "options": [ - { - "selected": true, - "text": ".12", - "value": ".12" - } - ], - "query": ".12", - "skipUrlSync": false, - "type": "constant" - } - ] - }, - "time": { - "from": "now-7d", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "", - "title": "Kubecost cluster metrics", - "uid": "JOUdHGZZz", - "version": 20 -} diff --git a/charts/kubecost/cluster-utilization.json b/charts/kubecost/cluster-utilization.json deleted file mode 100644 index 0c3acfc76..000000000 --- a/charts/kubecost/cluster-utilization.json +++ /dev/null @@ -1,3473 +0,0 @@ -{ - "annotations":{ - "list":[ - { - "builtIn":1, - "datasource":"-- Grafana --", - "enable":true, - "hide":true, - "iconColor":"rgba(0, 211, 255, 1)", - "name":"Annotations & Alerts", - "type":"dashboard" - } - ] - }, - "description":"A dashboard to help manage Kubernetes cluster costs and resources", - "editable":true, - "gnetId":6873, - "graphTooltip":0, - "id":4, - "iteration":1556759633456, - "links":[ - - ], - "panels":[ - { - "content":"This dashboard shows monthly cost estimates for the cluster, based on **current** CPU, RAM and storage provisioned.", - "gridPos":{ - "h":2, - "w":24, - "x":0, - "y":0 - }, - "id":86, - "links":[ - - ], - "mode":"markdown", - "title":"", - "transparent":true, - "type":"text" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "decimals":2, - "format":"currencyUSD", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":6, - "x":0, - "y":2 - }, - "hideTimeOverride":true, - "id":75, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"label_cloud_google_com_gke_preemptible", - "targets":[ - { - "expr":"sum(\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) * $costpcpu\n )\n or\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) * ($costcpu - ($costcpu / 100 * $costDiscount))\n )\n) ", - "format":"time_series", - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":" {{ node }}", - "refId":"A" - } - ], - "thresholds":"", - "timeFrom":"15m", - "timeShift":null, - "title":"CPU Cost", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "decimals":2, - "format":"currencyUSD", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":6, - "x":6, - "y":2 - }, - "hideTimeOverride":true, - "id":77, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"label_cloud_google_com_gke_preemptible", - "targets":[ - { - "expr":"sum(\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) /1024/1024/1024 * $costpram\n )\n or\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) /1024/1024/1024 * ($costram - ($costram / 100 * $costDiscount))\n)\n) ", - "format":"time_series", - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":" {{ node }}", - "refId":"A" - } - ], - "thresholds":"", - "timeFrom":"15m", - "timeShift":null, - "title":"RAM Cost", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "decimals":2, - "format":"currencyUSD", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":6, - "x":12, - "y":2 - }, - "hideTimeOverride":true, - "id":78, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"label_cloud_google_com_gke_preemptible", - "targets":[ - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageSSD\n\n+\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageStandard\n\n+ \n\nsum(container_fs_limit_bytes{id=\"/\"}) / 1024 / 1024 / 1024 * 1.03 * $costStorageStandard", - "format":"time_series", - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":" {{ node }}", - "refId":"A" - } - ], - "thresholds":"", - "timeFrom":"15m", - "timeShift":null, - "title":"Storage Cost (Cluster and PVC)", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "decimals":2, - "description":"Represents a near worst-case approximation of network costs.", - "format":"currencyUSD", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":6, - "x":18, - "y":2 - }, - "hideTimeOverride":true, - "id":129, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"label_cloud_google_com_gke_preemptible", - "targets":[ - { - "expr":"SUM(rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]) / 1024 / 1024 / 1024 ) * (60 * 60 * 24 * 30) * $costEgress", - "format":"time_series", - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":" {{ node }}", - "refId":"A" - } - ], - "thresholds":"", - "timeFrom":"15m", - "timeShift":null, - "title":"Network Egress Cost", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":true, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource":"default-kubecost", - "decimals":2, - "description":"Current CPU use from applications divided by allocatable CPUs", - "editable":true, - "error":false, - "format":"percent", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":3, - "x":0, - "y":6 - }, - "height":"180px", - "hideTimeOverride":true, - "id":82, - "interval":null, - "isNew":true, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"(\n sum(\n count(irate(container_cpu_usage_seconds_total{id=\"/\"}[10m])) by (instance)\n * on (instance) \n sum(irate(container_cpu_usage_seconds_total{id=\"/\"}[10m])) by (instance)\n ) \n / \n (sum (kube_node_status_allocatable_cpu_cores))\n) * 100", - "format":"time_series", - "interval":"", - "intervalFactor":1, - "refId":"A", - "step":10 - } - ], - "thresholds":"30, 80", - "timeFrom":"", - "title":"CPU Utilization", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":true, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource":"default-kubecost", - "decimals":2, - "description":"Current CPU reservation requests from applications vs allocatable CPU", - "editable":true, - "error":false, - "format":"percent", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":3, - "x":3, - "y":6 - }, - "height":"180px", - "id":91, - "interval":null, - "isNew":true, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"SUM(kube_pod_container_resource_requests_cpu_cores) / SUM(kube_node_status_allocatable_cpu_cores) * 100", - "format":"time_series", - "interval":"", - "intervalFactor":1, - "refId":"A", - "step":10 - } - ], - "thresholds":"30, 80", - "title":"CPU Requests", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":true, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource":"default-kubecost", - "description":"Current RAM use vs RAM available", - "editable":true, - "error":false, - "format":"percent", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":3, - "x":6, - "y":6 - }, - "height":"180px", - "hideTimeOverride":true, - "id":80, - "interval":null, - "isNew":true, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"SUM(container_memory_usage_bytes{namespace!=\"\"}) / SUM(kube_node_status_allocatable_memory_bytes) * 100", - "format":"time_series", - "interval":"", - "intervalFactor":1, - "refId":"A", - "step":10 - }, - { - "expr":"", - "format":"time_series", - "intervalFactor":1, - "refId":"B" - } - ], - "thresholds":"30,80", - "timeFrom":"", - "title":"RAM Utilization", - "transparent":false, - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":true, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource":"default-kubecost", - "description":"Current RAM requests vs RAM available", - "editable":true, - "error":false, - "format":"percent", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":3, - "x":9, - "y":6 - }, - "height":"180px", - "id":92, - "interval":null, - "isNew":true, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"(\n sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\"})\n /\n sum(kube_node_status_allocatable_memory_bytes)\n) * 100", - "format":"time_series", - "interval":"", - "intervalFactor":1, - "refId":"A", - "step":10 - } - ], - "thresholds":"30,80", - "title":"RAM Requests", - "transparent":false, - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":true, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource":"default-kubecost", - "decimals":2, - "description":"This gauge shows the current standard storage use, including cluster storage, vs storage available", - "editable":true, - "error":false, - "format":"percent", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":3, - "x":12, - "y":6 - }, - "height":"180px", - "hideTimeOverride":true, - "id":95, - "interval":null, - "isNew":true, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kubelet_volume_stats_used_bytes) by (persistentvolumeclaim, namespace) or up * 0\n + sum(container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"})\n) /\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n + sum(container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"})\n) * 100", - "format":"time_series", - "interval":"", - "intervalFactor":1, - "refId":"A", - "step":10 - } - ], - "thresholds":"30, 80", - "timeFrom":"", - "title":"Storage Utilization", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":true, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource":"default-kubecost", - "decimals":2, - "description":"This gauge shows the current SSD use vs SSD available", - "editable":true, - "error":false, - "format":"percent", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":3, - "x":15, - "y":6 - }, - "height":"180px", - "hideTimeOverride":true, - "id":96, - "interval":null, - "isNew":true, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kubelet_volume_stats_used_bytes) by (persistentvolumeclaim, namespace)\n) /\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace)\n) * 100", - "format":"time_series", - "interval":"", - "intervalFactor":1, - "refId":"A", - "step":10 - } - ], - "thresholds":"30, 80", - "timeFrom":"", - "title":"SSD Utilization", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "decimals":2, - "description":"Expected monthly cost given current CPU, memory storage, and network resource consumption", - "format":"currencyUSD", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":6, - "x":18, - "y":6 - }, - "hideTimeOverride":true, - "id":93, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"label_cloud_google_com_gke_preemptible", - "targets":[ - { - "expr":"# CPU\nsum(\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) * $costpcpu\n )\n or\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) * ($costcpu - ($costcpu / 100 * $costDiscount))\n )\n) \n\n+ \n\n# Storage\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageSSD\n\n+\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageStandard\n\n+ \n\nsum(container_fs_limit_bytes{id=\"/\"}) / 1024 / 1024 / 1024 * 1.03 * $costStorageStandard \n\n+\n\n# END STORAGE\n# RAM \nsum(\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) /1024/1024/1024 * $costpram\n )\n or\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) /1024/1024/1024 * ($costram - ($costram / 100 * $costDiscount))\n)\n)\n\n+\n\n#Network \nSUM(rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]) / 1024 / 1024 / 1024 ) * (60 * 60 * 24 * 30) * $costEgress", - "format":"time_series", - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":" {{ node }}", - "refId":"A" - } - ], - "thresholds":"", - "timeFrom":"15m", - "timeShift":null, - "title":"Total Monthly Cost", - "type":"singlestat", - "valueFontSize":"120%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "description":"Expected monthly CPU, memory and storage costs given provisioned resources", - "fill":1, - "gridPos":{ - "h":8, - "w":12, - "x":0, - "y":10 - }, - "id":120, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":false, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"# CPU\nsum(\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) * $costpcpu\n )\n or\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) * ($costcpu - ($costcpu / 100 * $costDiscount))\n )\n) \n\n+ \n\n# Storage\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageSSD\n\n+\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageStandard\n\n+ \n\nsum(container_fs_limit_bytes{id=\"/\"}) / 1024 / 1024 / 1024 * 1.03 * $costStorageStandard \n\n+\n\n# END STORAGE\n# RAM \nsum(\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) /1024/1024/1024 * $costpram\n )\n or\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) /1024/1024/1024 * ($costram - ($costram / 100 * $costDiscount))\n)\n) \n\n+\n\n#Network \nSUM(rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]) / 1024 / 1024 / 1024 ) * (60 * 60 * 24 * 30) * $costEgress", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"cluster cost", - "refId":"A" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Total monthly cost", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"currencyUSD", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "description":"Resources allocated to namespace based on container requests", - "fontSize":"100%", - "gridPos":{ - "h":8, - "w":12, - "x":12, - "y":10 - }, - "hideTimeOverride":false, - "id":73, - "links":[ - - ], - "pageSize":10, - "repeat":null, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":7, - "desc":true - }, - "styles":[ - { - "alias":"Namespace", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "link":true, - "linkTooltip":"View namespace cost metrics", - "linkUrl":"d/at-cost-analysis-namespace2/namespace-cost-metrics?&var-namespace=$__cell", - "pattern":"namespace", - "thresholds":[ - "30", - "80" - ], - "type":"string", - "unit":"currencyUSD" - }, - { - "alias":"RAM", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "pattern":"Value #B", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"CPU", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"PV Storage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"Total", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #D", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"CPU Utilization", - "colorMode":"value", - "colors":[ - "#bf1b00", - "rgba(50, 172, 45, 0.97)", - "#ef843c" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #E", - "thresholds":[ - "30", - "80" - ], - "type":"number", - "unit":"percent" - }, - { - "alias":"RAM Utilization", - "colorMode":"value", - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#ef843c" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #F", - "thresholds":[ - "30", - "80" - ], - "type":"number", - "unit":"percent" - } - ], - "targets":[ - { - "expr":"(\n sum(kube_pod_container_resource_requests_cpu_cores{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible!=\"true\"}*($costcpu - ($costcpu / 100 * $costDiscount))) by(namespace)\n or\n count(\n count(container_spec_cpu_shares{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n(\n sum(kube_pod_container_resource_requests_cpu_cores{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible=\"true\"}*$costpcpu) by(namespace)\n or\n count(\n count(container_spec_cpu_shares{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"{{ namespace }}", - "refId":"A" - }, - { - "expr":"(\n sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible!=\"true\"} / 1024 / 1024 / 1024*($costram- ($costram / 100 * $costDiscount))) by (namespace) \n or\n count(\n count(container_spec_memory_limit_bytes{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n(\n sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible=\"true\"} / 1024 / 1024 / 1024 * $costpram ) by (namespace) \n or\n count(\n count(container_spec_memory_limit_bytes{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)", - "format":"table", - "instant":true, - "intervalFactor":1, - "legendFormat":"{{ namespace }}", - "refId":"B" - }, - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) \n) by (namespace) / 1024 / 1024 /1024 * $costStorageSSD \n\nor\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) \n) by (namespace) / 1024 / 1024 /1024 * $costStorageStandard", - "format":"table", - "instant":true, - "intervalFactor":1, - "legendFormat":"{{ namespace }}", - "refId":"C" - }, - { - "expr":"# CPU \n(\n sum(kube_pod_container_resource_requests_cpu_cores{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible!=\"true\"}*($costcpu - ($costcpu / 100 * $costDiscount))) by(namespace)\n or\n count(\n count(container_spec_cpu_shares{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n(\n sum(kube_pod_container_resource_requests_cpu_cores{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible=\"true\"}*$costpcpu) by(namespace)\n or\n count(\n count(container_spec_cpu_shares{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n#END CPU \n# Memory \n\n(\n sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible!=\"true\"} / 1024 / 1024 / 1024*($costram- ($costram / 100 * $costDiscount))) by (namespace) \n or\n count(\n count(container_spec_memory_limit_bytes{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n(\n sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible=\"true\"} / 1024 / 1024 / 1024 * $costpram ) by (namespace) \n or\n count(\n count(container_spec_memory_limit_bytes{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n# PV storage\n\n(\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) \n) by (namespace) / 1024 / 1024 /1024 * $costStorageSSD \n\nor\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) \n) by (namespace) / 1024 / 1024 /1024 * $costStorageStandard \n)", - "format":"table", - "instant":true, - "intervalFactor":1, - "legendFormat":"Total", - "refId":"D" - } - ], - "timeFrom":"", - "timeShift":null, - "title":"Namespace cost allocation", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "collapsed":false, - "gridPos":{ - "h":1, - "w":24, - "x":0, - "y":18 - }, - "id":108, - "panels":[ - - ], - "title":"CPU Metrics", - "type":"row" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":8, - "w":24, - "x":0, - "y":19 - }, - "id":116, - "legend":{ - "alignAsTable":false, - "avg":false, - "current":false, - "max":false, - "min":false, - "rightSide":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"SUM(kube_node_status_capacity_cpu_cores)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"capacity", - "refId":"A" - }, - { - "expr":"SUM(kube_pod_container_resource_requests_cpu_cores)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"requests", - "refId":"C" - }, - { - "expr":"SUM(irate(container_cpu_usage_seconds_total{id=\"/\"}[5m]))", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"usage", - "refId":"B" - }, - { - "expr":"SUM(kube_pod_container_resource_limits_cpu_cores) ", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"limits", - "refId":"D" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Cluster CPUs", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "decimals":1, - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":8, - "w":24, - "x":0, - "y":27 - }, - "id":130, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"avg(irate(node_cpu_seconds_total{mode!=\"idle\"}[5m])) by (mode) * 100", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"{{mode}}", - "refId":"A" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"CPU Mode", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"percent", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"percent", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "description":"This table shows the comparison of CPU requests and usage by namespace", - "fontSize":"100%", - "gridPos":{ - "h":10, - "w":12, - "x":0, - "y":35 - }, - "hideTimeOverride":true, - "id":104, - "links":[ - - ], - "pageSize":8, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":1, - "desc":true - }, - "styles":[ - { - "alias":"CPU Requests", - "colorMode":null, - "colors":[ - "#fceaca", - "#fce2de", - "rgba(245, 54, 54, 0.9)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - "" - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Node", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"node", - "thresholds":[ - - ], - "type":"string", - "unit":"short" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"CPU Requests", - "colorMode":"value", - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#cffaff" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - "" - ], - "type":"number", - "unit":"short" - }, - { - "alias":"24h CPU Usage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - "30" - ], - "type":"number", - "unit":"none" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "link":true, - "linkTooltip":"View namespace cost metrics", - "linkUrl":"d/at-cost-analysis-namespace2/namespace-cost-metrics?&var-namespace=$__cell", - "mappingType":1, - "pattern":"namespace", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - } - ], - "targets":[ - { - "expr":"sum(kube_pod_container_resource_requests_cpu_cores{namespace!=\"\"}) by (namespace) ", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"", - "refId":"A" - }, - { - "expr":"sum (rate (container_cpu_usage_seconds_total{image!=\"\",namespace!=\"\"}[24h])) by (namespace)", - "format":"table", - "instant":true, - "intervalFactor":1, - "legendFormat":"{{ namespace }}", - "refId":"C" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"CPU request utilization by namespace", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "description":"This table shows the comparison of application CPU usage vs the capacity of the node (measured over last 60 minutes)", - "fontSize":"100%", - "gridPos":{ - "h":10, - "w":12, - "x":12, - "y":35 - }, - "hideTimeOverride":true, - "id":90, - "links":[ - - ], - "pageSize":8, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":2, - "desc":true - }, - "styles":[ - { - "alias":"CPU Request Utilization", - "colorMode":"value", - "colors":[ - "#ef843c", - "rgba(50, 172, 45, 0.97)", - "rgba(245, 54, 54, 0.9)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - ".30", - " .80" - ], - "type":"number", - "unit":"percentunit" - }, - { - "alias":"Node", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"node", - "thresholds":[ - - ], - "type":"string", - "unit":"short" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"CPU Utilization", - "colorMode":"value", - "colors":[ - "#ef843c", - "rgba(50, 172, 45, 0.97)", - "rgba(245, 54, 54, 0.9)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - ".20", - " .80" - ], - "type":"number", - "unit":"percentunit" - }, - { - "alias":"24h Utilization ", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value", - "thresholds":[ - - ], - "type":"number", - "unit":"percentunit" - } - ], - "targets":[ - { - "expr":"SUM(\nSUM(rate(container_cpu_usage_seconds_total[24h])) by (pod_name)\n* on (pod_name) group_left (node) \nlabel_replace(\n avg(kube_pod_info{}),\n \"pod_name\", \n \"$1\", \n \"pod\", \n \"(.+)\"\n)\n) by (node) \n/ \nsum(kube_node_status_capacity_cpu_cores) by (node)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"B" - }, - { - "expr":"sum(kube_pod_container_resource_requests_cpu_cores) by (node) / sum(kube_node_status_capacity_cpu_cores) by (node)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"A" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"Cluster cost & utilization by node", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "collapsed":false, - "gridPos":{ - "h":1, - "w":24, - "x":0, - "y":45 - }, - "id":113, - "panels":[ - - ], - "title":"Memory Metrics", - "type":"row" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":8, - "w":24, - "x":0, - "y":46 - }, - "id":117, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":false, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"SUM(kube_node_status_capacity_memory_bytes / 1024 / 1024 / 1024)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"capacity", - "refId":"A" - }, - { - "expr":"SUM(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\"} / 1024 / 1024 / 1024)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"requests", - "refId":"C" - }, - { - "expr":"SUM(container_memory_usage_bytes{image!=\"\"} / 1024 / 1024 / 1024)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"usage", - "refId":"B" - }, - { - "expr":"SUM(kube_pod_container_resource_limits_memory_bytes {namespace!=\"\"} / 1024 / 1024 / 1024)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"limits", - "refId":"D" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Cluster memory (GB)", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"decgbytes", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":8, - "w":24, - "x":0, - "y":54 - }, - "id":131, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":false, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"1 - sum(node_memory_MemAvailable_bytes) by (node) / sum(node_memory_MemTotal_bytes) by (node)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"usage", - "refId":"A" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Cluster Memory Utilization", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"percentunit", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "description":"Comparison of memory requests and current usage by namespace", - "fontSize":"100%", - "gridPos":{ - "h":10, - "w":12, - "x":0, - "y":62 - }, - "hideTimeOverride":true, - "id":109, - "links":[ - - ], - "pageSize":7, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":1, - "desc":true - }, - "styles":[ - { - "alias":"Mem Requests (GB)", - "colorMode":null, - "colors":[ - "#fceaca", - "#fce2de", - "rgba(245, 54, 54, 0.9)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - "" - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Node", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"node", - "thresholds":[ - - ], - "type":"string", - "unit":"short" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"CPU Requests", - "colorMode":"value", - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#cffaff" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - "" - ], - "type":"number", - "unit":"short" - }, - { - "alias":"24h Mem Usage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "#508642", - "#e5ac0e" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - ".30", - ".75" - ], - "type":"number", - "unit":"none" - }, - { - "alias":"Namespace", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "link":true, - "linkTooltip":"View namespace cost metrics", - "linkUrl":"d/at-cost-analysis-namespace2/namespace-cost-metrics?&var-namespace=$__cell", - "mappingType":1, - "pattern":"namespace", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - } - ], - "targets":[ - { - "expr":"sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\"} / 1024 / 1024 / 1024) by (namespace) ", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"", - "refId":"A" - }, - { - "expr":"SUM(container_memory_usage_bytes{image!=\"\",namespace!=\"\"} / 1024 / 1024 / 1024) by (namespace)", - "format":"table", - "instant":true, - "intervalFactor":1, - "legendFormat":"", - "refId":"C" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"Memory requests & utilization by namespace", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "description":"Container RAM usage vs node capacity", - "fontSize":"100%", - "gridPos":{ - "h":10, - "w":12, - "x":12, - "y":62 - }, - "hideTimeOverride":true, - "id":114, - "links":[ - - ], - "pageSize":8, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":1, - "desc":true - }, - "styles":[ - { - "alias":"RAM Requests", - "colorMode":"value", - "colors":[ - "#ef843c", - "rgba(50, 172, 45, 0.97)", - "rgba(245, 54, 54, 0.9)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - "30", - " 80" - ], - "type":"number", - "unit":"percentunit" - }, - { - "alias":"Node", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"node", - "thresholds":[ - - ], - "type":"string", - "unit":"short" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"RAM Usage", - "colorMode":"value", - "colors":[ - "#ef843c", - "rgba(50, 172, 45, 0.97)", - "rgba(245, 54, 54, 0.9)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - "25", - " 80" - ], - "type":"number", - "unit":"percent" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - } - ], - "targets":[ - { - "expr":"SUM(label_replace(container_memory_usage_bytes{namespace!=\"\"}, \"node\", \"$1\", \"instance\",\"(.+)\")) by (node) * 100\n/\nSUM(kube_node_status_capacity_memory_bytes) by (node)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"B" - }, - { - "expr":"sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\"}) by (node) / SUM(kube_node_status_capacity_memory_bytes) by (node)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"A" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"Node utilization of allocatable RAM", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "collapsed":false, - "gridPos":{ - "h":1, - "w":24, - "x":0, - "y":72 - }, - "id":101, - "panels":[ - - ], - "title":"Storage Metrics", - "type":"row" - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "fontSize":"100%", - "gridPos":{ - "h":9, - "w":12, - "x":0, - "y":73 - }, - "hideTimeOverride":true, - "id":97, - "links":[ - - ], - "pageSize":8, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":4, - "desc":true - }, - "styles":[ - { - "alias":"Node", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"instance", - "thresholds":[ - - ], - "type":"string", - "unit":"short" - }, - { - "alias":"PVC Name", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"persistentvolumeclaim", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Storage Class", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"storageclass", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Cost", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"Cost", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"Size (GB)", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Usage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - - ], - "type":"number", - "unit":"percentunit" - } - ], - "targets":[ - { - "expr":"SUM(container_fs_limit_bytes{id=\"/\"}) by (instance) / 1024 / 1024 / 1024 * 1.03", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"B" - }, - { - "expr":"SUM(container_fs_limit_bytes{id=\"/\"}) by (instance) / 1024 / 1024 / 1024 * 1.03 * $costStorageStandard\n", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"{{ persistentvolumeclaim }}", - "refId":"A" - }, - { - "expr":"sum(container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"} / container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"}) by (instance) \n", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"C" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"Local Storage", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":9, - "w":12, - "x":12, - "y":73 - }, - "id":128, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"SUM(container_fs_usage_bytes{id=\"/\"}) / SUM(container_fs_limit_bytes{id=\"/\"})", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"reads", - "refId":"D" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Local storage utilization", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"percent", - "label":"IOPS", - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "fontSize":"100%", - "gridPos":{ - "h":10, - "w":12, - "x":0, - "y":82 - }, - "hideTimeOverride":true, - "id":94, - "links":[ - - ], - "pageSize":10, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":2, - "desc":true - }, - "styles":[ - { - "alias":"Namespace", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "link":true, - "linkTooltip":"View namespace cost metrics", - "linkUrl":"d/at-cost-analysis-namespace2/namespace-cost-metrics?&var-namespace=$__cell", - "mappingType":1, - "pattern":"namespace", - "thresholds":[ - - ], - "type":"string", - "unit":"short" - }, - { - "alias":"PVC Name", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"persistentvolumeclaim", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Storage Class", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"storageclass", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Cost", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"Cost", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"Usage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - - ], - "type":"number", - "unit":"percentunit" - }, - { - "alias":"Size (GB)", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - } - ], - "targets":[ - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024\n\nor\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024\n\n\n", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"C" - }, - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024 * $costStorageSSD\n\nor\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024 * $costStorageStandard\n", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"{{ persistentvolumeclaim }}", - "refId":"A" - }, - { - "expr":"sum(kubelet_volume_stats_used_bytes) by (persistentvolumeclaim, namespace) \n/\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"B" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"Persistent Volume Claims", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":10, - "w":12, - "x":12, - "y":82 - }, - "id":132, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"SUM(rate(node_disk_reads_completed_total[10m])) or SUM(rate(node_disk_reads_completed[10m]))\n", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"reads", - "refId":"D" - }, - { - "expr":"SUM(rate(node_disk_writes_completed_total[10m])) or SUM(rate(node_disk_writes_completed[10m]))", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"writes", - "refId":"A" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Disk IOPS", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"none", - "label":"IOPS", - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":9, - "w":24, - "x":0, - "y":92 - }, - "id":122, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"SUM( kubelet_volume_stats_inodes_used / kubelet_volume_stats_inodes) by (persistentvolumeclaim) * 100", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"", - "refId":"D" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Inode usage", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"percent", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "collapsed":false, - "gridPos":{ - "h":1, - "w":24, - "x":0, - "y":101 - }, - "id":127, - "panels":[ - - ], - "title":"Network", - "type":"row" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":9, - "w":24, - "x":0, - "y":102 - }, - "id":123, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"sum (rate (node_network_transmit_bytes_total{}[60m]))\n", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"node_out", - "refId":"B" - }, - { - "expr":"SUM ( rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]))", - "format":"time_series", - "instant":false, - "intervalFactor":1, - "legendFormat":"eth0 out", - "refId":"C" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Node network transmit", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"decbytes", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - } - ], - "refresh":"15m", - "schemaVersion":16, - "style":"dark", - "tags":[ - "cost", - "utilization", - "metrics" - ], - "templating":{ - "list":[ - { - "current":{ - "text":"23.076", - "value":"23.076" - }, - "hide":0, - "label":"CPU", - "name":"costcpu", - "options":[ - { - "text":"23.076", - "value":"23.076" - } - ], - "query":"23.076", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"5.10", - "value":"5.10" - }, - "hide":0, - "label":"PE CPU", - "name":"costpcpu", - "options":[ - { - "text":"5.10", - "value":"5.10" - } - ], - "query":"5.10", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"3.25", - "value":"3.25" - }, - "hide":0, - "label":"RAM", - "name":"costram", - "options":[ - { - "text":"3.25", - "value":"3.25" - } - ], - "query":"3.25", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"0.6862", - "value":"0.6862" - }, - "hide":0, - "label":"PE RAM", - "name":"costpram", - "options":[ - { - "text":"0.6862", - "value":"0.6862" - } - ], - "query":"0.6862", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"0.040", - "value":"0.040" - }, - "hide":0, - "label":"Storage", - "name":"costStorageStandard", - "options":[ - { - "text":"0.040", - "value":"0.040" - } - ], - "query":"0.040", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":".17", - "value":".17" - }, - "hide":0, - "label":"SSD", - "name":"costStorageSSD", - "options":[ - { - "text":".17", - "value":".17" - } - ], - "query":".17", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":".12", - "value":".12" - }, - "hide":0, - "label":"Egress", - "name":"costEgress", - "options":[ - { - "selected":true, - "text":".12", - "value":".12" - } - ], - "query":".12", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"30", - "value":"30" - }, - "hide":0, - "label":"Discount", - "name":"costDiscount", - "options":[ - { - "text":"30", - "value":"30" - } - ], - "query":"30", - "skipUrlSync":false, - "type":"constant" - } - ] - }, - "time":{ - "from":"now-24h", - "to":"now" - }, - "timepicker":{ - "hidden":false, - "refresh_intervals":[ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options":[ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone":"browser", - "title":"Cluster cost & utilization metrics", - "uid":"cluster-costs", - "version":1 -} diff --git a/charts/kubecost/deployment-utilization.json b/charts/kubecost/deployment-utilization.json deleted file mode 100644 index ff5526c15..000000000 --- a/charts/kubecost/deployment-utilization.json +++ /dev/null @@ -1,1366 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "Monitors Kubernetes deployments in cluster using Prometheus and kube-state-metrics. Shows resource utilization of deployments, daemonsets, and statefulsets.", - "editable": true, - "gnetId": 8588, - "graphTooltip": 0, - "id": 2, - "iteration": 1586200623748, - "links": [], - "panels": [ - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 0, - "y": 0 - }, - "height": "180px", - "id": 1, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum (container_memory_working_set_bytes{container!=\"\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\", kubernetes_io_hostname=~\"^$Node$\", pod_name!=\"\"}) / sum (kube_node_status_allocatable_memory_bytes{node=~\"^$Node.*$\"}) * 100", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 900 - } - ], - "thresholds": "65, 90", - "title": "Deployment memory usage", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "default-kubecost", - "decimals": 2, - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 8, - "y": 0 - }, - "height": "180px", - "id": 2, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum (rate (container_cpu_usage_seconds_total{pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\", kubernetes_io_hostname=~\"^$Node$\"}[2m])) / sum (machine_cpu_cores{kubernetes_io_hostname=~\"^$Node$\"}) * 100", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 900 - } - ], - "thresholds": "65, 90", - "title": "Deployment CPU usage", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 16, - "y": 0 - }, - "height": "180px", - "id": 3, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(((sum(kube_deployment_status_replicas{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_desired_number_scheduled{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0))) - ((sum(kube_deployment_status_replicas_available{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_status_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_number_ready{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)))) / ((sum(kube_deployment_status_replicas{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_desired_number_scheduled{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0))) * 100", - "format": "time_series", - "intervalFactor": 2, - "refId": "A", - "step": 1800 - } - ], - "thresholds": "1,30", - "title": "Unavailable Replicas", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 0, - "y": 5 - }, - "height": "100px", - "id": 4, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(container_memory_working_set_bytes{container!=\"\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\", kubernetes_io_hostname=~\"^$Node$\", pod_name!=\"\"})", - "format": "time_series", - "intervalFactor": 2, - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Used", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 4, - "y": 5 - }, - "height": "100px", - "id": 5, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum (kube_node_status_allocatable_memory_bytes{node=~\"^$Node.*$\"})", - "format": "time_series", - "intervalFactor": 2, - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Total", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 8, - "y": 5 - }, - "height": "100px", - "id": 6, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": " cores", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum (rate (container_cpu_usage_seconds_total{pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\", kubernetes_io_hostname=~\"^$Node$\"}[5m]))", - "format": "time_series", - "intervalFactor": 2, - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Used", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 12, - "y": 5 - }, - "height": "100px", - "id": 7, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": " cores", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum (machine_cpu_cores{kubernetes_io_hostname=~\"^$Node$\"})", - "intervalFactor": 2, - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Total", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 16, - "y": 5 - }, - "height": "100px", - "id": 8, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(sum(kube_deployment_status_replicas_available{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_status_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_number_ready{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0))", - "format": "time_series", - "intervalFactor": 2, - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Available (cluster)", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 20, - "y": 5 - }, - "height": "100px", - "id": 9, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(sum(kube_deployment_status_replicas{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_desired_number_scheduled{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ $Daemonset }}", - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Total (cluster)", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 3, - "editable": true, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 11, - "w": 24, - "x": 0, - "y": 8 - }, - "height": "", - "id": 10, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": false, - "hideZero": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "/avlbl.*/", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum (irate (container_cpu_usage_seconds_total{container!=\"\",image!=\"\",name=~\"^k8s_.*\",io_kubernetes_container_name!=\"POD\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\",kubernetes_io_hostname=~\"^$Node$\"}[5m])) by (pod_name,kubernetes_io_hostname)", - "format": "time_series", - "hide": false, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "usage: {{ kubernetes_io_hostname }} | {{ pod_name }} ", - "metric": "container_cpu", - "refId": "A", - "step": 60 - }, - { - "expr": "sum (kube_pod_container_resource_requests_cpu_cores{pod=~\"^$Deployment$Statefulset$Daemonset.*$\",node=~\"^$Node$\"}) by (pod,node)", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "legendFormat": "rqst: {{ node }} | {{ pod }}", - "refId": "B", - "step": 120 - }, - { - "expr": "sum ((kube_node_status_allocatable_cpu_cores{node=~\"^$Node$\"})) by (node)", - "format": "time_series", - "hide": true, - "intervalFactor": 2, - "legendFormat": "avlbl: {{ node }}", - "refId": "C", - "step": 30 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "CPU usage & requests", - "tooltip": { - "msResolution": true, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": "cores", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "editable": true, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 13, - "w": 24, - "x": 0, - "y": 19 - }, - "id": 11, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "/^avlbl.*$/", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "max (container_memory_working_set_bytes{container!=\"POD\",container!=\"\",id!=\"/\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\",kubernetes_io_hostname=~\"^$Node$\"}) by (pod_name,kubernetes_io_hostname)", - "format": "time_series", - "hide": false, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "usage: {{kubernetes_io_hostname }} | {{ pod_name }}", - "metric": "container_memory_usage:sort_desc", - "refId": "A", - "step": 60 - }, - { - "expr": "sum ((kube_pod_container_resource_requests_memory_bytes{pod=~\"^$Deployment$Statefulset$Daemonset.*$\",node=~\"^$Node$\"})) by (pod,node)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "rqst: {{ node }} | {{ pod }}", - "refId": "B", - "step": 120 - }, - { - "expr": "sum ((kube_node_status_allocatable_memory_bytes{node=~\"^$Node$\"})) by (node)", - "format": "time_series", - "hide": true, - "intervalFactor": 2, - "legendFormat": "avlbl: {{ node }}", - "refId": "C", - "step": 30 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Memory usage & requests", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fill": 1, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 32 - }, - "id": 12, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "100 * (kubelet_volume_stats_used_bytes{kubernetes_io_hostname=~\"^$Node$\", persistentvolumeclaim=~\".*$Deployment$Statefulset$Daemonset.*$\"} / kubelet_volume_stats_capacity_bytes{kubernetes_io_hostname=~\"^$Node$\", persistentvolumeclaim=~\".*$Deployment$Statefulset$Daemonset.*$\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ persistentvolumeclaim }} | {{ kubernetes_io_hostname }}", - "refId": "A", - "step": 120 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Disk Usage", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "percent", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "editable": true, - "error": false, - "fill": 1, - "grid": {}, - "gridPos": { - "h": 13, - "w": 24, - "x": 0, - "y": 41 - }, - "id": 13, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum (rate (container_network_receive_bytes_total{id!=\"/\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\",kubernetes_io_hostname=~\"^$Node$\"}[2m])) by (pod_name, kubernetes_io_hostname)", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "-> {{ kubernetes_io_hostname }} | {{ pod_name }}", - "metric": "network", - "refId": "A", - "step": 60 - }, - { - "expr": "- sum( rate (container_network_transmit_bytes_total{id!=\"/\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\",kubernetes_io_hostname=~\"^$Node$\"}[2m])) by (pod_name, kubernetes_io_hostname)", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "<- {{ kubernetes_io_hostname }} | {{ pod_name }}", - "metric": "network", - "refId": "B", - "step": 60 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "All processes network I/O", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 16, - "style": "dark", - "tags": [ - "kubernetes", - "deployment" - ], - "templating": { - "list": [ - { - "allValue": "()", - "current": { - "selected": false, - "tags": [], - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "Deployment", - "options": [], - "query": "label_values(deployment)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": "()", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "Statefulset", - "options": [], - "query": "label_values(statefulset)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": "()", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "Daemonset", - "options": [], - "query": "label_values(daemonset)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "Node", - "options": [], - "query": "label_values(kubernetes_io_hostname)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-24h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Deployment/Statefulset/Daemonset utilization metrics", - "uid": "deployment-metrics", - "version": 1 -} diff --git a/charts/kubecost/label-cost-utilization.json b/charts/kubecost/label-cost-utilization.json deleted file mode 100644 index 46d508aa0..000000000 --- a/charts/kubecost/label-cost-utilization.json +++ /dev/null @@ -1,1193 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": 7, - "iteration": 1586214000479, - "links": [], - "panels": [ - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Monthly projected CPU cost given last 10m", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 0, - "y": 0 - }, - "hideTimeOverride": true, - "id": 15, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "sum(\n avg(container_cpu_allocation) by (pod,node)\n\n * on (node) group_left()\n avg(avg_over_time(node_cpu_hourly_cost[10m])) by (node)\n\n * on (pod) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n )\n) * 730", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "CPU Cost", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Based on CPU usage over last 24 hours", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 6, - "y": 0 - }, - "hideTimeOverride": true, - "id": 16, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "sum(\n avg(container_memory_allocation_bytes) by (pod,node) / 1024 / 1024 / 1024\n\n * on (node) group_left()\n avg(avg_over_time(node_ram_hourly_cost[10m])) by (node)\n\n * on (pod) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n )\n) * 730", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "Memory Cost", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 12, - "y": 0 - }, - "hideTimeOverride": true, - "id": 21, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "sum(\n sum(kube_persistentvolumeclaim_info{storageclass!=\".*ssd.*\"}) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) / 1024 / 1024 /1024 * .04 \n\n+\n\nsum(\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) / 1024 / 1024 /1024 * .17 \n", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "Storage Cost", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Cost of memory + CPU usage", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 18, - "y": 0 - }, - "hideTimeOverride": true, - "id": 20, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CPU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nsum(\n avg(container_cpu_allocation) by (pod,node)\n\n * on (node) group_left()\n avg(avg_over_time(node_cpu_hourly_cost[10m])) by (node)\n\n * on (pod) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n )\n) * 730\n\n#END CPU\n+\n\n# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Memory ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nsum(\n avg(container_memory_allocation_bytes) by (pod,node) / 1024 / 1024 / 1024\n\n * on (node) group_left()\n avg(avg_over_time(node_ram_hourly_cost[10m])) by (node)\n\n * on (pod) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n )\n) * 730\n\n# END MEMORY\n\n+\n\n# ~~~~~~~~~~~~~~~~~~~~~~~~~~~ STORAGE ~~~~~~~~~~~~~~~~~~~~~~~~~\n\nsum(\n sum(kube_persistentvolumeclaim_info{storageclass!=\".*ssd.*\"}) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) / 1024 / 1024 /1024 * .04 \n\n+\n\nsum(\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) / 1024 / 1024 /1024 * .17 \n\n\n# END STORAGE\n", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "Total Cost", - "type": "singlestat", - "valueFontSize": "110%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 0, - "y": 5 - }, - "id": 10, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": " cores", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(\n sum (kube_pod_container_resource_requests_cpu_cores) by (pod)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod)\n or up * 0\n) ", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "", - "title": "CPU Request", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 3, - "y": 5 - }, - "id": 17, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": " cores", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(\n label_replace(\n sum(rate(container_cpu_usage_seconds_total{image!=\"\",container_name!=\"POD\"}[1h])) by (kubernetes_io_hostname,pod_name),\n \"node\",\n \"$1\", \n \"kubernetes_io_hostname\", \n \"(.+)\"\n ) \n * on (pod_name) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n ) or up * 0\n) ", - "format": "time_series", - "intervalFactor": 2, - "refId": "A" - } - ], - "thresholds": "", - "title": "CPU Used", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 0, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 6, - "y": 5 - }, - "id": 11, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(\n sum (kube_pod_container_resource_requests_memory_bytes) by (pod)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod)\n or up * 0\n) ", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "", - "title": "Memory Request", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 9, - "y": 5 - }, - "id": 18, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(\n label_replace(\n sum (container_memory_working_set_bytes{pod_name!=\"\",container!=\"POD\",container!=\"\"}) by (pod_name),\n \"pod\",\n \"$1\", \n \"pod_name\", \n \"(.+)\")\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod)\n or up * 0\n)", - "format": "time_series", - "instant": true, - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "", - "title": "Memory Usage", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 0, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 5 - }, - "id": 22, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(\n max(kube_persistentvolumeclaim_info) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) \n", - "format": "time_series", - "instant": true, - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "", - "title": "Storage Request", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fill": 1, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n label_replace(\n sum (kube_pod_container_resource_limits_cpu_cores) by (pod, container)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container),\n \"container_name\",\n \"$1\", \n \"container\", \n \"(.+)\"\n )\n) \n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "limit", - "refId": "C" - }, - { - "expr": "sum(\n label_replace(\n sum (kube_pod_container_resource_requests_cpu_cores) by (pod, container)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container),\n \"container_name\",\n \"$1\", \n \"container\", \n \"(.+)\"\n )\n) \n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "request", - "refId": "B" - }, - { - "expr": "sum(\n label_replace(\n sum (rate (container_cpu_usage_seconds_total{image!=\"\",container!=\"POD\",container!=\"\"}[10m])) by (container,pod),\n \"pod\", \n \"$1\", \n \"pod_name\", \n \"(.+)\"\n )\n * on (pod) group_left (label_$label)\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container)\n)\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "usage", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "CPU Usage vs Requests vs Limits", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fill": 1, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 23, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n label_replace(\n sum (kube_pod_container_resource_limits_memory_bytes) by (pod, container)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container),\n \"container_name\",\n \"$1\", \n \"container\", \n \"(.+)\"\n )\n) \n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "limit", - "refId": "C" - }, - { - "expr": "sum(\n label_replace(\n sum (kube_pod_container_resource_requests_memory_bytes) by (pod, container)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container),\n \"container_name\",\n \"$1\", \n \"container\", \n \"(.+)\"\n )\n) \n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "request", - "refId": "B" - }, - { - "expr": "sum(\n label_replace(\n sum (container_memory_working_set_bytes{container!=\"\",container!=\"POD\"}) by (container,pod),\n \"pod\", \n \"$1\", \n \"pod_name\", \n \"(.+)\"\n )\n * on (pod) group_left (label_$label)\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container)\n)\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "usage", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Memory Usage vs Requests vs Limits", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 16, - "style": "dark", - "tags": [ - "cost", - "utilization", - "metrics" - ], - "templating": { - "list": [ - { - "datasource": "default-kubecost", - "filters": [], - "hide": 0, - "label": "", - "name": "Filters", - "skipUrlSync": false, - "type": "adhoc" - }, - { - "allValue": null, - "current": { - "tags": [], - "text": "app", - "value": "app" - }, - "hide": 0, - "includeAll": false, - "label": "Label", - "multi": false, - "name": "label", - "options": [ - { - "selected": false, - "text": "app", - "value": "app" - }, - { - "selected": false, - "text": "tier", - "value": "tier" - }, - { - "selected": false, - "text": "component", - "value": "component" - }, - { - "selected": true, - "text": "release", - "value": "release" - }, - { - "selected": false, - "text": "name", - "value": "name" - }, - { - "selected": false, - "text": "team", - "value": "team" - }, - { - "selected": false, - "text": "department", - "value": "department" - }, - { - "selected": false, - "text": "owner", - "value": "owner" - }, - { - "selected": false, - "text": "contact", - "value": "contact" - } - ], - "query": "app, tier, component, release, name, team, department, owner, contact", - "skipUrlSync": false, - "type": "custom" - }, - { - "allValue": ".*", - "current": { - "tags": [], - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": "Value", - "multi": false, - "name": "label_value", - "options": [], - "query": "query_result(SUM(kube_pod_labels{label_$label!=\"\",namespace!=\"kube-system\"}) by (label_$label))", - "refresh": 1, - "regex": "/label_$label=\\\"(.*?)(\\\")/", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": "()", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": "", - "multi": false, - "name": "Deployments", - "options": [], - "query": "label_values(deployment)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "tags": [], - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "Secondary", - "options": [ - { - "selected": true, - "text": "All", - "value": "$__all" - }, - { - "selected": false, - "text": "app", - "value": "app" - }, - { - "selected": false, - "text": "component", - "value": "component" - }, - { - "selected": false, - "text": "controller_revision_hash", - "value": "controller_revision_hash" - }, - { - "selected": false, - "text": "k8s_app", - "value": "k8s_app" - } - ], - "query": "query_result(kube_pod_labels)", - "refresh": 0, - "regex": "/.+?label_([^=]*).*/", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-24h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "", - "title": "Label costs & utilization", - "uid": "lWMhIA-ik", - "version": 2 -} diff --git a/charts/kubecost/logo.png b/charts/kubecost/logo.png deleted file mode 100644 index 607af6ccfbea82494428c0b2bc90868daaa4f6d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28017 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 Y0&eV=I24$NBI7?$QP7l!f-FM+AJb0{;s5{u diff --git a/charts/kubecost/namespace-utilization.json b/charts/kubecost/namespace-utilization.json deleted file mode 100644 index 7260cced1..000000000 --- a/charts/kubecost/namespace-utilization.json +++ /dev/null @@ -1,1156 +0,0 @@ -{ - "annotations":{ - "list":[ - { - "builtIn":1, - "datasource":"-- Grafana --", - "enable":true, - "hide":true, - "iconColor":"rgba(0, 211, 255, 1)", - "name":"Annotations & Alerts", - "type":"dashboard" - } - ] - }, - "description":"A dashboard to help with utilization and resource allocation", - "editable":true, - "gnetId":8673, - "graphTooltip":0, - "id":9, - "iteration":1553150922105, - "links":[ - - ], - "panels":[ - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "fontSize":"100%", - "gridPos":{ - "h":9, - "w":16, - "x":0, - "y":0 - }, - "hideTimeOverride":true, - "id":73, - "links":[ - - ], - "pageSize":8, - "repeat":null, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":2, - "desc":false - }, - "styles":[ - { - "alias":"Pod", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "link":false, - "linkTooltip":"", - "linkUrl":"", - "pattern":"pod_name", - "thresholds":[ - "30", - "80" - ], - "type":"string", - "unit":"currencyUSD" - }, - { - "alias":"RAM", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "pattern":"Value #B", - "thresholds":[ - - ], - "type":"number", - "unit":"decbytes" - }, - { - "alias":"CPU %", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - - ], - "type":"number", - "unit":"percent" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"Storage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"Total", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #D", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"CPU Utilization", - "colorMode":"value", - "colors":[ - "#bf1b00", - "rgba(50, 172, 45, 0.97)", - "#ef843c" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #E", - "thresholds":[ - "30", - "80" - ], - "type":"number", - "unit":"percent" - }, - { - "alias":"RAM Utilization", - "colorMode":"value", - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#ef843c" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #F", - "thresholds":[ - "30", - "80" - ], - "type":"number", - "unit":"percent" - } - ], - "targets":[ - { - "expr":"sum (rate (container_cpu_usage_seconds_total{namespace=\"$namespace\"}[10m])) by (pod_name) * 100", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"{{ pod_name }}", - "refId":"A" - }, - { - "expr":"sum (avg_over_time (container_memory_working_set_bytes{namespace=\"$namespace\", container_name!=\"POD\"}[10m])) by (pod_name)", - "format":"table", - "hide":false, - "instant":true, - "intervalFactor":1, - "legendFormat":"{{ pod_name }}", - "refId":"B" - } - ], - "timeFrom":"1M", - "timeShift":null, - "title":"Pod utilization analysis", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "fontSize":"100%", - "gridPos":{ - "h":9, - "w":8, - "x":16, - "y":0 - }, - "hideTimeOverride":true, - "id":90, - "links":[ - - ], - "pageSize":8, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":4, - "desc":true - }, - "styles":[ - { - "alias":"Namespace", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"namespace", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"PVC Name", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"persistentvolumeclaim", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Storage Class", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"storageclass", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Size", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":1, - "mappingType":1, - "pattern":"Value", - "thresholds":[ - - ], - "type":"number", - "unit":"gbytes" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - } - ], - "targets":[ - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right (storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace=~\"$namespace\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024 ", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"{{ persistentvolumeclaim }}", - "refId":"A" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"Persistent Volume Claims", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "description":"CPU requests by pod divided by the rate of CPU usage over the last hour", - "fill":1, - "gridPos":{ - "h":9, - "w":24, - "x":0, - "y":9 - }, - "id":100, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"topk(10,\n label_replace(\n sum(kube_pod_container_resource_requests_cpu_cores{namespace=\"$namespace\"}) by (pod),\n \"pod_name\", \n \"$1\", \n \"pod\", \n \"(.+)\"\n ) \n/ on (pod_name) sum(rate(container_cpu_usage_seconds_total{namespace=\"$namespace\",pod_name=~\".+\"}[1h])) by (pod_name))", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Ratio of CPU requests to usage (Top 10 pods)", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":3, - "description":"This panel shows historical utilization as an average across all pods in this namespace. It only accounts for currently deployed pods", - "editable":true, - "error":false, - "fill":0, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":0, - "y":18 - }, - "height":"", - "id":94, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":false, - "current":false, - "hideEmpty":false, - "hideZero":false, - "max":false, - "min":false, - "rightSide":false, - "show":false, - "sideWidth":null, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":true, - "targets":[ - { - "expr":"sum (rate (container_cpu_usage_seconds_total{namespace=\"$namespace\"}[10m])) by (namespace)\n", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"10s", - "intervalFactor":1, - "legendFormat":"cpu utilization", - "metric":"container_cpu", - "refId":"A", - "step":10 - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"Overall CPU Utilization", - "tooltip":{ - "msResolution":true, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "decimals":null, - "format":"percent", - "label":"", - "logBase":1, - "max":"110", - "min":"0", - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":2, - "description":"This panel shows historical utilization as an average across all pods in this namespace. It only accounts for currently deployed pods", - "editable":true, - "error":false, - "fill":0, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":12, - "y":18 - }, - "id":92, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":false, - "current":false, - "max":false, - "min":false, - "rightSide":false, - "show":false, - "sideWidth":200, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":true, - "targets":[ - { - "expr":"sum (container_memory_working_set_bytes{namespace=\"$namespace\"})\n/\nsum(node_memory_MemTotal_bytes)", - "format":"time_series", - "instant":false, - "intervalFactor":1, - "legendFormat":"mem utilization", - "refId":"B" - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"Overall RAM Utilization", - "tooltip":{ - "msResolution":false, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "decimals":null, - "format":"percent", - "label":null, - "logBase":1, - "max":"110", - "min":"0", - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":2, - "description":"Traffic in and out of this namespace, as a sum of the pods within it", - "editable":true, - "error":false, - "fill":1, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":0, - "y":24 - }, - "height":"", - "id":96, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":true, - "current":true, - "hideEmpty":false, - "hideZero":false, - "max":false, - "min":false, - "rightSide":false, - "show":true, - "sideWidth":null, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"sum (rate (container_network_receive_bytes_total{namespace=\"$namespace\"}[10m])) by (namespace)", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"<- in", - "metric":"container_cpu", - "refId":"A", - "step":10 - }, - { - "expr":"- sum (rate (container_network_transmit_bytes_total{namespace=\"$namespace\"}[10m])) by (namespace)", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"-> out", - "refId":"B" - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"Network IO", - "tooltip":{ - "msResolution":true, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"Bps", - "label":"", - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":2, - "description":"Disk reads and writes for the namespace, as a sum of the pods within it", - "editable":true, - "error":false, - "fill":1, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":12, - "y":24 - }, - "height":"", - "id":98, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":true, - "current":true, - "hideEmpty":false, - "hideZero":false, - "max":false, - "min":false, - "rightSide":false, - "show":true, - "sideWidth":null, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"sum (rate (container_fs_writes_bytes_total{namespace=\"$namespace\"}[10m])) by (namespace)", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"<- write", - "metric":"container_cpu", - "refId":"A", - "step":10 - }, - { - "expr":"- sum (rate (container_fs_reads_bytes_total{namespace=\"$namespace\"}[10m])) by (namespace)", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"-> read", - "refId":"B" - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"Disk IO", - "tooltip":{ - "msResolution":true, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"Bps", - "label":"", - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - } - ], - "refresh":"10s", - "schemaVersion":16, - "style":"dark", - "tags":[ - "cost", - "utilization", - "metrics" - ], - "templating":{ - "list":[ - { - "current":{ - "text":"23.06", - "value":"23.06" - }, - "hide":0, - "label":"CPU", - "name":"costcpu", - "options":[ - { - "text":"23.06", - "value":"23.06" - } - ], - "query":"23.06", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"7.28", - "value":"7.28" - }, - "hide":0, - "label":"PE CPU", - "name":"costpcpu", - "options":[ - { - "text":"7.28", - "value":"7.28" - } - ], - "query":"7.28", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"3.25", - "value":"3.25" - }, - "hide":0, - "label":"RAM", - "name":"costram", - "options":[ - { - "text":"3.25", - "value":"3.25" - } - ], - "query":"3.25", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"0.6862", - "value":"0.6862" - }, - "hide":0, - "label":"PE RAM", - "name":"costpram", - "options":[ - { - "text":"0.6862", - "value":"0.6862" - } - ], - "query":"0.6862", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"0.04", - "value":"0.04" - }, - "hide":0, - "label":"Storage", - "name":"costStorageStandard", - "options":[ - { - "text":"0.04", - "value":"0.04" - } - ], - "query":"0.04", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":".17", - "value":".17" - }, - "hide":0, - "label":"SSD", - "name":"costStorageSSD", - "options":[ - { - "text":".17", - "value":".17" - } - ], - "query":".17", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"30", - "value":"30" - }, - "hide":0, - "label":"Disc.", - "name":"costDiscount", - "options":[ - { - "text":"30", - "value":"30" - } - ], - "query":"30", - "skipUrlSync":false, - "type":"constant" - }, - { - "allValue":null, - "current":{ - "text":"kube-system", - "value":"kube-system" - }, - "datasource":"default-kubecost", - "hide":0, - "includeAll":false, - "label":"NS", - "multi":false, - "name":"namespace", - "options":[ - - ], - "query":"query_result(sum(kube_namespace_created{namespace!=\"\"}) by (namespace))", - "refresh":1, - "regex":"/namespace=\\\"(.*?)(\\\")/", - "skipUrlSync":false, - "sort":0, - "tagValuesQuery":"", - "tags":[ - - ], - "tagsQuery":"", - "type":"query", - "useTags":false - }, - { - "datasource":"default-kubecost", - "filters":[ - - ], - "hide":0, - "label":"", - "name":"Filters", - "skipUrlSync":false, - "type":"adhoc" - } - ] - }, - "time":{ - "from":"now-15m", - "to":"now" - }, - "timepicker":{ - "hidden":false, - "refresh_intervals":[ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options":[ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone":"browser", - "title":"Namespace utilization metrics", - "uid":"at-cost-analysis-namespace2", - "version":1 -} diff --git a/charts/kubecost/node-utilization.json b/charts/kubecost/node-utilization.json deleted file mode 100644 index ce751c199..000000000 --- a/charts/kubecost/node-utilization.json +++ /dev/null @@ -1,1370 +0,0 @@ -{ - "annotations":{ - "list":[ - { - "builtIn":1, - "datasource":"-- Grafana --", - "enable":true, - "hide":true, - "iconColor":"rgba(0, 211, 255, 1)", - "name":"Annotations & Alerts", - "type":"dashboard" - } - ] - }, - "editable":true, - "gnetId":null, - "graphTooltip":0, - "id":6, - "iteration":1557245882378, - "links":[ - - ], - "panels":[ - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "format":"percentunit", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":7, - "w":8, - "x":0, - "y":0 - }, - "id":2, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"sum(irate(container_cpu_usage_seconds_total{id=\"/\",instance=\"$node\"}[10m]))", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"CPU Usage", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"avg" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "format":"percentunit", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":7, - "w":8, - "x":8, - "y":0 - }, - "id":3, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"SUM(container_memory_usage_bytes{namespace!=\"\",instance=\"$node\"}) / SUM(kube_node_status_capacity_memory_bytes{node=\"$node\"})", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"Memory Usage", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"avg" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "format":"percentunit", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":7, - "w":8, - "x":16, - "y":0 - }, - "id":4, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"sum(container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",instance=\"$node\"}) /\nsum(container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",instance=\"$node\"})", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"Storage Usage", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"avg" - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "fontSize":"100%", - "gridPos":{ - "h":8, - "w":16, - "x":0, - "y":7 - }, - "hideTimeOverride":true, - "id":21, - "links":[ - - ], - "pageSize":8, - "repeat":null, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":4, - "desc":true - }, - "styles":[ - { - "alias":"Pod", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "link":false, - "linkTooltip":"", - "linkUrl":"", - "pattern":"pod_name", - "thresholds":[ - "30", - "80" - ], - "type":"string", - "unit":"currencyUSD" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"CPU Usage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"CPU Request", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"CPU Limit", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Mem Usage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #D", - "thresholds":[ - - ], - "type":"number", - "unit":"bytes" - }, - { - "alias":"Mem Request", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #E", - "thresholds":[ - - ], - "type":"number", - "unit":"bytes" - }, - { - "alias":"Mem Limit", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #F", - "thresholds":[ - - ], - "type":"number", - "unit":"bytes" - } - ], - "targets":[ - { - "expr":"sum(rate(container_cpu_usage_seconds_total{container_name!=\"\",container_name!=\"POD\",pod_name!=\"\",instance=\"$node\"}[24h])) by (pod_name)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"C" - }, - { - "expr":"sum(label_replace(\nsum(avg_over_time(kube_pod_container_resource_requests_cpu_cores{container!=\"\",container!=\"POD\",node=\"$node\"}[24h])) by (pod), \n\"pod_name\",\"$1\",\"pod\",\"(.+)\")\nor up * 0\n) by (pod_name)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"A" - }, - { - "expr":"sum(avg_over_time(container_memory_usage_bytes{container_name!=\"\",container_name!=\"POD\",pod_name!=\"\",instance=\"$node\"}[24h])) by (pod_name)\n", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"D" - }, - { - "expr":"sum(label_replace(label_replace(\nsum(avg_over_time(kube_pod_container_resource_requests_memory_bytes{container!=\"\",container!=\"POD\",node=\"$node\"}[24h])) by (pod),\n\"container_name\",\"$1\",\"container\",\"(.+)\"), \"pod_name\",\"$1\",\"pod\",\"(.+)\")\nor up * 0\n) by (pod_name)\n", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"E" - } - ], - "timeFrom":"1M", - "timeShift":null, - "title":"Current pods", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "decimals":0, - "format":"none", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":4, - "x":16, - "y":7 - }, - "id":8, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"sum(\n count(avg_over_time(kube_pod_container_resource_requests_cpu_cores{container!=\"\",container!=\"POD\",node=\"$node\"}[24h])) by (pod)\n * on (pod) group_right()\n sum(kube_pod_container_status_running) by (pod)\n)", - "format":"time_series", - "instant":true, - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"Pods Running", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "format":"bytes", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":4, - "x":20, - "y":7 - }, - "id":18, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"sum(container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",instance=\"$node\"})", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"Storage Capacity", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "format":"none", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":4, - "x":16, - "y":11 - }, - "id":9, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"kube_node_status_capacity_cpu_cores{node=\"$node\"}", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"CPU Capacity", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"avg" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "format":"bytes", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":4, - "x":20, - "y":11 - }, - "id":19, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"kube_node_status_capacity_memory_bytes{node=\"$node\"}", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"RAM Capacity", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":3, - "description":"This panel shows historical utilization for the node.", - "editable":true, - "error":false, - "fill":0, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":0, - "y":15 - }, - "height":"", - "id":11, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":false, - "current":false, - "hideEmpty":false, - "hideZero":false, - "max":false, - "min":false, - "rightSide":false, - "show":false, - "sideWidth":null, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":true, - "targets":[ - { - "expr":"sum(irate(container_cpu_usage_seconds_total{id=\"/\",instance=\"$node\"}[10m]))", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"10s", - "intervalFactor":1, - "legendFormat":"cpu utilization", - "metric":"container_cpu", - "refId":"A", - "step":10 - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"CPU Utilization", - "tooltip":{ - "msResolution":true, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "decimals":null, - "format":"percentunit", - "label":"", - "logBase":1, - "max":"1.1", - "min":"0", - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":2, - "description":"This panel shows historical utilization for the node.", - "editable":true, - "error":false, - "fill":0, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":12, - "y":15 - }, - "id":13, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":false, - "current":false, - "max":false, - "min":false, - "rightSide":false, - "show":false, - "sideWidth":200, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":true, - "targets":[ - { - "expr":"SUM(container_memory_usage_bytes{namespace!=\"\",instance=\"$node\"}) / SUM(kube_node_status_capacity_memory_bytes{node=\"$node\"})", - "format":"time_series", - "instant":false, - "interval":"10s", - "intervalFactor":1, - "legendFormat":"ram utilization", - "metric":"container_memory_usage:sort_desc", - "refId":"A", - "step":10 - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"RAM Utilization", - "tooltip":{ - "msResolution":false, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "decimals":null, - "format":"percentunit", - "label":null, - "logBase":1, - "max":"1.1", - "min":"0", - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":2, - "description":"Traffic in and out of this namespace, as a sum of the pods within it", - "editable":true, - "error":false, - "fill":1, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":0, - "y":21 - }, - "height":"", - "id":15, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":true, - "current":true, - "hideEmpty":false, - "hideZero":false, - "max":false, - "min":false, - "rightSide":false, - "show":true, - "sideWidth":null, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"sum (rate (container_network_receive_bytes_total{instance=\"$node\"}[10m]))", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"<- in", - "metric":"container_cpu", - "refId":"A", - "step":10 - }, - { - "expr":"- sum (rate (container_network_transmit_bytes_total{instance=\"$node\"}[10m]))", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"-> out", - "refId":"B" - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"Network IO", - "tooltip":{ - "msResolution":true, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"Bps", - "label":"", - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":2, - "description":"Disk reads and writes for the namespace, as a sum of the pods within it", - "editable":true, - "error":false, - "fill":1, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":12, - "y":21 - }, - "height":"", - "id":17, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":true, - "current":true, - "hideEmpty":false, - "hideZero":false, - "max":false, - "min":false, - "rightSide":false, - "show":true, - "sideWidth":null, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"sum (rate (container_fs_writes_bytes_total{instance=\"$node\"}[10m]))", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"<- write", - "metric":"container_cpu", - "refId":"A", - "step":10 - }, - { - "expr":"- sum (rate (container_fs_reads_bytes_total{instance=\"$node\"}[10m]))", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"-> read", - "refId":"B" - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"Disk IO", - "tooltip":{ - "msResolution":true, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"Bps", - "label":"", - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - } - ], - "schemaVersion":16, - "style":"dark", - "tags":[ - "cost", - "utilization", - "metrics" - ], - "templating":{ - "list":[ - { - "allValue":null, - "current":{ - "text":"ip-172-20-44-170.us-east-2.compute.internal", - "value":"ip-172-20-44-170.us-east-2.compute.internal" - }, - "datasource":"default-kubecost", - "hide":0, - "includeAll":false, - "label":null, - "multi":false, - "name":"node", - "options":[ - - ], - "query":"query_result(kube_node_labels)", - "refresh":1, - "regex":"/node=\\\"(.*?)(\\\")/", - "skipUrlSync":false, - "sort":0, - "tagValuesQuery":"", - "tags":[ - - ], - "tagsQuery":"", - "type":"query", - "useTags":false - } - ] - }, - "time":{ - "from":"now-6h", - "to":"now" - }, - "timepicker":{ - "refresh_intervals":[ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options":[ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone":"", - "title":"Node utilization metrics", - "uid":"NUQW37Lmk", - "version":1 -} diff --git a/charts/kubecost/pod-utilization.json b/charts/kubecost/pod-utilization.json deleted file mode 100644 index 4e0abff2d..000000000 --- a/charts/kubecost/pod-utilization.json +++ /dev/null @@ -1,798 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "Visualize your kubernetes costs at the pod level.", - "editable": true, - "gnetId": 9063, - "graphTooltip": 0, - "id": 4, - "iteration": 1560100821196, - "links": [], - "panels": [ - { - "columns": [ - { - "text": "Avg", - "value": "avg" - } - ], - "datasource": "default-kubecost", - "fontSize": "100%", - "gridPos": { - "h": 5, - "w": 24, - "x": 0, - "y": 0 - }, - "hideTimeOverride": true, - "id": 98, - "links": [], - "pageSize": 5, - "repeatDirection": "v", - "scroll": true, - "showHeader": true, - "sort": { - "col": 6, - "desc": true - }, - "styles": [ - { - "alias": "Container", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "pattern": "container_name", - "thresholds": [ - "30", - "80" - ], - "type": "string", - "unit": "currencyUSD" - }, - { - "alias": "Memory Allocation", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "Value #B", - "thresholds": [], - "type": "number", - "unit": "bytes" - }, - { - "alias": "CPU Allocation", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #A", - "thresholds": [], - "type": "number", - "unit": "none" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Time", - "thresholds": [], - "type": "hidden", - "unit": "short" - }, - { - "alias": "Memory ($/hour)", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #C", - "thresholds": [], - "type": "number", - "unit": "currencyUSD" - }, - { - "alias": "Spot/PE RAM", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #D", - "thresholds": [], - "type": "number", - "unit": "currencyUSD" - }, - { - "alias": "Total", - "colorMode": null, - "colors": [ - "#bf1b00", - "rgba(50, 172, 45, 0.97)", - "#ef843c" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #E", - "thresholds": [ - "" - ], - "type": "number", - "unit": "currencyUSD" - } - ], - "targets": [ - { - "expr": "sum(\n avg_over_time(container_memory_allocation_bytes{namespace=\"$namespace\", pod=\"$pod\", container!=\"POD\"}[$__range])\n) by (container,node)", - "format": "table", - "instant": true, - "intervalFactor": 1, - "refId": "B" - }, - { - "expr": "sum(\n avg_over_time(container_cpu_allocation{namespace=\"$namespace\", pod=\"$pod\", container!=\"POD\"}[$__range])\n or up * 0 \n) by (container,node)", - "format": "table", - "hide": false, - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "timeFrom": "1M", - "timeShift": null, - "title": "Container cost & allocation analysis", - "transform": "table", - "transparent": false, - "type": "table" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 3, - "description": "This graph attempts to show you CPU use of your application vs its requests", - "editable": true, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 5 - }, - "height": "", - "id": 94, - "isNew": true, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": true, - "targets": [ - { - "expr": "avg (rate (container_cpu_usage_seconds_total{namespace=~\"$namespace\", pod_name=\"$pod\", container_name!=\"POD\",container_name!=\"\"}[10m])) by (container_name)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ container_name }} (usage)", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "expr": "avg(kube_pod_container_resource_requests_cpu_cores{namespace=~\"$namespace\", pod=\"$pod\", container!=\"POD\"}) by (container)", - "format": "time_series", - "instant": false, - "intervalFactor": 1, - "legendFormat": "{{ container}} (request)", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": "", - "timeShift": null, - "title": "CPU Usage vs Requested", - "tooltip": { - "msResolution": true, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 3, - "description": "This graph attempts to show you RAM use of your application vs its requests", - "editable": true, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 5 - }, - "height": "", - "id": 96, - "isNew": true, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": true, - "targets": [ - { - "expr": "avg (avg_over_time (container_memory_working_set_bytes{namespace=\"$namespace\", pod_name=\"$pod\", container_name!=\"POD\",container_name!=\"\"}[1m])) by (container_name)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ container_name }} (usage)", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "expr": "avg(kube_pod_container_resource_requests_memory_bytes{namespace=~\"$namespace\", pod=\"$pod\", container!=\"POD\"}) by (container)", - "format": "time_series", - "hide": false, - "instant": false, - "intervalFactor": 1, - "legendFormat": "{{ container }} (requested)", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": "", - "timeShift": null, - "title": "RAM Usage vs Requested", - "tooltip": { - "msResolution": true, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "description": "Traffic in and out of this pod, as a sum of its containers", - "editable": true, - "error": false, - "fill": 1, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 12 - }, - "height": "", - "id": 95, - "isNew": true, - "legend": { - "alignAsTable": false, - "avg": true, - "current": true, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "avg (rate (container_network_receive_bytes_total{namespace=\"$namespace\",pod_name=\"$pod\"}[10m])) by (pod_name)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "<- in", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "expr": "- avg (rate (container_network_transmit_bytes_total{namespace=\"$namespace\",pod_name=\"$pod\"}[10m])) by (pod_name)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "-> out", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": "", - "timeShift": null, - "title": "Network IO", - "tooltip": { - "msResolution": true, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "Bps", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "description": "Disk read writes", - "editable": true, - "error": false, - "fill": 1, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 12 - }, - "height": "", - "id": 97, - "isNew": true, - "legend": { - "alignAsTable": false, - "avg": true, - "current": true, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "avg (rate (container_fs_writes_bytes_total{namespace=\"$namespace\",pod_name=\"$pod\"}[10m])) by (pod_name)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "<- write", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "expr": "- avg (rate (container_fs_reads_bytes_total{namespace=\"$namespace\",pod_name=\"$pod\"}[10m])) by (pod_name)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "-> read", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": "", - "timeShift": null, - "title": "Disk IO", - "tooltip": { - "msResolution": true, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "Bps", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 16, - "style": "dark", - "tags": [ - "cost", - "utilization", - "metrics" - ], - "templating": { - "list": [ - { - "current": { - "text": "0.044", - "value": "0.044" - }, - "hide": 0, - "label": "Storage", - "name": "costStorageStandard", - "options": [ - { - "text": "0.044", - "value": "0.044" - } - ], - "query": "0.044", - "skipUrlSync": false, - "type": "constant" - }, - { - "current": { - "text": "0.187", - "value": "0.187" - }, - "hide": 0, - "label": "SSD", - "name": "costStorageSSD", - "options": [ - { - "text": "0.187", - "value": "0.187" - } - ], - "query": "0.187", - "skipUrlSync": false, - "type": "constant" - }, - { - "current": { - "text": "30", - "value": "30" - }, - "hide": 0, - "label": "Disc.", - "name": "costDiscount", - "options": [ - { - "text": "30", - "value": "30" - } - ], - "query": "30", - "skipUrlSync": false, - "type": "constant" - }, - { - "allValue": null, - "current": { - "selected": false, - "text": "kubecost", - "value": "kubecost" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": false, - "label": "NS", - "multi": false, - "name": "namespace", - "options": [], - "query": "query_result(sum(container_memory_working_set_bytes{namespace!=\"\"}) by (namespace))", - "refresh": 1, - "regex": "/namespace=\\\"(.*?)(\\\")/", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "selected": false, - "tags": [], - "text": "kubecost-grafana-5cc9f5bf6-7kmgl", - "value": "kubecost-grafana-5cc9f5bf6-7kmgl" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": false, - "label": "Pod", - "multi": false, - "name": "pod", - "options": [], - "query": "query_result(sum(container_memory_working_set_bytes{namespace=\"$namespace\"}) by (pod_name))", - "refresh": 1, - "regex": "/pod_name=\\\"(.*?)(\\\")/", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-24h", - "to": "now" - }, - "timepicker": { - "hidden": false, - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Pod cost & utilization metrics", - "uid": "at-cost-analysis-pod", - "version": 1 -} diff --git a/charts/kubecost/prom-benchmark.json b/charts/kubecost/prom-benchmark.json deleted file mode 100644 index 83c778bd5..000000000 --- a/charts/kubecost/prom-benchmark.json +++ /dev/null @@ -1,5670 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "Metrics useful for benchmarking and loadtesting Prometheus itself. Designed primarily for Prometheus 2.17.x.", - "editable": true, - "gnetId": 12054, - "graphTooltip": 1, - "id": 9, - "iteration": 1603144824023, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 49, - "panels": [], - "title": "Basics", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 40, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_build_info{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{version}} - {{revision}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Prometheus Version", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 1 - }, - "hiddenSeries": false, - "id": 72, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "time() - process_start_time_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Age", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Uptime", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "dtdurations", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 1 - }, - "hiddenSeries": false, - "id": 107, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "time() - prometheus_config_last_reload_success_timestamp_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Age", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Last Successful Config Reload", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "dtdurations", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 8 - }, - "id": 46, - "panels": [], - "title": "Ingestion", - "type": "row" - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "Time series": "#70dbed" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 9 - }, - "hiddenSeries": false, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_head_series{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Time series", - "metric": "prometheus_local_storage_memory_series", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Head Time series", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 9 - }, - "hiddenSeries": false, - "id": 26, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_head_active_appenders{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Head Appenders", - "metric": "prometheus_local_storage_memory_series", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Head Active Appenders", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "samples/s": "#e5a8e2" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 9 - }, - "hiddenSeries": false, - "id": 1, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_head_samples_appended_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "samples/s", - "metric": "prometheus_local_storage_ingested_samples_total", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Samples Appended/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "To persist": "#9AC48A" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 16 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "/Max.*/", - "fill": 0 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_head_chunks{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Chunks", - "metric": "prometheus_local_storage_memory_chunks", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Head Chunks", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 16 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_head_chunks_created_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Created", - "metric": "prometheus_local_storage_chunk_ops_total", - "refId": "A", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_head_chunks_removed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Removed", - "metric": "prometheus_local_storage_chunk_ops_total", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Head Chunks/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "Removed": "#e5ac0e" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 16 - }, - "hiddenSeries": false, - "id": 25, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_isolation_high_watermark{job=\"prometheus\",instance=\"$Prometheus:9090\"} - prometheus_tsdb_isolation_low_watermark{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Difference", - "metric": "prometheus_local_storage_chunk_ops_total", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Isolation Watermarks", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 23 - }, - "id": 52, - "panels": [], - "title": "Compaction", - "type": "row" - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max": "#447ebc", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "Min": "#447ebc", - "Now": "#7eb26d" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 24 - }, - "hiddenSeries": false, - "id": 28, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "Max", - "fillBelowTo": "Min", - "lines": false - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_head_min_time{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Min", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - }, - { - "expr": "time() * 1000", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "legendFormat": "Now", - "refId": "C" - }, - { - "expr": "prometheus_tsdb_head_max_time{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Max", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Head Time Range", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "dateTimeAsIso", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 24 - }, - "hiddenSeries": false, - "id": 29, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_head_gc_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "GC Time/s", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Head GC Time/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 24 - }, - "hiddenSeries": false, - "id": 14, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "Queue length", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_blocks_loaded{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Blocks Loaded", - "metric": "prometheus_local_storage_indexing_batch_sizes_sum", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Blocks Loaded", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Failed Compactions": "#bf1b00", - "Failed Reloads": "#bf1b00", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 31 - }, - "hiddenSeries": false, - "id": 30, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_reloads_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Reloads", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "TSDB Reloads/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Failed Compactions": "#bf1b00", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 31 - }, - "hiddenSeries": false, - "id": 31, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_wal_fsync_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) / rate(prometheus_tsdb_wal_fsync_duration_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Fsync Latency", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_wal_truncate_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m]) / rate(prometheus_tsdb_wal_trunacte_duration_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Truncate Latency", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "WAL Fsync&Truncate Latency", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Failed Compactions": "#bf1b00", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "{instance=\"demo.robustperception.io:9090\",job=\"prometheus\"}": "#bf1b00" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 31 - }, - "hiddenSeries": false, - "id": 32, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_wal_corruptions_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "WAL Corruptions", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_reloads_failures_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Reload Failures", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "B", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_head_series_not_found{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Head Series Not Found", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "C", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_compactions_failed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Compaction Failures", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "D", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_retention_cutoffs_failures_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Retention Cutoff Failures", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "E", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_checkpoint_creations_failed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "WAL Checkpoint Creation Failures", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "F", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_checkpoint_deletions_failed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "WAL Checkpoint Deletion Failures", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "G", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "TSDB Problems/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Failed Compactions": "#bf1b00", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 38 - }, - "hiddenSeries": false, - "id": 19, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_compactions_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Compactions", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Compactions/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 38 - }, - "hiddenSeries": false, - "id": 33, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_compaction_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Compaction Time/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Allocated bytes": "#F9BA8F", - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "RSS": "#890F02" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 38 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_time_retentions_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Time Cutoffs", - "metric": "last", - "refId": "A", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_size_retentions_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Size Cutoffs", - "metric": "last", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Retention Cutoffs/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 45 - }, - "hiddenSeries": false, - "id": 27, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_compaction_chunk_range_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m]) / rate(prometheus_tsdb_compaction_chunk_range_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Chunk Time Range", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "First Compaction, Avg Chunk Time Range", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "dtdurationms", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 45 - }, - "hiddenSeries": false, - "id": 35, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_compaction_chunk_size_bytes_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m]) / rate(prometheus_tsdb_compaction_chunk_samples_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Bytes/Sample", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "First Compaction, Avg Bytes/Sample", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 45 - }, - "hiddenSeries": false, - "id": 34, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_compaction_chunk_samples_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m]) / rate(prometheus_tsdb_compaction_chunk_samples_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Chunk Samples", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "First Compaction, Avg Chunk Samples", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 52 - }, - "id": 55, - "panels": [], - "title": "Resource Usage", - "type": "row" - }, - { - "aliasColors": { - "Allocated bytes": "#7EB26D", - "Allocated bytes - 1m max": "#BF1B00", - "Allocated bytes - 1m min": "#BF1B00", - "Allocated bytes - 5m max": "#BF1B00", - "Allocated bytes - 5m min": "#BF1B00", - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "RSS": "#447EBC" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": null, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 53 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "/-/", - "fill": 0 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "process_resident_memory_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "intervalFactor": 2, - "legendFormat": "RSS", - "metric": "process_resident_memory_bytes", - "refId": "B", - "step": 10 - }, - { - "expr": "prometheus_local_storage_target_heap_size_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "intervalFactor": 2, - "legendFormat": "Target heap size", - "metric": "go_memstats_alloc_bytes", - "refId": "D", - "step": 10 - }, - { - "expr": "go_memstats_next_gc_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "intervalFactor": 2, - "legendFormat": "Next GC", - "metric": "go_memstats_next_gc_bytes", - "refId": "C", - "step": 10 - }, - { - "expr": "go_memstats_alloc_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "intervalFactor": 2, - "legendFormat": "Allocated", - "metric": "go_memstats_alloc_bytes", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Allocated bytes": "#F9BA8F", - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "RSS": "#890F02" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 53 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(go_memstats_alloc_bytes_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Allocated Bytes/s", - "metric": "go_memstats_alloc_bytes", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Allocations", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 53 - }, - "hiddenSeries": false, - "id": 9, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(process_cpu_seconds_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "intervalFactor": 2, - "legendFormat": "Irate", - "metric": "prometheus_local_storage_ingested_samples_total", - "refId": "A", - "step": 10 - }, - { - "expr": "rate(process_cpu_seconds_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[5m])", - "intervalFactor": 2, - "legendFormat": "5m rate", - "metric": "prometheus_local_storage_ingested_samples_total", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - "avg" - ] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 60 - }, - "hiddenSeries": false, - "id": 70, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_symbol_table_size_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "RAM Used", - "metric": "prometheus_local_storage_ingested_samples_total", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Symbol Tables Size", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - "avg" - ] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 60 - }, - "hiddenSeries": false, - "id": 71, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_storage_blocks_bytes_total{job=\"prometheus\",instance=\"$Prometheus:9090\"} or prometheus_tsdb_storage_blocks_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Disk Used", - "metric": "prometheus_local_storage_ingested_samples_total", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Block Size", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - "avg" - ] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Max": "#e24d42", - "Open": "#508642" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 60 - }, - "hiddenSeries": false, - "id": 41, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "process_max_fds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Max", - "refId": "A" - }, - { - "expr": "process_open_fds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Open", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "File Descriptors", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 67 - }, - "id": 91, - "panels": [], - "title": "Service Discovery", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 68 - }, - "hiddenSeries": false, - "id": 42, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_sd_discovered_targets{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{name}}-{{config}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Discovered Targets", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 68 - }, - "hiddenSeries": false, - "id": 96, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_sd_updates_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[5m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Sent Updates/s", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 68 - }, - "hiddenSeries": false, - "id": 97, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_sd_received_updates_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[5m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Received Updates/s", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 75 - }, - "id": 99, - "panels": [], - "title": "Scraping", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 76 - }, - "hiddenSeries": false, - "id": 105, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_target_interval_length_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) / rate(prometheus_target_interval_length_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{interval}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Scrape Interval", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 76 - }, - "hiddenSeries": false, - "id": 104, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_target_scrapes_exceeded_sample_limit_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Exceeded Sample Limit", - "refId": "A" - }, - { - "expr": "rate(prometheus_target_scrapes_sample_duplicate_timestamp_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Duplicate Timestamp", - "refId": "C" - }, - { - "expr": "rate(prometheus_target_scrapes_sample_out_of_bounds_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Out Of Bounds ", - "refId": "D" - }, - { - "expr": "rate(prometheus_target_scrapes_sample_out_of_order_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Out of Order", - "refId": "E" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Scrape Problems/s", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 76 - }, - "hiddenSeries": false, - "id": 95, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_target_metadata_cache_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{scrape_job}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Metadata Cache Size", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 83 - }, - "id": 63, - "panels": [], - "title": "Query Engine", - "type": "row" - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "Time spent in each mode, per second", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 84 - }, - "hiddenSeries": false, - "id": 24, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_engine_query_duration_seconds_sum{job=\"prometheus\",}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{slice}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Query engine timings/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 84 - }, - "hiddenSeries": false, - "id": 22, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_rule_group_iterations_missed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) ", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Rule group missed", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "B", - "step": 10 - }, - { - "expr": "rate(prometheus_rule_evaluation_failures_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Rule evals failed", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "C", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Rule group evaulation problems/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 84 - }, - "hiddenSeries": false, - "id": 23, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_rule_group_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Rule evaluation duration", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Evaluation time of rule groups/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": true, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 91 - }, - "id": 77, - "panels": [ - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 92 - }, - "hiddenSeries": false, - "id": 86, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_notifications_sent_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{alertmanager}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Notification Sent/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 92 - }, - "hiddenSeries": false, - "id": 87, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_notifications_errors_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) / rate(prometheus_notifications_sent_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{alertmanager}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Notification Error Ratio", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 92 - }, - "hiddenSeries": false, - "id": 81, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_notifications_latency_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m]) / rate(prometheus_notifications_latency_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{alertmanager}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Notification Latency", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 99 - }, - "hiddenSeries": false, - "id": 85, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_notifications_alertmanagers_discovered{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Alertmanagers", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Alertmanagers Discovered", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 99 - }, - "hiddenSeries": false, - "id": 89, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_notifications_dropped_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Dropped", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Notifications Dropped/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 99 - }, - "hiddenSeries": false, - "id": 88, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_notifications_queue_length{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Pending", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - }, - { - "expr": "prometheus_notifications_queue_capacity{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Max", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Notification Queue", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "title": "Notification", - "type": "row" - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 92 - }, - "id": 58, - "panels": [], - "title": "HTTP Server", - "type": "row" - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 93 - }, - "hiddenSeries": false, - "id": 38, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_http_request_duration_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{handler}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "HTTP requests/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 93 - }, - "hiddenSeries": false, - "id": 37, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_http_request_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) / rate(prometheus_http_request_duration_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{handler}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "HTTP request latency", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 93 - }, - "hiddenSeries": false, - "id": 36, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_http_request_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{handler}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Time spent in HTTP requests/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 100 - }, - "id": 61, - "panels": [], - "repeat": "RuleGroup", - "scopedVars": { - "RuleGroup": { - "selected": false, - "text": "/etc/config/rules;CPU", - "value": "/etc/config/rules;CPU" - } - }, - "title": "Rule Group: $RuleGroup", - "type": "row" - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Interval": "#890f02", - "Last Duration": "#f9934e", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 101 - }, - "hiddenSeries": false, - "id": 43, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "repeatDirection": "h", - "scopedVars": { - "RuleGroup": { - "selected": false, - "text": "/etc/config/rules;CPU", - "value": "/etc/config/rules;CPU" - } - }, - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_rule_group_interval_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Interval", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - }, - { - "expr": "prometheus_rule_group_last_duration_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Last Duration", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "$RuleGroup: Duration", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Interval": "#890f02", - "Last Duration": "#f9934e", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 101 - }, - "hiddenSeries": false, - "id": 66, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeatDirection": "h", - "scopedVars": { - "RuleGroup": { - "selected": false, - "text": "/etc/config/rules;CPU", - "value": "/etc/config/rules;CPU" - } - }, - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_rule_group_rules{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Rules", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "$RuleGroup: Rules", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 108 - }, - "id": 108, - "panels": [], - "repeat": null, - "repeatIteration": 1603144824023, - "repeatPanelId": 61, - "scopedVars": { - "RuleGroup": { - "selected": false, - "text": "/etc/config/rules;Savings", - "value": "/etc/config/rules;Savings" - } - }, - "title": "Rule Group: $RuleGroup", - "type": "row" - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Interval": "#890f02", - "Last Duration": "#f9934e", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 109 - }, - "hiddenSeries": false, - "id": 109, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "repeatDirection": "h", - "repeatIteration": 1603144824023, - "repeatPanelId": 43, - "repeatedByRow": true, - "scopedVars": { - "RuleGroup": { - "selected": false, - "text": "/etc/config/rules;Savings", - "value": "/etc/config/rules;Savings" - } - }, - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_rule_group_interval_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Interval", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - }, - { - "expr": "prometheus_rule_group_last_duration_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Last Duration", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "$RuleGroup: Duration", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Interval": "#890f02", - "Last Duration": "#f9934e", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 109 - }, - "hiddenSeries": false, - "id": 110, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeatDirection": "h", - "repeatIteration": 1603144824023, - "repeatPanelId": 66, - "repeatedByRow": true, - "scopedVars": { - "RuleGroup": { - "selected": false, - "text": "/etc/config/rules;Savings", - "value": "/etc/config/rules;Savings" - } - }, - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_rule_group_rules{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Rules", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "$RuleGroup: Rules", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": { - "selected": false, - "text": "localhost", - "value": "localhost" - }, - "datasource": "default-kubecost", - "definition": "", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "Prometheus", - "options": [], - "query": "query_result(up{job=\"prometheus\"} == 1)", - "refresh": 2, - "regex": ".*instance=\"([^\"]+):9090\".*", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": null, - "tags": [], - "tagsQuery": null, - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "definition": "", - "hide": 2, - "includeAll": true, - "label": null, - "multi": false, - "name": "RuleGroup", - "options": [], - "query": "prometheus_rule_group_last_duration_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "refresh": 2, - "regex": ".*rule_group=\"(.*?)\".*", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-24h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "Prometheus Benchmark - 2.17.x", - "uid": "L0HBvojWz", - "version": 4 -} diff --git a/charts/kubecost/questions.yml b/charts/kubecost/questions.yml deleted file mode 100644 index ce86c64fb..000000000 --- a/charts/kubecost/questions.yml +++ /dev/null @@ -1,160 +0,0 @@ -questions: -# General Settings -- variable: kubecostProductConfigs.clusterName - label: Cluster Name - description: "Used for display in the cost-analyzer UI (Can be renamed in the UI)" - type: string - required: true - default: "" - group: General Settings -- variable: persistentVolume.enabled - label: Enable Persistent Volume for CostAnalyzer - description: "If true, Kubecost will create a Persistent Volume Claim for product config data" - type: boolean - default: false - show_subquestion_if: true - group: "General Settings" - subquestions: - - variable: persistentVolume.size - label: CostAnalyzer Persistent Volume Size - type: string - default: "0.2Gi" - -# Prometheus Server -- variable: global.prometheus.enabled - label: Enable Prometheus - description: If false, use an existing Prometheus install - type: boolean - default: true - group: "Prometheus" -- variable: prometheus.kubeStateMetrics.enabled - label: Enable KubeStateMetrics - description: "If true, deploy kube-state-metrics for Kubernetes metrics" - type: boolean - default: true - show_if: "global.prometheus.enabled=true" - group: "Prometheus" -- variable: prometheus.server.retention - label: Prometheus Server Retention - description: "Determines when to remove old data" - type: string - default: "15d" - show_if: "global.prometheus.enabled=true" - group: "Prometheus" -- variable: prometheus.server.persistentVolume.enabled - label: Create Persistent Volume for Prometheus - description: "If true, prometheus will create a persistent volume claim" - type: boolean - required: true - default: false - group: "Prometheus" - show_if: "global.prometheus.enabled=true" - show_subquestion_if: true - subquestions: - - variable: prometheus.server.persistentVolume.size - label: Prometheus Persistent Volume Size - type: string - default: "8Gi" - - variable: prometheus.server.persistentVolume.storageClass - label: Prometheus Persistent Volume StorageClass - description: "Prometheus data persistent volume storageClass, if not set use default StorageClass" - default: "" - type: storageclass - - variable: prometheus.server.persistentVolume.existingClaim - label: Existing Persistent Volume Claim for Prometheus - description: "If not empty, uses the specified existing PVC instead of creating new one" - type: pvc - default: "" - -# Prometheus Node Exporter -- variable: prometheus.nodeExporter.enabled - label: Enable NodeExporter - description: "If false, do not create NodeExporter daemonset" - type: boolean - default: true - group: "NodeExporter" -- variable: prometheus.serviceAccounts.nodeExporter.create - label: Enable Service Accounts NodeExporter - description: "If false, do not create NodeExporter daemonset" - type: boolean - default: true - group: "NodeExporter" - -# Prometheus AlertManager -- variable: prometheus.alertmanager.enabled - label: Enable AlertManager - type: boolean - default: true - group: "AlertManager" -- variable: prometheus.alertmanager.persistentVolume.enabled - label: Create Persistent Volume for AlertManager - description: "If true, alertmanager will create a persistent volume claim" - type: boolean - required: true - default: false - group: "AlertManager" - show_if: "prometheus.alertmanager.enabled=true" - show_subquestion_if: true - subquestions: - - variable: prometheus.alertmanager.persistentVolume.size - default: "2Gi" - description: "AlertManager data persistent volume size" - type: string - label: AlertManager Persistent Volume Size - - variable: prometheus.alertmanager.persistentVolume.storageClass - default: "" - description: "Alertmanager data persistent volume storageClass, if not set use default StorageClass" - type: storageclass - label: AlertManager Persistent Volume StorageClass - - variable: prometheus.alertmanager.persistentVolume.existingClaim - default: "" - description: "If not empty, uses the specified existing PVC instead of creating new one" - type: pvc - label: Existing Persistent Volume Claim for AlertManager - -# PushGateway -- variable: prometheus.pushgateway.enabled - label: Enable PushGateway - type: boolean - default: true - group: "PushGateway" -- variable: prometheus.pushgateway.persistentVolume.enabled - label: Create Persistent Volume for PushGateway - description: "If true, PushGateway will create a persistent volume claim" - required: true - type: boolean - default: false - group: "PushGateway" - show_if: "prometheus.pushgateway.enabled=true" - show_subquestion_if: true - subquestions: - - variable: prometheus.prometheus.pushgateway.persistentVolume.size - label: PushGateway Persistent Volume Size - type: string - default: "2Gi" - - variable: prometheus.pushgateway.persistentVolume.storageClass - label: PushGateway Persistent Volume StorageClass - description: "PushGateway data persistent volume storageClass, if not set use default StorageClass" - type: storageclass - default: "" - - variable: prometheus.pushgateway.persistentVolume.existingClaim - label: Existing Persistent Volume Claim for PushGateway - description: "If not empty, uses the specified existing PVC instead of creating new one" - type: pvc - default: "" - -# Services and Load Balancing -- variable: ingress.enabled - label: Enable Ingress - description: "Expose app using Ingress (Layer 7 Load Balancer)" - default: true - type: boolean - show_subquestion_if: true - group: "Services and Load Balancing" - subquestions: - - variable: ingress.hosts[0] - default: "xip.io" - description: "Hostname to your CostAnalyzer installation" - type: hostname - required: true - label: Hostname diff --git a/charts/kubecost/templates/NOTES.txt b/charts/kubecost/templates/NOTES.txt deleted file mode 100644 index bbc2594e9..000000000 --- a/charts/kubecost/templates/NOTES.txt +++ /dev/null @@ -1,10 +0,0 @@ - - --------------------------------------------------- -{{- $servicePort := .Values.service.port | default 9090 -}} -Kubecost has been successfully installed. When pods are Ready, you can enable port-forwarding with the following command: - - kubectl port-forward --namespace {{ .Release.Namespace }} deployment/{{ template "cost-analyzer.fullname" . }} {{ $servicePort }} - -Next, navigate to http://localhost:{{ $servicePort }} in a web browser. - diff --git a/charts/kubecost/templates/_helpers.tpl b/charts/kubecost/templates/_helpers.tpl deleted file mode 100644 index 95e2dca20..000000000 --- a/charts/kubecost/templates/_helpers.tpl +++ /dev/null @@ -1,200 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "cost-analyzer.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "cost-analyzer.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create the fully qualified name for Prometheus server service. -*/}} -{{- define "cost-analyzer.prometheus.server.name" -}} -{{- if .Values.prometheus -}} -{{- if .Values.prometheus.server -}} -{{- if .Values.prometheus.server.fullnameOverride -}} -{{- .Values.prometheus.server.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-prometheus-server" .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- else -}} -{{- printf "%s-prometheus-server" .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- else -}} -{{- printf "%s-prometheus-server" .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} - -{{/* -Create the fully qualified name for Prometheus alertmanager service. -*/}} -{{- define "cost-analyzer.prometheus.alertmanager.name" -}} -{{- if .Values.prometheus -}} -{{- if .Values.prometheus.alertmanager -}} -{{- if .Values.prometheus.alertmanager.fullnameOverride -}} -{{- .Values.prometheus.alertmanager.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-prometheus-alertmanager" .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- else -}} -{{- printf "%s-prometheus-alertmanager" .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- else -}} -{{- printf "%s-prometheus-alertmanager" .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} - -{{- define "cost-analyzer.serviceName" -}} -{{- printf "%s-%s" .Release.Name "cost-analyzer" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Network Costs name used to tie autodiscovery of metrics to daemon set pods -*/}} -{{- define "cost-analyzer.networkCostsName" -}} -{{- printf "%s-%s" .Release.Name "network-costs" -}} -{{- end -}} - -{{- define "kubecost.clusterControllerName" -}} -{{- printf "%s-%s" .Release.Name "cluster-controller" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "cost-analyzer.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create the name of the service account -*/}} -{{- define "cost-analyzer.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "cost-analyzer.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the common labels. -*/}} -{{- define "cost-analyzer.commonLabels" -}} -app.kubernetes.io/name: {{ include "cost-analyzer.name" . }} -helm.sh/chart: {{ include "cost-analyzer.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app: cost-analyzer -{{- end -}} - -{{/* -Create the selector labels. -*/}} -{{- define "cost-analyzer.selectorLabels" -}} -app.kubernetes.io/name: {{ include "cost-analyzer.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app: cost-analyzer -{{- end -}} - -{{/* -Return the appropriate apiVersion for daemonset. -*/}} -{{- define "cost-analyzer.daemonset.apiVersion" -}} -{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.9-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for priorityClass. -*/}} -{{- define "cost-analyzer.priorityClass.apiVersion" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "scheduling.k8s.io/v1beta1" -}} -{{- else if semverCompare "^1.14-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "scheduling.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "cost-analyzer.networkPolicy.apiVersion" -}} -{{- if semverCompare ">=1.4-0, <1.7-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.7-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for podsecuritypolicy. -*/}} -{{- define "cost-analyzer.podSecurityPolicy.apiVersion" -}} -{{- if semverCompare ">=1.3-0, <1.10-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.10-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "policy/v1beta1" -}} -{{- end -}} -{{- end -}} - -{{/* -Recursive filter which accepts a map containing an input map (.v) and an output map (.r). The template -will traverse all values inside .v recursively writing non-map values to the output .r. If a nested map -is discovered, we look for an 'enabled' key. If it doesn't exist, we continue traversing the -map. If it does exist, we omit the inner map traversal iff enabled is false. This filter writes the -enabled only version to the output .r -*/}} -{{- define "cost-analyzer.filter" -}} -{{- $v := .v }} -{{- $r := .r }} -{{- range $key, $value := .v }} - {{- $tp := kindOf $value -}} - {{- if eq $tp "map" -}} - {{- $isEnabled := true -}} - {{- if (hasKey $value "enabled") -}} - {{- $isEnabled = $value.enabled -}} - {{- end -}} - {{- if $isEnabled -}} - {{- $rr := "{}" | fromYaml }} - {{- template "cost-analyzer.filter" (dict "v" $value "r" $rr) }} - {{- $_ := set $r $key $rr -}} - {{- end -}} - {{- else -}} - {{- $_ := set $r $key $value -}} - {{- end -}} -{{- end -}} -{{- end -}} - -{{/* -This template accepts a map and returns a base64 encoded json version of the map where all disabled -leaf nodes are omitted. - -The implied use case is {{ template "cost-analyzer.filterEnabled" .Values }} -*/}} -{{- define "cost-analyzer.filterEnabled" -}} -{{- $result := "{}" | fromYaml }} -{{- template "cost-analyzer.filter" (dict "v" . "r" $result) }} -{{- $result | toJson | b64enc }} -{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/templates/aws-service-key-secret.yaml b/charts/kubecost/templates/aws-service-key-secret.yaml deleted file mode 100644 index 6b8de4d5e..000000000 --- a/charts/kubecost/templates/aws-service-key-secret.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.createServiceKeySecret }} -{{- if .Values.kubecostProductConfigs.awsServiceKeyName }} -apiVersion: v1 -kind: Secret -metadata: - name: cloud-service-key -type: Opaque -stringData: - service-key.json: |- - { - "aws_access_key_id": "{{ .Values.kubecostProductConfigs.awsServiceKeyName }}", - "aws_secret_access_key": "{{ .Values.kubecostProductConfigs.awsServiceKeyPassword }}" - } -{{- end -}} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/templates/awsstore-deployment-template.yaml b/charts/kubecost/templates/awsstore-deployment-template.yaml deleted file mode 100644 index 35f5b9991..000000000 --- a/charts/kubecost/templates/awsstore-deployment-template.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if .Values.awsstore }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "cost-analyzer.fullname" . }}-awsstore - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - selector: - matchLabels: - app: awsstore - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - template: - metadata: - labels: - app: awsstore - spec: - serviceAccountName: awsstore-serviceaccount - containers: - - image: {{ .Values.awsstore.imageNameAndVersion }} - name: awsstore -{{- end }} \ No newline at end of file diff --git a/charts/kubecost/templates/awsstore-service-account-template.yaml b/charts/kubecost/templates/awsstore-service-account-template.yaml deleted file mode 100644 index 65f37e652..000000000 --- a/charts/kubecost/templates/awsstore-service-account-template.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.awsstore }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: awsstore-serviceaccount - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -{{- with .Values.awsstore.annotations }} - annotations: - {{- toYaml . | nindent 4 }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/azure-service-key-secret.yaml b/charts/kubecost/templates/azure-service-key-secret.yaml deleted file mode 100644 index bb71e064b..000000000 --- a/charts/kubecost/templates/azure-service-key-secret.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.createServiceKeySecret }} -{{- if .Values.kubecostProductConfigs.azureSubscriptionID }} -apiVersion: v1 -kind: Secret -metadata: - name: cloud-service-key -type: Opaque -stringData: - service-key.json: |- - { - "subscriptionId": "{{ .Values.kubecostProductConfigs.azureSubscriptionID }}", - "serviceKey": { - "appId": "{{ .Values.kubecostProductConfigs.azureClientID }}", - "password": "{{ .Values.kubecostProductConfigs.azureClientPassword }}", - "tenant": "{{ .Values.kubecostProductConfigs.azureTenantID }}" - } - } -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-alerts-configmap.yaml b/charts/kubecost/templates/cost-analyzer-alerts-configmap.yaml deleted file mode 100644 index b627cf874..000000000 --- a/charts/kubecost/templates/cost-analyzer-alerts-configmap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.global.notifications.alertConfigs }} -{{- if .Values.global.notifications.alertConfigs.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: alert-configs - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - alerts.json: '{{ toJson .Values.global.notifications.alertConfigs }}' -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-checks-template.yaml b/charts/kubecost/templates/cost-analyzer-checks-template.yaml deleted file mode 100644 index eef8d187d..000000000 --- a/charts/kubecost/templates/cost-analyzer-checks-template.yaml +++ /dev/null @@ -1,63 +0,0 @@ -{{- if .Values.kubecostChecks -}} -{{- if .Values.kubecostChecks.enabled -}} -apiVersion: batch/v1beta1 -kind: CronJob -metadata: - name: cost-analyzer-checks - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - {{- if .Values.kubecostChecks.debug }} - schedule: "*/1 * * * *" - {{- else if .Values.kubecostChecks.schedule }} - schedule: {{ .Values.kubecostChecks.schedule | quote }} - {{- else }} - schedule: "*/10 * * * *" - {{- end }} - jobTemplate: - metadata: - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 8 }} - spec: - template: - spec: - containers: - - name: cost-analyzer-checks - {{- if .Values.kubecostChecks }} - image: {{ .Values.kubecostChecks.image }}:prod-{{ $.Chart.AppVersion }} - {{- else }} - image: gcr.io/kubecost1/checks:prod-{{ $.Chart.AppVersion }} - {{ end }} - imagePullPolicy: Always - args: - - node - - ./node/cron.js - resources: -{{ toYaml .Values.kubecostChecks.resources | indent 14 }} - env: - - name: COST_ANALYZER_SERVER_ENDPOINT - value: {{ template "cost-analyzer.serviceName" . }}.{{ .Release.Namespace }}:9001 - - name: COST_ANALYZER_MODEL_ENDPOINT - {{- if .Values.saml.enabled }} - value: {{ template "cost-analyzer.serviceName" . }}.{{ .Release.Namespace }}:9004 - {{- else }} - value: {{ template "cost-analyzer.serviceName" . }}.{{ .Release.Namespace }}:9003 - {{ end }} - {{- if .Values.kubecostChecks }} - {{- if .Values.kubecostChecks.debug }} - - name: SEND_UPDATES_NOW - value: "true" - {{- end }} - {{- end }} - - name: PROMETHEUS_ALERTMANAGER_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: prometheus-alertmanager-endpoint - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - restartPolicy: OnFailure -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-cluser-role-template.yaml b/charts/kubecost/templates/cost-analyzer-cluser-role-template.yaml deleted file mode 100644 index 16f926e8a..000000000 --- a/charts/kubecost/templates/cost-analyzer-cluser-role-template.yaml +++ /dev/null @@ -1,105 +0,0 @@ -{{- if and .Values.reporting .Values.reporting.logCollection -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - namespace: {{ .Release.Namespace }} - name: {{ template "cost-analyzer.serviceAccountName" . }} -rules: -- apiGroups: - - '' - resources: - - "pods/log" - verbs: - - get - - list - - watch ---- -{{- end }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "cost-analyzer.serviceAccountName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -rules: - - apiGroups: - - '' - resources: - - configmaps - - deployments - - nodes - - pods - - events - - services - - resourcequotas - - replicationcontrollers - - limitranges - - persistentvolumeclaims - - persistentvolumes - - namespaces - - endpoints - verbs: - - get - - list - - watch - - apiGroups: - - extensions - resources: - - daemonsets - - deployments - - replicasets - verbs: - - get - - list - - watch - - apiGroups: - - apps - resources: - - statefulsets - - deployments - - daemonsets - - replicasets - verbs: - - list - - watch - - apiGroups: - - batch - resources: - - cronjobs - - jobs - verbs: - - get - - list - - watch - - apiGroups: - - autoscaling - resources: - - horizontalpodautoscalers - verbs: - - get - - list - - watch - - apiGroups: - - policy - resources: - - poddisruptionbudgets - verbs: - - get - - list - - watch - - apiGroups: - - storage.k8s.io - resources: - - storageclasses - verbs: - - get - - list - - watch - - apiGroups: - - events.k8s.io - resources: - - events - verbs: - - get - - list - - watch diff --git a/charts/kubecost/templates/cost-analyzer-cluster-role-binding-template.yaml b/charts/kubecost/templates/cost-analyzer-cluster-role-binding-template.yaml deleted file mode 100644 index f2952b923..000000000 --- a/charts/kubecost/templates/cost-analyzer-cluster-role-binding-template.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- if .Values.reporting }} -{{- if .Values.reporting.logCollection }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "cost-analyzer.serviceAccountName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "cost-analyzer.serviceAccountName" . }} -subjects: - - kind: ServiceAccount - name: {{ template "cost-analyzer.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} ---- -{{- end }} -{{- end }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "cost-analyzer.serviceAccountName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "cost-analyzer.serviceAccountName" . }} -subjects: - - kind: ServiceAccount - name: {{ template "cost-analyzer.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-config-map-template.yaml b/charts/kubecost/templates/cost-analyzer-config-map-template.yaml deleted file mode 100644 index 86aa0ee51..000000000 --- a/charts/kubecost/templates/cost-analyzer-config-map-template.yaml +++ /dev/null @@ -1,30 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "cost-analyzer.fullname" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - {{- if .Values.global.prometheus.enabled }} - {{- if .Values.global.zone }} - prometheus-alertmanager-endpoint: http://{{ template "cost-analyzer.prometheus.alertmanager.name" . }}.{{ .Release.Namespace }}.svc.{{ .Values.global.zone }} - {{ else }} - prometheus-alertmanager-endpoint: http://{{ template "cost-analyzer.prometheus.alertmanager.name" . }}.{{ .Release.Namespace }} - {{- end -}} - {{ else }} - prometheus-alertmanager-endpoint: {{ .Values.global.notifications.alertmanager.fqdn }} - {{- end -}} - {{- if .Values.global.prometheus.enabled }} - {{- if .Values.global.zone }} - prometheus-server-endpoint: http://{{ template "cost-analyzer.prometheus.server.name" . }}.{{ .Release.Namespace }}.svc.{{ .Values.global.zone }} - {{ else }} - prometheus-server-endpoint: http://{{ template "cost-analyzer.prometheus.server.name" . }}.{{ .Release.Namespace }} - {{- end -}} - {{ else }} - prometheus-server-endpoint: {{ .Values.global.prometheus.fqdn }} - {{- end -}} - {{- if .Values.kubecostToken }} - kubecost-token: {{ .Values.kubecostToken }} - {{ else }} - kubecost-token: not-applied - {{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-db-pvc-template.yaml b/charts/kubecost/templates/cost-analyzer-db-pvc-template.yaml deleted file mode 100644 index 38b7e92f8..000000000 --- a/charts/kubecost/templates/cost-analyzer-db-pvc-template.yaml +++ /dev/null @@ -1,29 +0,0 @@ -{{- if (.Values.kubecostModel.etlToDisk | default true) -}} -{{- if .Values.persistentVolume -}} -{{- if not .Values.persistentVolume.dbExistingClaim -}} -{{- if .Values.persistentVolume.enabled -}} -{{- if .Values.persistentVolume.dbPVEnabled -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ template "cost-analyzer.fullname" . }}-db - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - accessModes: - - ReadWriteOnce - {{- if .Values.persistentVolume.dbStorageClass }} - storageClassName: {{ .Values.persistentVolume.dbStorageClass }} - {{ end }} - resources: - requests: - {{- if .Values.persistentVolume }} - storage: {{ .Values.persistentVolume.dbSize }} - {{- else }} - storage: 32.0Gi - {{ end }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-deployment-template.yaml b/charts/kubecost/templates/cost-analyzer-deployment-template.yaml deleted file mode 100644 index 2bfd2896b..000000000 --- a/charts/kubecost/templates/cost-analyzer-deployment-template.yaml +++ /dev/null @@ -1,672 +0,0 @@ -{{- $nginxPort := int .Values.service.port | default 9090 -}} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "cost-analyzer.fullname" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -{{- if .Values.kubecostDeployment }} -{{- with .Values.kubecostDeployment.labels }} -{{ toYaml . | indent 4 }} -{{- end }} -{{- end }} -spec: -{{- if .Values.kubecostDeployment }} - replicas: {{ .Values.kubecostDeployment.replicas | default 1 }} -{{- end }} - selector: - matchLabels: -{{ include "cost-analyzer.selectorLabels" . | nindent 8}} - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - template: - metadata: - labels: - {{ include "cost-analyzer.selectorLabels" . | nindent 8 }} -{{- if .Values.kubecostDeployment }} -{{- with .Values.kubecostDeployment.labels }} -{{ toYaml . | indent 8 }} -{{- end }} -{{- end }} -{{- if .Values.global.podAnnotations}} - annotations: -{{- with .Values.global.podAnnotations }} -{{ toYaml . | indent 8 }} -{{- end }} -{{- end }} - spec: - {{- if .Values.kubecostFrontend.tls }} - {{- if .Values.kubecostFrontend.tls.enabled }} - securityContext: - runAsUser: 0 - {{- else }} - securityContext: - runAsUser: 1001 - runAsGroup: 1001 - fsGroup: 1001 - {{- end }} - {{- else if lt $nginxPort 1025 }} - securityContext: - runAsUser: 0 - {{- else }} - securityContext: - runAsUser: 1001 - runAsGroup: 1001 - fsGroup: 1001 - {{- end }} - restartPolicy: Always - serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} - volumes: - - name: nginx-conf - configMap: - name: nginx-conf - items: - - key: nginx.conf - path: default.conf - {{- if .Values.kubecostProductConfigs }} - {{- if .Values.kubecostProductConfigs.productKey }} - {{- if .Values.kubecostProductConfigs.productKey.secretname }} - - name: productkey-secret - secret: - secretName: {{ .Values.kubecostProductConfigs.productKey.secretname }} - items: - - key: productkey.json - path: productkey.json - {{- end }} - {{- end -}} - {{- if .Values.kubecostProductConfigs.gcpSecretName }} - - name: gcp-key-secret - secret: - secretName: {{ .Values.kubecostProductConfigs.gcpSecretName }} - items: - - key: compute-viewer-kubecost-key.json - path: key.json - {{- end }} - {{- if .Values.kubecostProductConfigs.serviceKeySecretName }} - - name: service-key-secret - secret: - secretName: {{ .Values.kubecostProductConfigs.serviceKeySecretName }} - {{- else if .Values.kubecostProductConfigs.createServiceKeySecret }} - - name: service-key-secret - secret: - secretName: cloud-service-key - {{- end }} - {{- if .Values.kubecostProductConfigs.clusters }} - - name: kubecost-clusters - configMap: - name: kubecost-clusters - {{- range .Values.kubecostProductConfigs.clusters }} - {{- if .auth }} - {{- if .auth.secretName }} - - name: {{ .auth.secretName }} - secret: - secretName: {{ .auth.secretName }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.kubecostFrontend.tls }} - {{- if .Values.kubecostFrontend.tls.enabled }} - - name: tls - secret: - secretName : {{ .Values.kubecostFrontend.tls.secretName }} - items: - - key: tls.crt - path: kc.crt - - key: tls.key - path: kc.key - {{- end }} - {{- end }} - {{- if .Values.saml }} - {{- if .Values.saml.enabled }} - {{- if .Values.saml.secretName }} - - name: secret-volume - secret: - secretName: {{ .Values.saml.secretName }} - {{- end }} - {{- if .Values.saml.metadataSecretName }} - - name: metadata-secret-volume - secret: - secretName: {{ .Values.saml.metadataSecretName }} - {{- end }} - {{- if .Values.saml.rbac.enabled }} - - name: saml-roles - configMap: - name: {{ template "cost-analyzer.fullname" . }}-saml - {{- end }} - {{- end }} - {{- end }} - - name: persistent-configs -{{- if .Values.persistentVolume }} -{{- if .Values.persistentVolume.enabled }} - persistentVolumeClaim: -{{- if .Values.persistentVolume.existingClaim }} - claimName: {{ .Values.persistentVolume.existingClaim }} -{{- else }} - claimName: {{ template "cost-analyzer.fullname" . }} -{{- end -}} -{{- else }} - emptyDir: {} -{{- end -}} -{{- else }} - persistentVolumeClaim: - claimName: {{ template "cost-analyzer.fullname" . }} -{{- end }} -{{- if and (.Values.kubecostModel.etlToDisk | default true) .Values.persistentVolume.dbPVEnabled }} - - name: persistent-db -{{- if .Values.persistentVolume }} -{{- if .Values.persistentVolume.enabled }} - persistentVolumeClaim: -{{- if .Values.persistentVolume.dbExistingClaim }} - claimName: {{ .Values.persistentVolume.dbExistingClaim }} -{{- else }} - claimName: {{ template "cost-analyzer.fullname" . }}-db -{{- end -}} -{{- else }} - emptyDir: {} -{{- end -}} -{{- else }} - persistentVolumeClaim: - claimName: {{ template "cost-analyzer.fullname" . }}-db -{{- end }} -{{- end }} - initContainers: -{{- if .Values.supportNFS }} - - name: config-db-perms-fix - {{- if .Values.initChownDataImage }} - image: {{ .Values.initChownDataImage }} - {{- else }} - image: busybox - {{- end }} - resources: -{{ toYaml .Values.initChownData.resources | indent 12 }} - {{- if and (.Values.kubecostModel.etlToDisk | default true) .Values.persistentVolume.dbPVEnabled }} - command: ["sh", "-c", "/bin/chmod -R 777 /var/configs && /bin/chmod -R 777 /var/db"] - {{- else }} - command: ["sh", "-c", "/bin/chmod -R 777 /var/configs"] - {{- end}} - volumeMounts: - - name: persistent-configs - mountPath: /var/configs - {{- if and (.Values.kubecostModel.etlToDisk | default true) .Values.persistentVolume.dbPVEnabled }} - - name: persistent-db - mountPath: /var/db - {{- end }} - securityContext: - runAsUser: 0 -{{ end }} - containers: - {{- if .Values.kubecostModel }} - {{- if .Values.imageVersion}} - - image: {{ .Values.kubecostModel.image }}:{{ .Values.imageVersion }} - {{- else }} - - image: {{ .Values.kubecostModel.image }}:prod-{{ $.Chart.AppVersion }} - {{ end }} - {{- else }} - - image: gcr.io/kubecost1/cost-model:prod-{{ $.Chart.AppVersion }} - {{ end }} - name: cost-model - {{- if .Values.kubecostModel.imagePullPolicy }} - imagePullPolicy: {{ .Values.kubecostModel.imagePullPolicy }} - {{- else }} - imagePullPolicy: Always - {{- end }} - resources: -{{ toYaml .Values.kubecostModel.resources | indent 12 }} - readinessProbe: - httpGet: - path: /healthz - port: 9003 - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - volumeMounts: - - name: persistent-configs - mountPath: /var/configs - {{- if and (.Values.kubecostModel.etlToDisk | default true) .Values.persistentVolume.dbPVEnabled }} - - name: persistent-db - mountPath: /var/db - {{- end }} - {{- if .Values.kubecostProductConfigs }} - {{- if .Values.kubecostProductConfigs.productKey }} - {{- if .Values.kubecostProductConfigs.productKey.secretname }} - - name: productkey-secret - mountPath: /var/configs/productkey - {{- end }} - {{- end }} - {{- if .Values.kubecostProductConfigs.gcpSecretName }} - - name: gcp-key-secret - mountPath: /models - {{- end }} - {{- if or .Values.kubecostProductConfigs.serviceKeySecretName .Values.kubecostProductConfigs.createServiceKeySecret }} - - name: service-key-secret - mountPath: /var/secrets - {{- end }} - {{- if .Values.kubecostProductConfigs.clusters }} - - name: kubecost-clusters - mountPath: /var/configs/clusters - {{- range .Values.kubecostProductConfigs.clusters }} - {{- if .auth }} - {{- if .auth.secretName }} - - name: {{ .auth.secretName }} - mountPath: /var/secrets/{{ .auth.secretName }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.saml }} - {{- if .Values.saml.enabled }} - {{- if .Values.saml.secretName }} - - name: secret-volume - mountPath: /var/configs/secret-volume - {{- end }} - {{- if .Values.saml.metadataSecretName }} - - name: metadata-secret-volume - mountPath: /var/configs/metadata-secret-volume - {{- end }} - {{- if .Values.saml.rbac.enabled }} - - name: saml-roles - mountPath: /var/configs/saml - {{- end }} - {{- end }} - {{- end }} - env: - - name: PROMETHEUS_SERVER_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: prometheus-server-endpoint - - name: CLOUD_PROVIDER_API_KEY - value: "AIzaSyDXQPG_MHUEy9neR7stolq6l0ujXmjJlvk" # The GCP Pricing API requires a key. - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/configs/key.json - - name: CONFIG_PATH - value: /var/configs/ - - name: DB_PATH - value: /var/db/ - - name: CLUSTER_PROFILE - {{- if .Values.kubecostProductConfigs }} - value: {{ .Values.kubecostProductConfigs.clusterProfile | default "production" }} - {{- else }} - value: production - {{- end }} - - name: REMOTE_WRITE_PASSWORD - value: {{ .Values.remoteWrite.postgres.auth.password }} - {{- if .Values.remoteWrite.postgres.enabled }} - - name: REMOTE_WRITE_ENABLED - value: "true" - {{- end }} - - name: GOGC - value: "60" - {{- if .Values.global.thanos.queryServiceBasicAuthSecretName}} - - name: MC_BASIC_AUTH_USERNAME - valueFrom: - secretKeyRef: - name: {{ .Values.global.thanos.queryServiceBasicAuthSecretName }} - key: USERNAME - - name: MC_BASIC_AUTH_PW - valueFrom: - secretKeyRef: - name: {{ .Values.global.thanos.queryServiceBasicAuthSecretName }} - key: PASSWORD - {{- end }} - {{- if .Values.global.prometheus.queryServiceBasicAuthSecretName}} - - name: DB_BASIC_AUTH_USERNAME - valueFrom: - secretKeyRef: - name: {{ .Values.global.prometheus.queryServiceBasicAuthSecretName }} - key: USERNAME - - name: DB_BASIC_AUTH_PW - valueFrom: - secretKeyRef: - name: {{ .Values.global.prometheus.queryServiceBasicAuthSecretName }} - key: PASSWORD - {{- end }} - {{- if .Values.global.prometheus.queryServiceBearerTokenSecretName }} - - name: DB_BEARER_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.global.prometheus.queryServiceBearerTokenSecretName }} - key: TOKEN - {{- end }} - {{- if .Values.global.thanos.queryServiceBearerTokenSecretName }} - - name: MC_BEARER_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.global.thanos.queryServiceBearerTokenSecretName }} - key: TOKEN - {{- end }} - {{- if .Values.global.prometheus.insecureSkipVerify }} - - name: INSECURE_SKIP_VERIFY - value: {{ (quote .Values.global.prometheus.insecureSkipVerify) }} - {{- end }} - {{- if .Values.pricingCsv }} - {{- if .Values.pricingCsv.enabled }} - - name: USE_CSV_PROVIDER - value: "true" - - name: CSV_PATH - value: {{ .Values.pricingCsv.location.URI }} - - name: CSV_REGION - value: {{ .Values.pricingCsv.location.region }} - {{- if eq .Values.pricingCsv.location.provider "AWS"}} - {{- if .Values.pricingCsv.location.csvAccessCredentials }} - - name: AWS_ACCESS_KEY_ID - valueFrom: - secretKeyRef: - name: {{ .Values.pricingCsv.location.csvAccessCredentials }} - key: AWS_ACCESS_KEY_ID - - name: AWS_SECRET_ACCESS_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.pricingCsv.location.csvAccessCredentials }} - key: AWS_SECRET_ACCESS_KEY - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.reporting }} - - name: LOG_COLLECTION_ENABLED - value: {{ (quote .Values.reporting.logCollection ) | default (quote true) }} - - name: PRODUCT_ANALYTICS_ENABLED - value: {{ (quote .Values.reporting.productAnalytics ) | default (quote true) }} - - name: ERROR_REPORTING_ENABLED - value: {{ (quote .Values.reporting.errorReporting ) | default (quote true) }} - - name: VALUES_REPORTING_ENABLED - value: {{ (quote .Values.reporting.valuesReporting) | default (quote true) }} - {{- if .Values.reporting.errorReporting }} - - name: SENTRY_DSN - value: "https://71964476292e4087af8d5072afe43abd@o394722.ingest.sentry.io/5245431" - {{- end }} - {{- end }} - - name: CACHE_WARMING_ENABLED - value: {{ (quote .Values.kubecostModel.warmCache) | default (quote true) }} - - name: SAVINGS_CACHE_WARMING_ENABLED - value: {{ (quote .Values.kubecostModel.warmSavingsCache) | default (quote true) }} - - name: ETL_ENABLED - value: {{ (quote .Values.kubecostModel.etl) | default (quote true) }} - - name: ETL_TO_DISK_ENABLED - value: {{ (quote .Values.kubecostModel.etlToDisk) | default (quote true) }} - - name : ETL_CLOUD_ASSETS_ENABLED - value: {{ (quote .Values.kubecostModel.etlCloudAssets) | default (quote true) }} - {{- if .Values.persistentVolume.dbPVEnabled }} - - name: ETL_PATH_PREFIX - value: "/var/db" - {{- end }} - {{- if .Values.kubecostModel.etlStoreDurationDays }} - - name: ETL_STORE_DURATION_DAYS - value: {{ (quote .Values.kubecostModel.etlStoreDurationDays) | default (quote 120) }} - {{- end }} - - name: PV_ENABLED - value: {{ (quote .Values.persistentVolume.enabled) | default (quote true) }} - - name: MAX_QUERY_CONCURRENCY - value: {{ (quote .Values.kubecostModel.maxQueryConcurrency) | default (quote 5) }} - - name: UTC_OFFSET - value: {{ (quote .Values.kubecostModel.utcOffset) | default (quote ) }} - {{- if .Values.networkCosts }} - {{- if .Values.networkCosts.enabled }} - - name: NETWORK_COSTS_PORT - value: {{ quote .Values.networkCosts.port | default (quote 3001) }} - {{- end }} - {{- end }} - {{- /* - If queryService is set, the cost-analyzer will always pass THANOS_ENABLED as true - to ensure that the custom query service target is used. The global.thanos.enabled - flag does not have any affect on this behavior. - */}} - {{- if .Values.global.thanos.queryService }} - - name: THANOS_ENABLED - value: "true" - - name: THANOS_QUERY_URL - value: {{ .Values.global.thanos.queryService }} - - name: THANOS_QUERY_OFFSET - value: {{ .Values.global.thanos.queryOffset | default "3h" }} - - name: THANOS_MAX_SOURCE_RESOLUTION - value: {{ .Values.kubecostModel.maxSourceResolution | default "raw" }} - {{- else if and .Values.global.thanos.enabled .Values.thanos }} - {{- if .Values.thanos.query }} - {{- if .Values.thanos.query.enabled }} - - name: THANOS_ENABLED - value: "true" - - name: THANOS_QUERY_URL - value: http://{{ .Release.Name }}-thanos-query-frontend-http.{{ .Release.Namespace }}:{{ .Values.thanos.queryFrontend.http.port }} - - name: THANOS_QUERY_OFFSET - value: {{ .Values.global.thanos.queryOffset | default "3h" }} - - name: THANOS_MAX_SOURCE_RESOLUTION - value: {{ .Values.kubecostModel.maxSourceResolution | default "raw" }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.saml }} - {{- if .Values.saml.enabled }} - - name: SAML_ENABLED - value: "true" - - name: IDP_URL - value: {{ .Values.saml.idpMetadataURL }} - - name: SP_HOST - value: {{ .Values.saml.appRootURL }} - {{- if .Values.saml.audienceURI }} - - name: AUDIENCE_URI - value: {{ .Values.saml.audienceURI }} - {{- end }} - {{- if .Values.saml.rbac.enabled }} - - name: SAML_RBAC_ENABLED - value: "true" - {{- end }} - {{- end }} - {{- end }} - {{- if and (.Values.prometheus.server.global.external_labels.cluster_id) (not .Values.prometheus.server.clusterIDConfigmap) }} - - name: CLUSTER_ID - value: {{ .Values.prometheus.server.global.external_labels.cluster_id }} - {{- end }} - {{- if .Values.prometheus.server.clusterIDConfigmap }} - - name: CLUSTER_ID - valueFrom: - configMapKeyRef: - name: {{ .Values.prometheus.server.clusterIDConfigmap }} - key: CLUSTER_ID - {{- end }} - {{- if .Values.remoteWrite.postgres.installLocal }} - - name: SQL_ADDRESS - value: pgprometheus - {{- else }} - - name: SQL_ADDRESS - value: {{ .Values.remoteWrite.postgres.remotePostgresAddress }} - {{- end }} - - name: RELEASE_NAME - value: {{ .Release.Name }} - - name: KUBECOST_NAMESPACE - value: {{ .Release.Namespace }} - - name: KUBECOST_TOKEN - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: kubecost-token - {{- if .Values.kubecostFrontend }} - {{- if .Values.imageVersion}} - - image: {{ .Values.kubecostFrontend.image }}:{{ .Values.imageVersion }} - {{- else }} - - image: {{ .Values.kubecostFrontend.image }}:prod-{{ $.Chart.AppVersion }} - {{ end }} - {{- else }} - - image: gcr.io/kubecost1/frontend:prod-{{ $.Chart.AppVersion }} - {{ end }} - {{- if .Values.kubecostFrontend.tls }} - {{- if .Values.kubecostFrontend.tls.enabled }} - command: ["nginx", "-g", "daemon off;"] - ports: - - containerPort: 443 - {{- end }} - {{- end }} - env: - - name: GET_HOSTS_FROM - value: dns - name: cost-analyzer-frontend - volumeMounts: - - name: nginx-conf - mountPath: /etc/nginx/conf.d/ - {{- if .Values.kubecostFrontend.tls }} - {{- if .Values.kubecostFrontend.tls.enabled }} - - name: tls - mountPath: /etc/ssl/certs - {{- end }} - {{- end }} - resources: -{{ toYaml .Values.kubecostFrontend.resources | indent 12 }} - {{- if .Values.kubecostFrontend.imagePullPolicy }} - imagePullPolicy: {{ .Values.kubecostFrontend.imagePullPolicy }} - {{- else }} - imagePullPolicy: Always - {{- end }} - readinessProbe: - httpGet: - path: /healthz - port: 9003 - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - {{- if .Values.kubecost }} - {{- if .Values.imageVersion}} - - image: {{ .Values.kubecost.image }}:{{ .Values.imageVersion }} - {{- else }} - - image: {{ .Values.kubecost.image }}:prod-{{ $.Chart.AppVersion }} - {{ end }} - {{- else }} - - image: gcr.io/kubecost1/server:prod-{{ $.Chart.AppVersion }} - {{ end }} - resources: -{{ toYaml .Values.kubecost.resources | indent 12 }} - name: cost-analyzer-server - readinessProbe: - httpGet: - path: /healthz - port: 9003 - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - volumeMounts: - - name: persistent-configs - mountPath: /var/configs - env: - - name: PROMETHEUS_SERVER_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: prometheus-server-endpoint - {{- if .Values.reporting }} - {{- if .Values.reporting.valuesReporting }} - - name: HELM_VALUES - value: {{ template "cost-analyzer.filterEnabled" .Values }} - {{- end }} - {{- end }} - {{- if .Values.global.prometheus.insecureSkipVerify }} - - name: INSECURE_SKIP_VERIFY - value: {{ (quote .Values.global.prometheus.insecureSkipVerify) }} - {{- end }} - {{- /* - If queryService is set, the cost-analyzer will always pass THANOS_ENABLED as true - to ensure that the custom query service target is used. The global.thanos.enabled - flag does not have any affect on this behavior. - */}} - {{- if .Values.global.thanos.queryService }} - - name: THANOS_ENABLED - value: "true" - - name: THANOS_QUERY_URL - value: {{ .Values.global.thanos.queryService }} - - name: THANOS_QUERY_OFFSET - value: {{ .Values.global.thanos.queryOffset | default "3h" }} - - name: THANOS_MAX_SOURCE_RESOLUTION - value: {{ .Values.kubecostModel.maxSourceResolution | default "raw" }} - {{- else if and .Values.global.thanos.enabled .Values.thanos }} - {{- if .Values.thanos.query }} - {{- if .Values.thanos.query.enabled }} - - name: THANOS_ENABLED - value: "true" - - name: THANOS_QUERY_URL - value: http://{{ .Release.Name }}-thanos-query-frontend-http.{{ .Release.Namespace }}:{{ .Values.thanos.queryFrontend.http.port }} - - name: THANOS_QUERY_OFFSET - value: {{ .Values.global.thanos.queryOffset | default "3h" }} - - name: THANOS_MAX_SOURCE_RESOLUTION - value: {{ .Values.kubecostModel.maxSourceResolution | default "raw" }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.global.thanos.queryServiceBasicAuthSecretName}} - - name: MC_BASIC_AUTH_USERNAME - valueFrom: - secretKeyRef: - name: {{ .Values.global.thanos.queryServiceBasicAuthSecretName }} - key: USERNAME - - name: MC_BASIC_AUTH_PW - valueFrom: - secretKeyRef: - name: {{ .Values.global.thanos.queryServiceBasicAuthSecretName }} - key: PASSWORD - {{- end }} - {{- if .Values.global.prometheus.queryServiceBasicAuthSecretName}} - - name: DB_BASIC_AUTH_USERNAME - valueFrom: - secretKeyRef: - name: {{ .Values.global.prometheus.queryServiceBasicAuthSecretName }} - key: USERNAME - - name: DB_BASIC_AUTH_PW - valueFrom: - secretKeyRef: - name: {{ .Values.global.prometheus.queryServiceBasicAuthSecretName }} - key: PASSWORD - {{- end }} - {{- if .Values.global.prometheus.queryServiceBearerTokenSecretName }} - - name: DB_BEARER_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.global.prometheus.queryServiceBearerTokenSecretName }} - key: TOKEN - {{- end }} - {{- if .Values.global.thanos.queryServiceBearerTokenSecretName }} - - name: MC_BEARER_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.global.thanos.queryServiceBearerTokenSecretName }} - key: TOKEN - {{- end }} - - name: KUBECOST_NAMESPACE - value: {{ .Release.Namespace }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/configs/key.json - - name: KUBECOST_TOKEN - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: kubecost-token - {{- if eq .Values.global.grafana.proxy false }} - - name: GRAFANA_URL - valueFrom: - configMapKeyRef: - name: external-grafana-config-map - key: grafanaURL - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.priority }} - {{- if .Values.priority.enabled }} - priorityClassName: {{ template "cost-analyzer.fullname" . }}-priority - {{- end }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-frontend-config-map-template.yaml b/charts/kubecost/templates/cost-analyzer-frontend-config-map-template.yaml deleted file mode 100644 index 429ed1f90..000000000 --- a/charts/kubecost/templates/cost-analyzer-frontend-config-map-template.yaml +++ /dev/null @@ -1,174 +0,0 @@ -{{- $serviceName := include "cost-analyzer.serviceName" . -}} -{{- $nginxPort := .Values.service.targetPort | default 9090 -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: nginx-conf - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - nginx.conf: | - gzip_static on; - - # Enable gzip encoding for content of the provided types of 50kb and higher. - gzip on; - gzip_min_length 50000; - gzip_proxied expired no-cache no-store private auth; - gzip_types - text/plain - text/css - text/xml - text/javascript - application/x-javascript - application/xml - application/json; - - upstream api { - server {{ $serviceName }}.{{ .Release.Namespace }}:9001; - } - - upstream model { - server {{ $serviceName }}.{{ .Release.Namespace }}:9003; - } - -{{- if .Values.clusterController }} -{{- if .Values.clusterController.enabled }} - upstream clustercontroller { - server {{ template "kubecost.clusterControllerName" . }}-service.{{ .Release.Namespace }}:9731; - } -{{- end }} -{{- end }} - -{{- if .Values.global.grafana.proxy }} - upstream grafana { -{{- if .Values.global.grafana.enabled }} - server {{ .Release.Name }}-grafana.{{ .Release.Namespace }}; -{{ else }} - server {{.Values.global.grafana.domainName}}; -{{ end }} - } -{{ end }} - - server { - server_name _; - root /var/www; - index index.html; - add_header Cache-Control "max-age=300"; - add_header Cache-Control "must-revalidate"; -{{- if .Values.imageVersion }} - add_header ETag "{{ $.Values.imageVersion }}"; -{{- else }} - add_header ETag "{{ $.Chart.Version }}"; -{{- end }} -{{- if .Values.kubecostFrontend.tls }} -{{- if .Values.kubecostFrontend.tls.enabled }} - ssl_certificate /etc/ssl/certs/kc.crt; - ssl_certificate_key /etc/ssl/certs/kc.key; - listen 443 ssl; -{{- else }} - listen {{ $nginxPort }}; -{{- end }} -{{- else }} - listen {{ $nginxPort }}; -{{- end }} - location /api/ { - {{- if .Values.saml.enabled }} - auth_request /auth; - {{- end }} - proxy_pass http://api/; - proxy_redirect off; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - location /model/ { - proxy_connect_timeout 180; - proxy_send_timeout 180; - proxy_read_timeout 180; - proxy_pass http://model/; - proxy_redirect off; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - - location ~ ^/(turndown|cluster)/ { - - add_header 'Access-Control-Allow-Origin' '*' always; -{{- if .Values.clusterController }} -{{- if .Values.clusterController.enabled }} - {{- if .Values.saml }} - {{- if .Values.saml.enabled }} - auth_request /auth; - {{- else if .Values.saml.rbac.enabled}} - auth_request /authrbac; - {{- end }} - {{- end }} - - rewrite ^/(?:turndown|cluster)/(.*)$ /$1 break; - proxy_pass http://clustercontroller; - proxy_connect_timeout 180; - proxy_send_timeout 180; - proxy_read_timeout 180; - proxy_redirect off; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - -{{- else }} - return 404; -{{- end }} -{{- else }} - return 404; -{{- end }} - } - location /saml/ { - proxy_connect_timeout 180; - proxy_send_timeout 180; - proxy_read_timeout 180; - proxy_pass http://model/saml/; - proxy_redirect off; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - location /login { - proxy_connect_timeout 180; - proxy_send_timeout 180; - proxy_read_timeout 180; - proxy_pass http://model/login; - proxy_redirect off; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - - {{- if .Values.global.grafana.proxy }} - location /grafana/ { - {{- if .Values.saml.enabled }} - auth_request /auth; - {{- end }} - proxy_pass http://grafana/; - proxy_redirect off; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - {{ end }} - {{- if .Values.saml.enabled }} - location /auth { - proxy_pass http://model/isAuthenticated; - } - {{- end }} - {{- if .Values.saml.rbac.enabled }} - location /authrbac { - proxy_pass http://model/isAdminAuthenticated; - } - {{- end }} - } diff --git a/charts/kubecost/templates/cost-analyzer-ingress-template.yaml b/charts/kubecost/templates/cost-analyzer-ingress-template.yaml deleted file mode 100644 index 1b6e8776a..000000000 --- a/charts/kubecost/templates/cost-analyzer-ingress-template.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- if .Values.ingress -}} -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "cost-analyzer.fullname" . -}} -{{- $serviceName := include "cost-analyzer.serviceName" . -}} -{{- $ingressPaths := .Values.ingress.paths -}} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} -{{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ . | quote }} - http: - paths: - {{- range $ingressPaths }} - - path: {{ . }} - backend: - serviceName: {{ $serviceName }} - servicePort: frontend - {{- end }} - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-network-costs-config-map-template.yaml b/charts/kubecost/templates/cost-analyzer-network-costs-config-map-template.yaml deleted file mode 100644 index 37276f297..000000000 --- a/charts/kubecost/templates/cost-analyzer-network-costs-config-map-template.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.networkCosts -}} -{{- if .Values.networkCosts.enabled -}} -{{- if .Values.networkCosts.config -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: network-costs-config - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - config.yaml: | -{{- toYaml .Values.networkCosts.config | nindent 4 }} -{{- end -}} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-network-costs-podmonitor-template.yaml b/charts/kubecost/templates/cost-analyzer-network-costs-podmonitor-template.yaml deleted file mode 100644 index d45567616..000000000 --- a/charts/kubecost/templates/cost-analyzer-network-costs-podmonitor-template.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if .Values.networkCosts }} -{{- if .Values.networkCosts.enabled }} -{{- if .Values.networkCosts.podMonitor }} -{{- if .Values.networkCosts.podMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: PodMonitor -metadata: - name: {{ include "cost-analyzer.networkCostsName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if .Values.networkCosts.podMonitor.additionalLabels }} - {{ toYaml .Values.networkCosts.podMonitor.additionalLabels | nindent 4 }} - {{- end }} -spec: - podMetricsEndpoints: - - port: http-server - honorLabels: true - interval: 1m - scrapeTimeout: 10s - path: /metrics - scheme: http - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - selector: - matchLabels: - app: {{ template "cost-analyzer.networkCostsName" . }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-network-costs-template.yaml b/charts/kubecost/templates/cost-analyzer-network-costs-template.yaml deleted file mode 100644 index e87d8d44b..000000000 --- a/charts/kubecost/templates/cost-analyzer-network-costs-template.yaml +++ /dev/null @@ -1,93 +0,0 @@ -{{- if .Values.networkCosts -}} -{{- if .Values.networkCosts.enabled -}} -apiVersion: {{ include "cost-analyzer.daemonset.apiVersion" . }} -kind: DaemonSet -metadata: - name: {{ template "cost-analyzer.networkCostsName" . }} - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - updateStrategy: - type: RollingUpdate - selector: - matchLabels: - app: {{ template "cost-analyzer.networkCostsName" . }} - template: - metadata: - labels: - app: {{ template "cost-analyzer.networkCostsName" . }} - spec: - hostNetwork: true - serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} - containers: - - name: {{ template "cost-analyzer.networkCostsName" . }} - image: {{ .Values.networkCosts.image }} -{{- if .Values.networkCosts.imagePullPolicy }} - imagePullPolicy: {{ .Values.networkCosts.imagePullPolicy }} -{{- else }} - imagePullPolicy: Always -{{- end }} -{{- if .Values.networkCosts.resources }} - resources: -{{ toYaml .Values.networkCosts.resources | indent 10 }} -{{- end }} - env: - {{- if .Values.networkCosts.hostProc }} - - name: HOST_PROC - value: {{ .Values.networkCosts.hostProc.mountPath }} - {{- end }} - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: HOST_PORT - value: {{ (quote .Values.networkCosts.port) | default (quote 3001) }} - - name: TRAFFIC_LOGGING_ENABLED - value: {{ (quote .Values.networkCosts.trafficLogging) | default (quote true) }} - volumeMounts: - {{- if .Values.networkCosts.hostProc }} - - mountPath: {{ .Values.networkCosts.hostProc.mountPath }} - name: host-proc - {{- else }} - - mountPath: /net - name: nf-conntrack - - mountPath: /netfilter - name: netfilter - {{- end }} - {{- if .Values.networkCosts.config }} - - mountPath: /network-costs/config - name: network-costs-config - {{- end }} - securityContext: - privileged: true - ports: - - name: http-server - containerPort: {{ .Values.networkCosts.port | default 3001 }} - hostPort: {{ .Values.networkCosts.port | default 3001 }} -{{- if .Values.networkCosts.priorityClassName }} - priorityClassName: "{{ .Values.networkCosts.priorityClassName }}" -{{- end }} -{{- if .Values.networkCosts.tolerations }} - tolerations: -{{ toYaml .Values.networkCosts.tolerations | indent 8 }} - {{- end }} - volumes: - {{- if .Values.networkCosts.config }} - - name: network-costs-config - configMap: - name: network-costs-config - {{- end }} - {{- if .Values.networkCosts.hostProc }} - - name: host-proc - hostPath: - path: {{ default "/proc" .Values.networkCosts.hostProc.hostPath }} - {{- else }} - - name: nf-conntrack - hostPath: - path: /proc/net - - name: netfilter - hostPath: - path: /proc/sys/net/netfilter - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-network-policy.yaml b/charts/kubecost/templates/cost-analyzer-network-policy.yaml deleted file mode 100644 index 872951bd1..000000000 --- a/charts/kubecost/templates/cost-analyzer-network-policy.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.networkPolicy -}} -{{- if .Values.networkPolicy.enabled -}} -apiVersion: {{ include "cost-analyzer.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - name: deny-egress - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - podSelector: - matchLabels: - {{ include "cost-analyzer.selectorLabels" . | nindent 6 }} - policyTypes: - - Egress - egress: - - to: - - namespaceSelector: {} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-pkey-configmap.yaml b/charts/kubecost/templates/cost-analyzer-pkey-configmap.yaml deleted file mode 100644 index 5ce22f52b..000000000 --- a/charts/kubecost/templates/cost-analyzer-pkey-configmap.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.productKey }} -{{- if .Values.kubecostProductConfigs.productKey.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: product-configs - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - {{- if .Values.kubecostProductConfigs.productKey.key }} - key: {{ .Values.kubecostProductConfigs.productKey.key | quote }} - {{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-postgres-deployment.yaml b/charts/kubecost/templates/cost-analyzer-postgres-deployment.yaml deleted file mode 100644 index 08f82a5ac..000000000 --- a/charts/kubecost/templates/cost-analyzer-postgres-deployment.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -{{- if .Values.remoteWrite.postgres.installLocal -}} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "cost-analyzer.fullname" . }}-postgres - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - selector: - matchLabels: - app: postgres - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - template: - metadata: - labels: - app: postgres - spec: - containers: - - image: timescale/pg_prometheus:latest-pg11 - name: pgprometheus - ports: - - containerPort: 5432 - args: - - -csynchronous_commit=off - - -S 1GB - env: - - name: POSTGRES_PASSWORD - value: {{ .Values.remoteWrite.postgres.auth.password }} - - name: POSTGRES_USER - value: postgres - volumeMounts: - - mountPath: /var/lib/postgresql/data - name: postgres-pv-volume - subPath: postgres - volumes: - - name: postgres-pv-volume - persistentVolumeClaim: - claimName: postgres-pv-claim -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-postgres-pv.yaml b/charts/kubecost/templates/cost-analyzer-postgres-pv.yaml deleted file mode 100644 index 0a67fa928..000000000 --- a/charts/kubecost/templates/cost-analyzer-postgres-pv.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -{{- if .Values.remoteWrite.postgres.installLocal -}} -kind: PersistentVolume -apiVersion: v1 -metadata: - name: postgres-pv-volume - labels: - type: local - app: postgres -spec: - capacity: - storage: {{ .Values.remoteWrite.postgres.persistentVolume.size }} - accessModes: - - ReadWriteOnce - hostPath: - path: "/mnt/data" -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-postgres-pvc.yaml b/charts/kubecost/templates/cost-analyzer-postgres-pvc.yaml deleted file mode 100644 index 8c5deb444..000000000 --- a/charts/kubecost/templates/cost-analyzer-postgres-pvc.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -{{- if .Values.remoteWrite.postgres.installLocal -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: postgres-pv-claim - labels: - app: postgres -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.remoteWrite.postgres.persistentVolume.size }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-postgres-service.yaml b/charts/kubecost/templates/cost-analyzer-postgres-service.yaml deleted file mode 100644 index 5488c58b1..000000000 --- a/charts/kubecost/templates/cost-analyzer-postgres-service.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -{{- if .Values.remoteWrite.postgres.installLocal -}} -kind: Service -apiVersion: v1 -metadata: - name: pgprometheus - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - selector: - app: postgres - type: ClusterIP - ports: - - name: server - port: 5432 - targetPort: 5432 -{{- end }} -{{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-pricing-configmap.yaml b/charts/kubecost/templates/cost-analyzer-pricing-configmap.yaml deleted file mode 100644 index 7163cec98..000000000 --- a/charts/kubecost/templates/cost-analyzer-pricing-configmap.yaml +++ /dev/null @@ -1,121 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: pricing-configs - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - {{- if .Values.kubecostProductConfigs.defaultModelPricing }} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.enabled }} - {{- if .Values.kubecostProductConfigs.customPricesEnabled }} - customPricesEnabled: "{{ .Values.kubecostProductConfigs.customPricesEnabled }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.CPU }} - CPU: "{{ .Values.kubecostProductConfigs.defaultModelPricing.CPU | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.spotCPU }} - spotCPU: "{{ .Values.kubecostProductConfigs.defaultModelPricing.spotCPU | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.RAM }} - RAM: "{{ .Values.kubecostProductConfigs.defaultModelPricing.RAM | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.spotRAM }} - spotRAM: "{{ .Values.kubecostProductConfigs.defaultModelPricing.spotRAM | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.GPU }} - GPU: "{{ .Values.kubecostProductConfigs.defaultModelPricing.GPU | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.spotGPU }} - spotGPU: "{{ .Values.kubecostProductConfigs.defaultModelPricing.spotGPU | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.storage }} - storage: "{{ .Values.kubecostProductConfigs.defaultModelPricing.storage | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.zoneNetworkEgress }} - zoneNetworkEgress: "{{ .Values.kubecostProductConfigs.defaultModelPricing.zoneNetworkEgress | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.regionNetworkEgress }} - regionNetworkEgress: "{{ .Values.kubecostProductConfigs.defaultModelPricing.regionNetworkEgress | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.internetNetworkEgress }} - internetNetworkEgress: "{{ .Values.kubecostProductConfigs.defaultModelPricing.internetNetworkEgress | toString }}" - {{- end -}} - {{- end -}} - {{- end -}} - {{- if .Values.kubecostProductConfigs.clusterName }} - clusterName: "{{ .Values.kubecostProductConfigs.clusterName }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.currencyCode }} - currencyCode: "{{ .Values.kubecostProductConfigs.currencyCode }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.azureBillingRegion }} - azureBillingRegion: "{{ .Values.kubecostProductConfigs.azureBillingRegion }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.azureSubscriptionID }} - azureSubscriptionID: "{{ .Values.kubecostProductConfigs.azureSubscriptionID }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.azureClientID }} - azureClientID: "{{ .Values.kubecostProductConfigs.azureClientID }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.azureTenantID }} - azureTenantID: "{{ .Values.kubecostProductConfigs.azureTenantID }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.discount }} - discount: "{{ .Values.kubecostProductConfigs.discount }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.negotiatedDiscount }} - negotiatedDiscount: "{{ .Values.kubecostProductConfigs.negotiatedDiscount }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultIdle }} - defaultIdle: "{{ .Values.kubecostProductConfigs.defaultIdle }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.sharedNamespaces }} - sharedNamespaces: "{{ .Values.kubecostProductConfigs.sharedNamespaces }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.spotLabel }} - spotLabel: "{{ .Values.kubecostProductConfigs.spotLabel }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.spotLabelValue }} - spotLabelValue: "{{ .Values.kubecostProductConfigs.spotLabelValue }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.awsSpotDataRegion }} - spotDataRegion: "{{ .Values.kubecostProductConfigs.awsSpotDataRegion }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.awsSpotDataBucket }} - spotDataBucket: "{{ .Values.kubecostProductConfigs.awsSpotDataBucket }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.awsSpotDataPrefix }} - spotDataPrefix: "{{ .Values.kubecostProductConfigs.awsSpotDataPrefix }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.projectID }} - projectID: "{{ .Values.kubecostProductConfigs.projectID }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.bigQueryBillingDataDataset }} - billingDataDataset: "{{ .Values.kubecostProductConfigs.bigQueryBillingDataDataset }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.athenaProjectID }} - athenaProjectID: "{{ .Values.kubecostProductConfigs.athenaProjectID }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.athenaBucketName }} - athenaBucketName: "{{ .Values.kubecostProductConfigs.athenaBucketName }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.athenaRegion }} - athenaRegion: "{{ .Values.kubecostProductConfigs.athenaRegion }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.athenaDatabase }} - athenaDatabase: "{{ .Values.kubecostProductConfigs.athenaDatabase }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.athenaTable }} - athenaTable: "{{ .Values.kubecostProductConfigs.athenaTable }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.masterPayerARN}} - masterPayerARN: "{{ .Values.kubecostProductConfigs.masterPayerARN }}" - {{- end }} - {{- if .Values.kubecostProductConfigs.gpuLabel }} - gpuLabel: "{{ .Values.kubecostProductConfigs.gpuLabel }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.gpuLabelValue }} - gpuLabelValue: "{{ .Values.kubecostProductConfigs.gpuLabelValue }}" - {{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-deployment.yaml b/charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-deployment.yaml deleted file mode 100644 index c2b282772..000000000 --- a/charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-deployment.yaml +++ /dev/null @@ -1,53 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "cost-analyzer.fullname" . }}-adapter - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - selector: - matchLabels: - app: adapter - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - template: - metadata: - labels: - app: adapter - spec: - initContainers: - - name: kubecost-sql-init - image: {{ .Values.remoteWrite.postgres.initImage }}:prod-{{ $.Chart.AppVersion }} - {{- if .Values.remoteWrite.postgres.initImagePullPolicy }} - imagePullPolicy: {{ .Values.remoteWrite.postgres.initImagePullPolicy }} - {{- else }} - imagePullPolicy: Always - {{- end }} - env: - - name: PROMETHEUS_SERVER_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: prometheus-server-endpoint - containers: - - image: timescale/prometheus-postgresql-adapter:latest - name: pgprometheusadapter - ports: - - containerPort: 9201 - args: - {{- if .Values.remoteWrite.postgres.installLocal }} - - "-pg-host=pgprometheus" - {{- else }} - - "-pg-host={{ .Values.remoteWrite.postgres.remotePostgresAddress }}" - {{- end }} - - "-pg-prometheus-log-samples=true" - - "-pg-password={{ .Values.remoteWrite.postgres.auth.password }}" -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-service.yaml b/charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-service.yaml deleted file mode 100644 index d36479439..000000000 --- a/charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-service.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -kind: Service -apiVersion: v1 -metadata: - name: pgprometheus-adapter - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - selector: - app: adapter - type: ClusterIP - ports: - - name: server - port: 9201 - targetPort: 9201 -{{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-prometheusrule-template.yaml b/charts/kubecost/templates/cost-analyzer-prometheusrule-template.yaml deleted file mode 100644 index 61380b424..000000000 --- a/charts/kubecost/templates/cost-analyzer-prometheusrule-template.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if .Values.prometheus }} -{{- if .Values.prometheus.serverFiles }} -{{- if .Values.prometheus.serverFiles.rules }} -{{- if .Values.prometheusRule }} -{{- if .Values.prometheusRule.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ include "cost-analyzer.fullname" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if .Values.prometheusRule.additionalLabels }} - {{ toYaml .Values.prometheusRule.additionalLabels | nindent 4 }} - {{- end }} -spec: - {{ toYaml .Values.prometheus.serverFiles.rules | nindent 2 }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-psp-role.template.yaml b/charts/kubecost/templates/cost-analyzer-psp-role.template.yaml deleted file mode 100644 index f326b1f1c..000000000 --- a/charts/kubecost/templates/cost-analyzer-psp-role.template.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if .Values.podSecurityPolicy }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: kubecost-cost-analyzer-psp - annotations: -{{- if .Values.podSecurityPolicy.annotations }} -{{ toYaml .Values.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - kubecost-cost-analyzer-psp -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-psp-rolebinding.template.yaml b/charts/kubecost/templates/cost-analyzer-psp-rolebinding.template.yaml deleted file mode 100644 index 8e1d925c5..000000000 --- a/charts/kubecost/templates/cost-analyzer-psp-rolebinding.template.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if .Values.podSecurityPolicy }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: kubecost-cost-analyzer-psp -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: kubecost-cost-analyzer-psp -subjects: -- kind: ServiceAccount - name: {{ template "cost-analyzer.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-psp.template.yaml b/charts/kubecost/templates/cost-analyzer-psp.template.yaml deleted file mode 100644 index 885ab9ca9..000000000 --- a/charts/kubecost/templates/cost-analyzer-psp.template.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.podSecurityPolicy }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: {{ include "cost-analyzer.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: kubecost-cost-analyzer-psp -spec: - privileged: true - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - volumes: - - '*' -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-pvc-template.yaml b/charts/kubecost/templates/cost-analyzer-pvc-template.yaml deleted file mode 100644 index d3e257668..000000000 --- a/charts/kubecost/templates/cost-analyzer-pvc-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.persistentVolume -}} -{{- if not .Values.persistentVolume.existingClaim -}} -{{- if .Values.persistentVolume.enabled -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ template "cost-analyzer.fullname" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - accessModes: - - ReadWriteOnce - {{- if .Values.persistentVolume.storageClass }} - storageClassName: {{ .Values.persistentVolume.storageClass }} - {{ end }} - resources: - requests: - {{- if .Values.persistentVolume }} - storage: {{ .Values.persistentVolume.size }} - {{- else }} - storage: 0.2Gi - {{ end }} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-saml-config-map-template.yaml b/charts/kubecost/templates/cost-analyzer-saml-config-map-template.yaml deleted file mode 100644 index 71ac8659c..000000000 --- a/charts/kubecost/templates/cost-analyzer-saml-config-map-template.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.saml }} -{{- if .Values.saml.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "cost-analyzer.fullname" . }}-saml - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: -{{- $root := . }} - saml.json: '{{ toJson .Values.saml }}' -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-server-configmap.yaml b/charts/kubecost/templates/cost-analyzer-server-configmap.yaml deleted file mode 100644 index edf5ca6fa..000000000 --- a/charts/kubecost/templates/cost-analyzer-server-configmap.yaml +++ /dev/null @@ -1,69 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if or .Values.kubecostProductConfigs.grafanaURL .Values.kubecostProductConfigs.labelMappingConfigs }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: app-configs - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: -{{- if .Values.kubecostProductConfigs.labelMappingConfigs }} -{{- if .Values.kubecostProductConfigs.labelMappingConfigs.enabled }} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.owner_label }} - owner_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.owner_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.team_label }} - team_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.team_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.department_label }} - department_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.department_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.product_label }} - product_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.product_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.environment_label }} - environment_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.environment_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.namespace_external_label }} - namespace_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.namespace_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.cluster_external_label }} - cluster_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.cluster_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.controller_external_label }} - controller_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.controller_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.product_external_label }} - product_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.product_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.service_external_label }} - service_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.service_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.deployment_external_label }} - deployment_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.deployment_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.team_external_label }} - team_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.team_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.environment_external_label }} - environment_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.environment_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.department_external_label }} - department_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.department_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.statefulset_external_label }} - statefulset_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.statefulset_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.daemonset_external_label }} - daemonset_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.daemonset_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.pod_external_label }} - pod_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.pod_external_label }}" - {{- end -}} -{{- end -}} -{{- end -}} - {{- if .Values.kubecostProductConfigs.grafanaURL }} - grafanaURL: "{{ .Values.kubecostProductConfigs.grafanaURL }}" - {{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-service-account-template.yaml b/charts/kubecost/templates/cost-analyzer-service-account-template.yaml deleted file mode 100644 index d5e3be3b9..000000000 --- a/charts/kubecost/templates/cost-analyzer-service-account-template.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "cost-analyzer.serviceAccountName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -{{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-service-template.yaml b/charts/kubecost/templates/cost-analyzer-service-template.yaml deleted file mode 100644 index dd48bb3f8..000000000 --- a/charts/kubecost/templates/cost-analyzer-service-template.yaml +++ /dev/null @@ -1,69 +0,0 @@ -{{- $nginxPort := .Values.service.targetPort | default 9090 -}} -{{- $servicePort := .Values.service.port | default 9090 -}} -kind: Service -apiVersion: v1 -metadata: - name: {{ template "cost-analyzer.serviceName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -{{- if .Values.service.labels }} -{{ toYaml .Values.service.labels | indent 4 }} -{{- end }} -{{- if .Values.service.annotations }} - annotations: -{{ toYaml .Values.service.annotations | indent 4 }} -{{- end }} -spec: - selector: - {{ include "cost-analyzer.selectorLabels" . | nindent 4 }} -{{- if .Values.service -}} -{{- if .Values.service.type }} - type: "{{ .Values.service.type }}" -{{- else }} - type: ClusterIP -{{- end }} -{{- else }} - type: ClusterIP -{{- end }} - ports: - - name: server - port: 9001 - targetPort: 9001 - - name: model - port: 9003 - targetPort: 9003 - - name: frontend - {{- if .Values.kubecostFrontend.tls }} - {{- if .Values.kubecostFrontend.tls.enabled }} - port: 443 - targetPort: 443 - {{- if (eq .Values.service.type "NodePort") }} - {{- if .Values.service.nodePort }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - {{- end }} - {{- else }} - port: {{ $servicePort }} - targetPort: {{ $nginxPort }} - {{- if (eq .Values.service.type "NodePort") }} - {{- if .Values.service.nodePort }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - {{- end }} - {{- end}} - {{- else }} - port: {{ $servicePort }} - targetPort: {{ $nginxPort }} - {{- if (eq .Values.service.type "NodePort") }} - {{- if .Values.service.nodePort }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.saml }} - {{- if .Values.saml.enabled }} - - name: apiserver - port: 9004 - targetPort: 9004 - {{- end }} - {{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-servicemonitor-template.yaml b/charts/kubecost/templates/cost-analyzer-servicemonitor-template.yaml deleted file mode 100644 index 6f79d8cd4..000000000 --- a/charts/kubecost/templates/cost-analyzer-servicemonitor-template.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if .Values.serviceMonitor }} -{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "cost-analyzer.fullname" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if .Values.serviceMonitor.additionalLabels }} - {{ toYaml .Values.serviceMonitor.additionalLabels | nindent 4 }} - {{- end }} -spec: - endpoints: - - port: model - honorLabels: true - interval: 1m - scrapeTimeout: 10s - path: /metrics - scheme: http - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - selector: - matchLabels: - {{ include "cost-analyzer.selectorLabels" . | nindent 6 }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/external-grafana-config-map-template.yaml b/charts/kubecost/templates/external-grafana-config-map-template.yaml deleted file mode 100644 index 5e81ed359..000000000 --- a/charts/kubecost/templates/external-grafana-config-map-template.yaml +++ /dev/null @@ -1,10 +0,0 @@ -{{- if eq .Values.global.grafana.proxy false -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: external-grafana-config-map - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - grafanaURL: {{ .Values.global.grafana.scheme | default "http" }}://{{- .Values.global.grafana.domainName }} -{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/templates/grafana-attached-disk-metrics-template.yaml b/charts/kubecost/templates/grafana-attached-disk-metrics-template.yaml deleted file mode 100644 index 6d896a34c..000000000 --- a/charts/kubecost/templates/grafana-attached-disk-metrics-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: attached-disk-metrics-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - attached-disks.json: |- -{{ .Files.Get "attached-disks.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-cluster-metrics-template.yaml b/charts/kubecost/templates/grafana-dashboard-cluster-metrics-template.yaml deleted file mode 100644 index 91650c74b..000000000 --- a/charts/kubecost/templates/grafana-dashboard-cluster-metrics-template.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: cluster-metrics-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - cluster-metrics.json: |- -{{ .Files.Get "cluster-metrics.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} - - diff --git a/charts/kubecost/templates/grafana-dashboard-cluster-utilization-template.yaml b/charts/kubecost/templates/grafana-dashboard-cluster-utilization-template.yaml deleted file mode 100644 index 8fe764c3e..000000000 --- a/charts/kubecost/templates/grafana-dashboard-cluster-utilization-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: cluster-utilization-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - cluster-utilization.json: |- -{{ .Files.Get "cluster-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-deployment-utilization-template.yaml b/charts/kubecost/templates/grafana-dashboard-deployment-utilization-template.yaml deleted file mode 100644 index d16c70bcd..000000000 --- a/charts/kubecost/templates/grafana-dashboard-deployment-utilization-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: deployment-utilization-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - deployment-utilization.json: |- -{{ .Files.Get "deployment-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-label-cost-utilization-template.yaml b/charts/kubecost/templates/grafana-dashboard-label-cost-utilization-template.yaml deleted file mode 100644 index 2372514d4..000000000 --- a/charts/kubecost/templates/grafana-dashboard-label-cost-utilization-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: label-cost-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - label-cost-utilization.json: |- -{{ .Files.Get "label-cost-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-namespace-utilization-template.yaml b/charts/kubecost/templates/grafana-dashboard-namespace-utilization-template.yaml deleted file mode 100644 index 17393dd16..000000000 --- a/charts/kubecost/templates/grafana-dashboard-namespace-utilization-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: namespace-utilization-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - namespace-utilization.json: |- -{{ .Files.Get "namespace-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-node-utilization-template.yaml b/charts/kubecost/templates/grafana-dashboard-node-utilization-template.yaml deleted file mode 100644 index 586a3dfca..000000000 --- a/charts/kubecost/templates/grafana-dashboard-node-utilization-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: node-utilization-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - node-utilization.json: |- -{{ .Files.Get "node-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-pod-utilization-template.yaml b/charts/kubecost/templates/grafana-dashboard-pod-utilization-template.yaml deleted file mode 100644 index 92017afb8..000000000 --- a/charts/kubecost/templates/grafana-dashboard-pod-utilization-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: pod-utilization-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - pod-utilization.json: |- -{{ .Files.Get "pod-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-prometheus-metrics-template.yaml b/charts/kubecost/templates/grafana-dashboard-prometheus-metrics-template.yaml deleted file mode 100644 index 32e1fc707..000000000 --- a/charts/kubecost/templates/grafana-dashboard-prometheus-metrics-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: prom-benchmark-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - pod-utilization.json: |- -{{ .Files.Get "prom-benchmark.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-datasource-template.yaml b/charts/kubecost/templates/grafana-datasource-template.yaml deleted file mode 100644 index e79d2fa35..000000000 --- a/charts/kubecost/templates/grafana-datasource-template.yaml +++ /dev/null @@ -1,72 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.datasources -}} -{{- if .Values.grafana.sidecar.datasources.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: grafana-datasource - {{- if $.Values.grafana.namespace_datasources }} - namespace: {{ $.Values.grafana.namespace_datasources }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.datasources.label }} - {{ $.Values.grafana.sidecar.datasources.label }}: "1" - {{- else }} - {{- if .Values.global.grafana.enabled }} - kubecost_grafana_datasource: "1" - {{- else }} - grafana_datasource: "1" - {{- end }} - {{- end }} -data: - {{ default "datasource.yaml" .Values.grafana.sidecar.datasources.dataSourceFilename }}: |- - apiVersion: 1 - datasources: - - access: proxy -{{- if .Values.global.thanos }} -{{- if .Values.global.thanos.enabled }} - name: {{ default "Prometheus" .Values.grafana.sidecar.datasources.dataSourceName }} - isDefault: false -{{- else }} - name: "default-kubecost" -{{- if .Values.grafana.sidecar.datasources.defaultDatasourceEnabled }} - isDefault: true -{{- else }} - isDefault: false -{{- end }} -{{- end }} -{{- else }} - name: "default-kubecost" -{{- if .Values.grafana.sidecar.datasources.defaultDatasourceEnabled }} - isDefault: true -{{- else }} - isDefault: false -{{- end }} -{{- end }} - type: prometheus -{{- if .Values.global.prometheus.enabled }} - url: http://{{ template "cost-analyzer.prometheus.server.name" . }}.{{ .Release.Namespace }} -{{- else }} - url: {{ .Values.global.prometheus.fqdn }} -{{- end }} -{{- if .Values.global.thanos.enabled }} - - access: proxy - name: "default-kubecost" - type: prometheus -{{- if .Values.grafana.sidecar.datasources.defaultDatasourceEnabled }} - isDefault: true -{{- else }} - isDefault: false -{{- end }} -{{- if .Values.global.prometheus.enabled }} - url: http://{{ .Release.Name }}-thanos-query-http.{{ .Release.Namespace }}:{{ .Values.thanos.query.http.port }} -{{ else }} - url: {{ .Values.global.thanos.queryService }} -{{- end }} -{{- end }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/kubecost-cluster-controller-template.yaml b/charts/kubecost/templates/kubecost-cluster-controller-template.yaml deleted file mode 100644 index 1a947e696..000000000 --- a/charts/kubecost/templates/kubecost-cluster-controller-template.yaml +++ /dev/null @@ -1,282 +0,0 @@ -{{- if .Values.clusterController }} -{{- if .Values.clusterController.enabled }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "kubecost.clusterControllerName" . }} - labels: - app: {{ template "kubecost.clusterControllerName" . }} ---- -# -# NOTE: -# The following ClusterRole permissions are only created and assigned for the -# cluster controller feature. They will not be added to any clusters by default. -# -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "kubecost.clusterControllerName" . }} - labels: - app: {{ template "kubecost.clusterControllerName" . }} -rules: - - apiGroups: - - kubecost.k8s.io - resources: - - turndownschedules - - turndownschedules/status - verbs: - - get - - list - - watch - - create - - patch - - update - - delete - - apiGroups: - - "" - - events.k8s.io - resources: - - events - verbs: - - create - - patch - - update - - apiGroups: - - '' - resources: - - deployments - - nodes - - pods - - resourcequotas - - replicationcontrollers - - limitranges - - pods/eviction - verbs: - - get - - list - - watch - - create - - patch - - update - - delete - - apiGroups: - - '' - resources: - - configmaps - - namespaces - - persistentvolumeclaims - - persistentvolumes - - endpoints - - events - - services - verbs: - - get - - list - - watch - - apiGroups: - - extensions - resources: - - daemonsets - - deployments - - replicasets - verbs: - - get - - list - - watch - - create - - patch - - update - - delete - - apiGroups: - - apps - resources: - - statefulsets - - deployments - - daemonsets - - replicasets - verbs: - - get - - list - - watch - - create - - patch - - update - - delete - - apiGroups: - - batch - resources: - - cronjobs - - jobs - verbs: - - get - - list - - watch - - create - - patch - - update - - delete - - apiGroups: - - autoscaling - resources: - - horizontalpodautoscalers - verbs: - - get - - list - - watch - - apiGroups: - - policy - resources: - - poddisruptionbudgets - verbs: - - get - - list - - watch - - apiGroups: - - storage.k8s.io - resources: - - storageclasses - verbs: - - get - - list - - watch - - apiGroups: - - events.k8s.io - resources: - - events - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "kubecost.clusterControllerName" . }} - labels: - app: {{ template "kubecost.clusterControllerName" . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "kubecost.clusterControllerName" . }} -subjects: - - kind: ServiceAccount - name: {{ template "kubecost.clusterControllerName" . }} - namespace: {{ .Release.Namespace }} ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "kubecost.clusterControllerName" . }} -spec: - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - selector: - matchLabels: - app: {{ template "kubecost.clusterControllerName" . }} - template: - metadata: - labels: - app: {{ template "kubecost.clusterControllerName" . }} - spec: - containers: - - name: {{ template "kubecost.clusterControllerName" . }} - image: {{ .Values.clusterController.image }} - imagePullPolicy: {{ .Values.clusterController.imagePullPolicy }} - volumeMounts: - - name: cluster-controller-keys - mountPath: /var/keys - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: TURNDOWN_NAMESPACE - value: {{ .Release.Namespace }} - - name: TURNDOWN_DEPLOYMENT - value: {{ template "kubecost.clusterControllerName" . }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/keys/service-key.json - ports: - - name: http-server - containerPort: 9731 - hostPort: 9731 - serviceAccount: {{ template "kubecost.clusterControllerName" . }} - serviceAccountName: {{ template "kubecost.clusterControllerName" . }} - volumes: - - name: cluster-controller-keys - secret: - secretName: {{ .Values.clusterController.secretName | default "cluster-controller-service-key" }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kubecost.clusterControllerName" . }}-service -spec: - type: ClusterIP - ports: - - name: http - protocol: TCP - port: 9731 - targetPort: 9731 - selector: - app: {{ template "kubecost.clusterControllerName" . }} ---- -# TurndownSchedule Custom Resource Definition for persistence -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: turndownschedules.kubecost.k8s.io -spec: - group: kubecost.k8s.io - version: v1alpha1 - names: - kind: TurndownSchedule - singular: turndownschedule - plural: turndownschedules - shortNames: - - td - - tds - scope: Cluster - subresources: - status: {} - validation: - openAPIV3Schema: - properties: - spec: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - repeat: - type: string - enum: [none, daily, weekly] - additionalPrinterColumns: - - name: State - type: string - description: The state of the turndownschedule - JSONPath: .status.state - - name: Next Turndown - type: string - description: The next turndown date-time - JSONPath: .status.nextScaleDownTime - - name: Next Turn Up - type: string - description: The next turn up date-time - JSONPath: .status.nextScaleUpTime -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/kubecost-cluster-manager-configmap-template.yaml b/charts/kubecost/templates/kubecost-cluster-manager-configmap-template.yaml deleted file mode 100644 index 907252f93..000000000 --- a/charts/kubecost/templates/kubecost-cluster-manager-configmap-template.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.clusters }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: kubecost-clusters - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - default-clusters.yaml: | -{{- toYaml .Values.kubecostProductConfigs.clusters | nindent 4 }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/kubecost-priority-class-template.yaml b/charts/kubecost/templates/kubecost-priority-class-template.yaml deleted file mode 100644 index a098a766e..000000000 --- a/charts/kubecost/templates/kubecost-priority-class-template.yaml +++ /dev/null @@ -1,11 +0,0 @@ -{{- if .Values.priority }} -{{- if .Values.priority.enabled }} -apiVersion: {{ include "cost-analyzer.priorityClass.apiVersion" . }} -kind: PriorityClass -metadata: - name: {{ template "cost-analyzer.fullname" . }}-priority -value: {{ .Values.priority.value | default "1000000" }} -globalDefault: false -description: "Priority class for scheduling the cost-analyzer pod" -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/kubecost/templates/network-costs-psp.template.yaml b/charts/kubecost/templates/network-costs-psp.template.yaml deleted file mode 100644 index c6d1c5385..000000000 --- a/charts/kubecost/templates/network-costs-psp.template.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if .Values.networkCosts }} -{{- if .Values.networkCosts.enabled }} -{{- if .Values.networkCosts.podSecurityPolicy }} -{{- if .Values.networkCosts.podSecurityPolicy.enabled }} -apiVersion: {{ include "cost-analyzer.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: kubecost-network-costs -spec: - privileged: true - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - volumes: - - '*' -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/network-costs-role.template.yaml b/charts/kubecost/templates/network-costs-role.template.yaml deleted file mode 100644 index 04424a44e..000000000 --- a/charts/kubecost/templates/network-costs-role.template.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if .Values.networkCosts }} -{{- if .Values.networkCosts.enabled }} -{{- if .Values.networkCosts.podSecurityPolicy }} -{{- if .Values.networkCosts.podSecurityPolicy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: kubecost-network-costs - annotations: -{{- if .Values.networkCosts.podSecurityPolicy.annotations }} -{{ toYaml .Values.networkCosts.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - kubecost-network-costs -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/network-costs-rolebinding.template.yaml b/charts/kubecost/templates/network-costs-rolebinding.template.yaml deleted file mode 100644 index 84ab0d1c2..000000000 --- a/charts/kubecost/templates/network-costs-rolebinding.template.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.networkCosts }} -{{- if .Values.networkCosts.enabled }} -{{- if .Values.networkCosts.podSecurityPolicy }} -{{- if .Values.networkCosts.podSecurityPolicy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: kubecost-network-costs -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: kubecost-network-costs -subjects: -- kind: ServiceAccount - name: {{ template "cost-analyzer.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/values-thanos.yaml b/charts/kubecost/values-thanos.yaml deleted file mode 100644 index b0bc33889..000000000 --- a/charts/kubecost/values-thanos.yaml +++ /dev/null @@ -1,117 +0,0 @@ -global: - thanos: - enabled: true - -# For Thanos Installs, Allow Higher Concurrency from Cost-Model -# Still may require tweaking for some installs, but the thanos-query-frontend -# will greatly assist in reduction memory bloat in query. -kubecostModel: - maxQueryConcurrency: 5 - # This configuration is applied to thanos only. Expresses the resolution to - # use for longer query ranges. Options: raw, 5m, 1h - Default: raw - maxSourceResolution: 5m - -prometheus: - server: - extraArgs: - storage.tsdb.min-block-duration: 2h - storage.tsdb.max-block-duration: 2h - storage.tsdb.retention: 2w - extraVolumes: - - name: object-store-volume - secret: - # Ensure this secret name matches thanos.storeSecretName - secretName: kubecost-thanos - enableAdminApi: true - sidecarContainers: - - name: thanos-sidecar - image: thanosio/thanos:v0.15.0 - args: - - sidecar - - --log.level=debug - - --tsdb.path=/data/ - - --prometheus.url=http://127.0.0.1:9090 - - --objstore.config-file=/etc/config/object-store.yaml - # Start of time range limit to serve. Thanos sidecar will serve only metrics, which happened - # later than this value. Option can be a constant time in RFC3339 format or time duration - # relative to current time, such as -1d or 2h45m. Valid duration units are ms, s, m, h, d, w, y. - - --min-time=-3h - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - ports: - - name: sidecar-http - containerPort: 10902 - - name: grpc - containerPort: 10901 - - name: cluster - containerPort: 10900 - volumeMounts: - - name: config-volume - mountPath: /etc/prometheus - - name: storage-volume - mountPath: /data - subPath: "" - - name: object-store-volume - mountPath: /etc/config - -thanos: - store: - enabled: true - grpcSeriesMaxConcurrency: 20 - blockSyncConcurrency: 20 - extraEnv: - - name: GOGC - value: "100" - resources: - requests: - memory: "2.5Gi" - query: - enabled: true - timeout: 3m - # Maximum number of queries processed concurrently by query node. - maxConcurrent: 8 - # Maximum number of select requests made concurrently per a query. - maxConcurrentSelect: 2 - resources: - requests: - memory: "2.5Gi" - autoDownsampling: false - extraEnv: - - name: GOGC - value: "100" - - # Thanos Query Frontend - queryFrontend: - enabled: true - compressResponses: true - # Response Cache Configuration - # Configure either a max size constraint or max items. - responseCache: - enabled: true - # Maximum memory size of the cache in bytes. A unit suffix (KB, MB, GB) may be applied. - maxSize: 1.25GB - # Maximum number of entries in the cache. - maxSizeItems: 0 - # The expiry duration for the cache. - validity: 2m - resources: - requests: - memory: "1.5Gi" - - # Thanos Sidecar Service Discovery - sidecar: - enabled: true - bucket: - enabled: false - compact: - enabled: true - dataVolume: - persistentVolumeClaim: - claimName: compact-data-volume - storage: 100Gi - # This secret name should match the sidecar configured secret name volume - # in the prometheus.server.extraVolumes entry - storeSecretName: kubecost-thanos diff --git a/charts/kubecost/values.yaml b/charts/kubecost/values.yaml deleted file mode 100644 index 29e3d558f..000000000 --- a/charts/kubecost/values.yaml +++ /dev/null @@ -1,561 +0,0 @@ -global: - # zone: cluster.local (use only if your DNS server doesn't live in the same zone as kubecost) - prometheus: - enabled: true # If false, Prometheus will not be installed -- only actively supported on paid Kubecost plans - fqdn: http://cost-analyzer-prometheus-server.default.svc #example fqdn. Ignored if enabled: true - # insecureSkipVerify : false # If true, kubecost will not check the TLS cert of prometheus - # queryServiceBasicAuthSecretName: dbsecret # kubectl create secret generic dbsecret -n kubecost --from-file=USERNAME --from-file=PASSWORD - # queryServiceBearerTokenSecretName: dbsecret # kubectl create secret generic mcdbsecret -n kubecost --from-file=TOKEN - - # Durable storage option, product key required - thanos: - enabled: false - # queryService: http://thanos-query-frontend-http.kubecost:{{ .Values.thanos.queryFrontend.http.port }} # an address of the thanos query-frontend endpoint, if different from installed thanos - # queryServiceBasicAuthSecretName: mcdbsecret # kubectl create secret generic mcdbsecret -n kubecost --from-file=USERNAME --from-file=PASSWORD <---enter basic auth credentials like that - # queryServiceBearerTokenSecretName mcdbsecret # kubectl create secret generic mcdbsecret -n kubecost --from-file=TOKEN - # queryOffset: 3h # The offset to apply to all thanos queries in order to achieve syncronization on all cluster block stores - - grafana: - enabled: true # If false, Grafana will not be installed - domainName: cost-analyzer-grafana.default.svc #example grafana domain Ignored if enabled: true - scheme: "http" # http or https, for the domain name above. - proxy: true # If true, the kubecost frontend will route to your grafana through its service endpoint - - notifications: - # Kubecost alerting configuration - # Ref: http://docs.kubecost.com/alerts - alertConfigs: - enabled: false # the example values below are never read unless enabled is set to true - frontendUrl: http://localhost:9090 # optional, used for linkbacks - slackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Slack alerts - globalAlertEmails: - - recipient@example.com - - additionalRecipient@example.com - alerts: - # Daily namespace budget alert on namespace `kubecost` - - type: budget # supported: budget, recurringUpdate - threshold: 50 # optional, required for budget alerts - window: daily # or 1d - aggregation: namespace - filter: kubecost - ownerContact: # optional, overrides globalAlertEmails default - - owner@example.com - - owner2@example.com - # Daily cluster budget alert (clusterCosts alert) on cluster `cluster-one` - - type: budget - threshold: 200.8 # optional, required for budget alerts - window: daily # or 1d - aggregation: cluster - filter: cluster-one - # Recurring weekly update (weeklyUpdate alert) - - type: recurringUpdate - window: weekly # or 7d - aggregation: namespace - filter: '*' - # Recurring weekly namespace update on kubecost namespace - - type: recurringUpdate - window: weekly # or 7d - aggregation: namespace - filter: kubecost - ownerContact: # ownerContact(s) should be the same for the same namespace, otherwise the last namespace alert overwrites - - owner@example.com - - owner2@example.com - alertmanager: # Supply an alertmanager FQDN to receive notifications from the app. - enabled: false # If true, allow kubecost to write to your alertmanager - fqdn: http://cost-analyzer-prometheus-server.default.svc #example fqdn. Ignored if prometheus.enabled: true - - podAnnotations: {} - # iam.amazonaws.com/role: role-arn - -pricingCsv: - enabled: false - location: - provider: "AWS" - region: "us-east-1" - URI: s3://kc-csv-test/pricing_schema.csv # a valid file URI - csvAccessCredentials: pricing-schema-access-secret - -saml: # enterprise key required to use - enabled: false - secretName: "kubecost-authzero" - #metadataSecretName: "kubecost-authzero-metadata" # One of metadataSecretName or idpMetadataURL must be set. defaults to metadataURL if set - idpMetadataURL: "https://dev-elu2z98r.auth0.com/samlp/metadata/c6nY4M37rBP0qSO1IYIqBPPyIPxLS8v2" - appRootURL: "http://localhost:9090" # sample URL - # audienceURI: "http://localhost:9090" # by convention, the same as the appRootURL, but any string uniquely identifying kubecost to your samp IDP. Optional if you follow the convention - rbac: - enabled: false - groups: - - name: admin - enabled: false # if admin is disabled, all SAML users will be able to make configuration changes to the kubecost frontend - assertionName: "http://schemas.auth0.com/userType" # a SAML Assertion, one of whose elements has a value that matches on of the values in assertionValues - assertionValues: - - "admin" - - "superusers" - - name: readonly - enabled: false # if readonly is disabled, all users authorized on SAML will default to readonly - assertionName: "http://schemas.auth0.com/userType" - assertionvalues: - - "readonly" - -# imagePullSecrets: -# - name: "image-pull-secret" - -kubecostChecks: - enabled: true - image: "quay.io/kubecost1/checks" - resources: - requests: - cpu: "20m" - memory: "100Mi" - limits: - cpu: "100m" - memory: "200Mi" - -kubecostFrontend: - image: "gcr.io/kubecost1/frontend" - imagePullPolicy: Always - resources: - requests: - cpu: "10m" - memory: "55Mi" - #limits: - # cpu: "100m" - # memory: "256Mi" - -kubecost: - image: "gcr.io/kubecost1/server" - resources: - requests: - cpu: "100m" - memory: "55Mi" - #limits: - # cpu: "100m" - # memory: "256Mi" - -kubecostModel: - image: "gcr.io/kubecost1/cost-model" - imagePullPolicy: Always - warmCache: true - warmSavingsCache: true - etl: true - # The total number of days the ETL storage will build - etlStoreDurationDays: 120 - maxQueryConcurrency: 5 - # utcOffset represents a timezone in hours and minutes east (+) or west (-) - # of UTC, itself, which is defined as +00:00. - # See the tz database of timezones to look up your local UTC offset: - # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - utcOffset: "+00:00" - resources: - requests: - cpu: "200m" - memory: "55Mi" - #limits: - # cpu: "800m" - # memory: "256Mi" - -ingress: - enabled: false - annotations: - kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - paths: ["/"] # There's no need to route specifically to the pods-- we have an nginx deployed that handles routing - hosts: - - cost-analyzer.local - tls: [] - # - secretName: cost-analyzer-tls - # hosts: - # - cost-analyzer.local - -nodeSelector: {} - -tolerations: [] -# - key: "key" -# operator: "Equal|Exists" -# value: "value" -# effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - -affinity: {} - -# If true, creates a PriorityClass to be used by the cost-analyzer pod -priority: - enabled: false - # value: 1000000 - -# If true, enable creation of NetworkPolicy resources. -networkPolicy: - enabled: false - -podSecurityPolicy: - enabled: false - -# Define persistence volume for cost-analyzer -persistentVolume: - size: 0.2Gi - dbSize: 32.0Gi - enabled: true # Note that setting this to false means configurations will be wiped out on pod restart. - # storageClass: "-" # - # existingClaim: kubecost-cost-analyzer # a claim in the same namespace as kubecost - -service: - type: ClusterIP - port: 9090 - targetPort: 9090 - # nodePort: - labels: {} - annotations: {} - -# enabling long-term durable storage with Postgres requires an enterprise license -remoteWrite: - postgres: - enabled: false - initImage: "gcr.io/kubecost1/sql-init" - initImagePullPolicy: Always - installLocal: true - remotePostgresAddress: "" # ignored if installing locally - persistentVolume: - size: 200Gi - auth: - password: admin # change me - -prometheus: - extraScrapeConfigs: | - - job_name: kubecost - honor_labels: true - scrape_interval: 1m - scrape_timeout: 10s - metrics_path: /metrics - scheme: http - dns_sd_configs: - - names: - - {{ template "cost-analyzer.serviceName" . }} - type: 'A' - port: 9003 - - job_name: kubecost-networking - kubernetes_sd_configs: - - role: pod - relabel_configs: - # Scrape only the the targets matching the following metadata - - source_labels: [__meta_kubernetes_pod_label_app] - action: keep - regex: {{ template "cost-analyzer.networkCostsName" . }} - server: - # If clusterIDConfigmap is defined, instead use user-generated configmap with key CLUSTER_ID - # to use as unique cluster ID in kubecost cost-analyzer deployment. - # This overrides the cluster_id set in prometheus.server.global.external_labels. - # NOTE: This does not affect the external_labels set in prometheus config. - # clusterIDConfigmap: cluster-id-configmap - - resources: {} - # limits: - # cpu: 500m - # memory: 512Mi - # requests: - # cpu: 500m - # memory: 512Mi - global: - scrape_interval: 1m - scrape_timeout: 10s - evaluation_interval: 1m - external_labels: - cluster_id: cluster-one # Each cluster should have a unique ID - persistentVolume: - size: 32Gi - enabled: true - extraArgs: - query.max-concurrency: 1 - query.max-samples: 100000000 - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - alertmanager: - # enabled: false - persistentVolume: - enabled: true - nodeExporter: - enabled: true - pushgateway: - enabled: false - persistentVolume: - enabled: true - serverFiles: - # prometheus.yml: # Sample block -- enable if using an in cluster durable store. - # remote_write: - # - url: "http://pgprometheus-adapter:9201/write" - # write_relabel_configs: - # - source_labels: [__name__] - # regex: 'container_.*_allocation|container_.*_allocation_bytes|.*_hourly_cost|kube_pod_container_resource_requests_memory_bytes|container_memory_working_set_bytes|kube_pod_container_resource_requests_cpu_cores|kube_pod_container_resource_requests|pod_pvc_allocation|kube_namespace_labels|kube_pod_labels' - # action: keep - # queue_config: - # max_samples_per_send: 1000 - #remote_read: - # - url: "http://pgprometheus-adapter:9201/read" - rules: - groups: - - name: CPU - rules: - - expr: sum(rate(container_cpu_usage_seconds_total{container_name!=""}[5m])) - record: cluster:cpu_usage:rate5m - - expr: rate(container_cpu_usage_seconds_total{container_name!=""}[5m]) - record: cluster:cpu_usage_nosum:rate5m - - expr: avg(irate(container_cpu_usage_seconds_total{container_name!="POD", container_name!=""}[5m])) by (container_name,pod_name,namespace) - record: kubecost_container_cpu_usage_irate - - expr: sum(container_memory_working_set_bytes{container_name!="POD",container_name!=""}) by (container_name,pod_name,namespace) - record: kubecost_container_memory_working_set_bytes - - expr: sum(container_memory_working_set_bytes{container_name!="POD",container_name!=""}) - record: kubecost_cluster_memory_working_set_bytes - - name: Savings - rules: - - expr: sum(avg(kube_pod_owner{owner_kind!="DaemonSet"}) by (pod) * sum(container_cpu_allocation) by (pod)) - record: kubecost_savings_cpu_allocation - labels: - daemonset: "false" - - expr: sum(avg(kube_pod_owner{owner_kind="DaemonSet"}) by (pod) * sum(container_cpu_allocation) by (pod)) / sum(kube_node_info) - record: kubecost_savings_cpu_allocation - labels: - daemonset: "true" - - expr: sum(avg(kube_pod_owner{owner_kind!="DaemonSet"}) by (pod) * sum(container_memory_allocation_bytes) by (pod)) - record: kubecost_savings_memory_allocation_bytes - labels: - daemonset: "false" - - expr: sum(avg(kube_pod_owner{owner_kind="DaemonSet"}) by (pod) * sum(container_memory_allocation_bytes) by (pod)) / sum(kube_node_info) - record: kubecost_savings_memory_allocation_bytes - labels: - daemonset: "true" - - expr: label_replace(sum(kube_pod_status_phase{phase="Running",namespace!="kube-system"} > 0) by (pod, namespace), "pod_name", "$1", "pod", "(.+)") - record: kubecost_savings_running_pods - - expr: sum(rate(container_cpu_usage_seconds_total{container_name!="",container_name!="POD",instance!=""}[5m])) by (namespace, pod_name, container_name, instance) - record: kubecost_savings_container_cpu_usage_seconds - - expr: sum(container_memory_working_set_bytes{container_name!="",container_name!="POD",instance!=""}) by (namespace, pod_name, container_name, instance) - record: kubecost_savings_container_memory_usage_bytes - - expr: avg(sum(kube_pod_container_resource_requests_cpu_cores{namespace!="kube-system"}) by (pod, namespace, instance)) by (pod, namespace) - record: kubecost_savings_pod_requests_cpu_cores - - expr: avg(sum(kube_pod_container_resource_requests_memory_bytes{namespace!="kube-system"}) by (pod, namespace, instance)) by (pod, namespace) - record: kubecost_savings_pod_requests_memory_bytes - -networkCosts: - enabled: false - podSecurityPolicy: - enabled: false - image: gcr.io/kubecost1/kubecost-network-costs:v13.7 - imagePullPolicy: Always - # Traffic Logging will enable logging the top 5 destinations for each source - # every 30 minutes. - trafficLogging: true - # Port will set both the containerPort and hostPort to this value. - # These must be identical due to network-costs being run on hostNetwork - port: 3001 - resources: {} - #requests: - # cpu: "50m" - # memory: "20Mi" - config: - # Configuration for traffic destinations, including specific classification - # for IPs and CIDR blocks. This configuration will act as an override to the - # automatic classification provided by network-costs. - destinations: - # In Zone contains a list of address/range that will be - # classified as in zone. - in-zone: - # Loopback - - "127.0.0.1" - # IPv4 Link Local Address Space - - "169.254.0.0/16" - # Private Address Ranges in RFC-1918 - - "10.0.0.0/8" - - "172.16.0.0/12" - - "192.168.0.0/16" - - # In Region contains a list of address/range that will be - # classified as in region. This is synonymous with cross - # zone traffic, where the regions between source and destinations - # are the same, but the zone is different. - in-region: [] - - # Cross Region contains a list of address/range that will be - # classified as non-internet egress from one region to another. - cross-region: [] - - # Direct Classification specifically maps an ip address or range - # to a region (required) and/or zone (optional). This classification - # takes priority over in-zone, in-region, and cross-region configurations. - direct-classification: [] - # - region: "us-east1" - # zone: "us-east1-c" - # ips: - # - "10.0.0.0/24" - - ## Node tolerations for server scheduling to nodes with taints - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - - ## PriorityClassName - ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass - priorityClassName: [] - ## PodMonitor - ## Allows scraping of network metrics from a dedicated prometheus operator setup - podMonitor: - enabled: false - additionalLabels: {} - -# Kubecost Deployment Configuration -# Used for HA mode in Business & Enterprise tier -kubecostDeployment: - replicas: 1 - -# Kubecost Cluster Controller for Right Sizing and Cluster Turndown -clusterController: - enabled: false - image: gcr.io/kubecost1/cluster-controller:v0.0.2 - imagePullPolicy: Always - -reporting: - # Kubecost bug report feature: Logs access/collection limited to .Release.Namespace - # Ref: http://docs.kubecost.com/bug-report - logCollection: true - productAnalytics: true - errorReporting: true - valuesReporting: true - -serviceMonitor: - enabled: false - additionalLabels: {} - -prometheusRule: - enabled: false - additionalLabels: {} - -supportNFS: true -initChownDataImage: "busybox" # Supports a fully qualified Docker image eg: registry.hub.docker.com/library/busybox:latest. -initChownData: - resources: {} - #requests: - # cpu: "50m" - # memory: "20Mi" - - -grafana: - # namespace_datasources: kubecost # override the default namespace here - # namespace_dashboards: kubecost # override the default namespace here - sidecar: - dashboards: - enabled: true - # label that the configmaps with dashboards are marked with - label: grafana_dashboard - datasources: - # dataSourceFilename: foo.yml # If you need to change the name of the datasource file - enabled: true - defaultDatasourceEnabled: false - dataSourceName: default-kubecost - # label that the configmaps with datasources are marked with - label: kubecost_grafana_datasource -# For grafana to be accessible, add the path to root_url. For example, if you run kubecost at www.foo.com:9090/kubecost -# set root_url to "%(protocol)s://%(domain)s:%(http_port)s/kubecost/grafana". No change is necessary here if kubecost runs at a root URL - grafana.ini: - server: - root_url: "%(protocol)s://%(domain)s:%(http_port)s/grafana" -serviceAccount: - create: true # Set this to false if you're bringing your own service account. - annotations: {} - # name: kc-test - -# These configs can also be set from the Settings page in the Kubecost product UI -# Values in this block override config changes in the Settings UI on pod restart -# -# kubecostProductConfigs: -# An optional list of cluster definitions that can be added for frontend access. The local -# cluster is *always* included by default, so this list is for non-local clusters. -# Ref: https://github.com/kubecost/docs/blob/master/multi-cluster.md -# clusters: -# - name: "Cluster A" -# address: http://cluster-a.kubecost.com:9090 -# # Optional authentication credentials - only basic auth is currently supported. -# auth: -# type: basic -# # Secret name should be a secret formatted based on: https://github.com/kubecost/docs/blob/master/ingress-examples.md -# secretName: cluster-a-auth -# # Or pass auth directly as base64 encoded user:pass -# data: YWRtaW46YWRtaW4= -# # Or user and pass directly -# user: admin -# pass: admin -# - name: "Cluster B" -# address: http://cluster-b.kubecost.com:9090 -# defaultModelPricing: # default monthly resource prices, used predominately for on-prem clusters -# CPU: 28.0 -# spotCPU: 4.86 -# RAM: 3.09 -# spotRAM: 0.65 -# GPU: 693.50 -# spotGPU: 225.0 -# storage: 0.04 -# zoneNetworkEgress: 0.01 -# regionNetworkEgress: 0.01 -# internetNetworkEgress: 0.12 -# enabled: true -# # The cluster profile represents a predefined set of parameters to use when calculating savings. -# # Possible values are: [ development, production, high-availability ] -# clusterProfile: production -# customPricesEnabled: false # This makes the default view custom prices-- generally used for on-premises clusters -# spotLabel: lifecycle -# spotLabelValue: Ec2Spot -# gpuLabel: gpu -# gpuLabelValue: true -# awsServiceKeyName: ACCESSKEYID -# awsServiceKeyPassword: fakepassword # Only use if your values.yaml are stored encrypted. Otherwise provide an existing secret via serviceKeySecretName -# awsSpotDataRegion: us-east-1 -# awsSpotDataBucket: spot-data-feed-s3-bucket -# awsSpotDataPrefix: dev -# athenaProjectID: "530337586277" # The AWS AccountID where the Athena CUR is. Generally your masterpayer account -# athenaBucketName: "s3://aws-athena-query-results-530337586277-us-east-1" -# athenaRegion: us-east-1 -# athenaDatabase: athenacurcfn_athena_test1 -# athenaTable: "athena_test1" -# masterPayerARN: "" -# projectID: "123456789" # Also known as AccountID on AWS -- the current account/project that this instance of Kubecost is deployed on. -# gcpSecretName: gcp-secret # Name of a secret representing the gcp service key -# bigQueryBillingDataDataset: billing_data.gcp_billing_export_v1_01AC9F_74CF1D_5565A2 -# labelMappingConfigs: # names of k8s labels used to designate different allocation concepts -# enabled: true -# owner_label: "owner" -# team_label: "team" -# department_label: "dept" -# product_label: "product" -# environment_label: "env" -# namespace_external_label: "kubernetes_namespace" # external labels are used to map external cloud costs to kubernetes concepts -# cluster_external_label: "kubernetes_cluster" -# controller_external_label: "kubernetes_controller" -# product_external_label: "kubernetes_label_app" -# service_external_label: "kubernetes_service" -# deployment_external_label: "kubernetes_deployment" -# team_external_label: "kubernetes_label_team" -# environment_external_label: "kubernetes_label_env" -# department_external_label: "kubernetes_label_department" -# statefulset_external_label: "kubernetes_statefulset" -# daemonset_external_label: "kubernetes_daemonset" -# pod_external_label: "kubernetes_pod" -# grafanaURL: "" -# clusterName: "" # used for display in Kubecost UI -# currencyCode: "USD" # offical support for USD, CAD, EUR, and CHF -# azureBillingRegion: US # Represents 2-letter region code, e.g. West Europe = NL, Canada = CA. ref: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes -# azureSubscriptionID: 0bd50fdf-c923-4e1e-850c-196dd3dcc5d3 -# azureClientID: f2ef6f7d-71fb-47c8-b766-8d63a19db017 -# azureTenantID: 72faf3ff-7a3f-4597-b0d9-7b0b201bb23a -# azureClientPassword: fake key # Only use if your values.yaml are stored encrypted. Otherwise provide an existing secret via serviceKeySecretName -# discount: "" # percentage discount applied to compute -# negotiatedDiscount: "" # custom negotiated cloud provider discount -# defaultIdle: false -# serviceKeySecretName: "" # Use an existing AWS or Azure secret with format as in aws-service-key-secret.yaml or azure-service-key-secret.yaml. Leave blank if using createServiceKeySecret -# createServiceKeySecret: true # Creates a secret representing your cloud service key based on data in values.yaml. If you are storing unencrypted values, add a secret manually -# sharedNamespaces: "" # namespaces with shared workloads, example value: "kube-system\,ingress-nginx\,kubecost\,monitoring" -# productKey: # apply business or enterprise product license -# key: "" -# enabled: false -# secretname: productkeysecret # create a secret out of a file named productkey.json of format { "key": "kc-b1325234" } diff --git a/index.yaml b/index.yaml deleted file mode 100644 index ae27c22ec..000000000 --- a/index.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -entries: - cost-analyzer: - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/namespace: kubecost - catalog.cattle.io/release-name: kubecost - apiVersion: v1 - appVersion: 1.70.0 - created: "2020-12-07T19:54:38.126920477-08:00" - description: A Helm chart that sets up Kubecost, Prometheus, and Grafana to monitor - cloud costs. - digest: 02744210876d3559b7713e24931ff5574910c201a6ed78ecef3f36d41a76c859 - name: cost-analyzer - urls: - - assets/kubecost/cost-analyzer-1.70.000.tgz - version: 1.70.000 -generated: "2020-12-07T19:54:38.104011356-08:00"