From 9232f5e6647295a6784a35acb63f5c97ca58cbf6 Mon Sep 17 00:00:00 2001 From: rlaisqls Date: Thu, 24 Aug 2023 19:14:13 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=80=20::=20git=20action?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yaml | 2 +- .gitignore | 3 + helm/argocd/charts/redis-ha-4.16.0.tgz | Bin 30122 -> 0 bytes helm/cert-manager/.helmignore | 27 - helm/cost-analyzer/Chart.lock | 12 - helm/cost-analyzer/Chart.yaml | 23 - helm/cost-analyzer/README.md | 70 - helm/cost-analyzer/attached-disks.json | 534 -- helm/cost-analyzer/charts/grafana-1.17.2.tgz | Bin 10954 -> 0 bytes .../charts/prometheus-11.0.2.tgz | Bin 33716 -> 0 bytes helm/cost-analyzer/charts/thanos-0.29.0.tgz | Bin 12383 -> 0 bytes helm/cost-analyzer/cluster-metrics.json | 1682 ----- helm/cost-analyzer/cluster-utilization.json | 3196 --------- helm/cost-analyzer/custom-pricing.csv | 7 - .../cost-analyzer/deployment-utilization.json | 1386 ---- .../cost-analyzer/grafana-templates/README.md | 44 - .../multi-cluster-container-stats.json | 852 --- .../multi-cluster-disk-usage.json | 568 -- .../multi-cluster-network-transfer-data.json | 654 -- .../kubernetes-resource-efficiency.json | 408 -- .../cost-analyzer/label-cost-utilization.json | 1145 ---- helm/cost-analyzer/namespace-utilization.json | 1175 ---- helm/cost-analyzer/networkCosts-metrics.json | 639 -- helm/cost-analyzer/node-utilization.json | 1389 ---- .../pod-utilization-multi-cluster.json | 777 --- helm/cost-analyzer/pod-utilization.json | 757 --- helm/cost-analyzer/prom-benchmark.json | 5689 ----------------- .../create-admission-controller-tls.sh | 24 - helm/cost-analyzer/templates/NOTES.txt | 41 - helm/cost-analyzer/templates/_helpers.tpl | 310 - .../templates/alibaba-service-key-secret.yaml | 20 - .../templates/aws-service-key-secret.yaml | 20 - .../awsstore-deployment-template.yaml | 35 - .../awsstore-service-account-template.yaml | 15 - .../templates/azure-service-key-secret.yaml | 24 - .../azure-storage-config-secret.yaml | 26 - ...t-analyzer-advanced-reports-configmap.yaml | 13 - .../cost-analyzer-alerts-configmap.yaml | 11 - ...cost-analyzer-asset-reports-configmap.yaml | 14 - ...analyzer-cloud-cost-reports-configmap.yaml | 13 - ...nalyzer-cluster-role-binding-template.yaml | 36 - ...alyzer-cluster-role-template-readonly.yaml | 26 - .../cost-analyzer-cluster-role-template.yaml | 118 - .../cost-analyzer-config-map-template.yaml | 35 - .../cost-analyzer-db-pvc-template.yaml | 37 - .../cost-analyzer-deployment-template.yaml | 1147 ---- ...nalyzer-federator-config-map-template.yaml | 14 - ...analyzer-frontend-config-map-template.yaml | 335 - .../cost-analyzer-ingress-template.yaml | 66 - ...-analyzer-metrics-config-map-template.yaml | 13 - ...zer-network-costs-config-map-template.yaml | 16 - ...zer-network-costs-podmonitor-template.yaml | 32 - ...alyzer-network-costs-service-template.yaml | 35 - .../cost-analyzer-network-costs-template.yaml | 143 - ...cost-analyzer-network-policy-template.yaml | 47 - .../cost-analyzer-network-policy.yaml | 51 - ...ost-analyzer-oidc-config-map-template.yaml | 43 - .../cost-analyzer-pkey-configmap.yaml | 23 - .../cost-analyzer-pricing-configmap.yaml | 141 - ...rometheus-postgres-adapter-deployment.yaml | 61 - ...r-prometheus-postgres-adapter-service.yaml | 21 - ...cost-analyzer-prometheusrule-template.yaml | 22 - .../cost-analyzer-psp-role.template.yaml | 23 - ...ost-analyzer-psp-rolebinding.template.yaml | 21 - .../templates/cost-analyzer-psp.template.yaml | 24 - .../templates/cost-analyzer-pvc-template.yaml | 33 - ...ost-analyzer-saml-config-map-template.yaml | 14 - ...cost-analyzer-saved-reports-configmap.yaml | 13 - .../cost-analyzer-server-configmap.yaml | 73 - ...ost-analyzer-service-account-template.yaml | 13 - .../cost-analyzer-service-template.yaml | 76 - ...cost-analyzer-servicemonitor-template.yaml | 34 - .../external-grafana-config-map-template.yaml | 11 - .../templates/extra-manifests.yaml | 8 - .../federator-deployment-template.yaml | 120 - .../gcpstore-config-map-template.yaml | 61 - ...rafana-attached-disk-metrics-template.yaml | 27 - ...na-dashboard-cluster-metrics-template.yaml | 29 - ...ashboard-cluster-utilization-template.yaml | 27 - ...board-deployment-utilization-template.yaml | 27 - ...bernetes-resource-efficiency-template.yaml | 27 - ...board-label-cost-utilization-template.yaml | 27 - ...hboard-namespace-utilization-template.yaml | 27 - ...a-dashboard-node-utilization-template.yaml | 27 - ...na-dashboard-pod-utilization-template.yaml | 27 - ...dashboard-prometheus-metrics-template.yaml | 27 - .../grafana-datasource-template.yaml | 56 - ...grafana-networkcosts-metrics-template.yaml | 27 - ...od-utilization-multi-cluster-template.yaml | 27 - ...admission-controller-service-template.yaml | 15 - ...ubecost-admission-controller-template.yaml | 30 - .../kubecost-agent-secret-template.yaml | 12 - ...ubecost-agent-secretprovider-template.yaml | 25 - .../kubecost-cluster-controller-template.yaml | 392 -- ...st-cluster-manager-configmap-template.yaml | 14 - .../kubecost-metrics-deployment-template.yaml | 331 - ...cost-metrics-service-monitor-template.yaml | 41 - .../kubecost-metrics-service-template.yaml | 34 - .../kubecost-oidc-secret-template.yaml | 16 - .../kubecost-priority-class-template.yaml | 15 - .../mimir-proxy-configmap-template.yaml | 21 - .../mimir-proxy-deployment-template.yaml | 40 - .../mimir-proxy-service-template.yaml | 18 - .../templates/network-costs-psp.template.yaml | 40 - .../network-costs-role.template.yaml | 25 - .../network-costs-rolebinding.template.yaml | 23 - ...network-costs-servicemonitor-template.yaml | 32 - ...service-cluster-role-binding-template.yaml | 34 - .../query-service-cluster-role-template.yaml | 109 - .../query-service-deployment-template.yaml | 187 - ...uery-service-service-account-template.yaml | 17 - .../query-service-service-template.yaml | 19 - helm/cost-analyzer/values-agent.yaml | 119 - helm/cost-analyzer/values-amp.yaml | 20 - helm/cost-analyzer/values-cloud-agent.yaml | 54 - helm/cost-analyzer/values-custom-pricing.yaml | 17 - .../values-eks-cost-monitoring.yaml | 183 - helm/cost-analyzer/values-thanos.yaml | 147 - .../values-windows-node-affinity.yaml | 50 - helm/cost-analyzer/values.yaml | 1183 ---- helm/thanos/Chart.lock | 9 - helm/thanos/charts/common-2.9.0.tgz | Bin 12942 -> 0 bytes helm/thanos/charts/common/.helmignore | 22 - helm/thanos/charts/common/Chart.yaml | 23 - helm/thanos/charts/common/README.md | 235 - .../charts/common/templates/_affinities.tpl | 111 - .../charts/common/templates/_capabilities.tpl | 185 - .../charts/common/templates/_errors.tpl | 28 - .../charts/common/templates/_images.tpl | 85 - .../charts/common/templates/_ingress.tpl | 73 - .../charts/common/templates/_labels.tpl | 23 - .../thanos/charts/common/templates/_names.tpl | 71 - .../charts/common/templates/_secrets.tpl | 172 - .../charts/common/templates/_storage.tpl | 28 - .../charts/common/templates/_tplvalues.tpl | 27 - .../thanos/charts/common/templates/_utils.tpl | 67 - .../charts/common/templates/_warnings.tpl | 19 - .../templates/validations/_cassandra.tpl | 77 - .../common/templates/validations/_mariadb.tpl | 108 - .../common/templates/validations/_mongodb.tpl | 113 - .../common/templates/validations/_mysql.tpl | 108 - .../templates/validations/_postgresql.tpl | 134 - .../common/templates/validations/_redis.tpl | 81 - .../templates/validations/_validations.tpl | 51 - helm/thanos/charts/common/values.yaml | 8 - helm/thanos/charts/minio-12.8.0.tgz | Bin 46987 -> 0 bytes helm/thanos/charts/minio/.helmignore | 21 - helm/thanos/charts/minio/Chart.lock | 6 - helm/thanos/charts/minio/Chart.yaml | 29 - helm/thanos/charts/minio/README.md | 527 -- .../charts/minio/charts/common/.helmignore | 22 - .../charts/minio/charts/common/Chart.yaml | 23 - .../charts/minio/charts/common/README.md | 235 - .../charts/common/templates/_affinities.tpl | 111 - .../charts/common/templates/_capabilities.tpl | 185 - .../minio/charts/common/templates/_errors.tpl | 28 - .../minio/charts/common/templates/_images.tpl | 85 - .../charts/common/templates/_ingress.tpl | 73 - .../minio/charts/common/templates/_labels.tpl | 23 - .../minio/charts/common/templates/_names.tpl | 71 - .../charts/common/templates/_secrets.tpl | 172 - .../charts/common/templates/_storage.tpl | 28 - .../charts/common/templates/_tplvalues.tpl | 27 - .../minio/charts/common/templates/_utils.tpl | 67 - .../charts/common/templates/_warnings.tpl | 19 - .../templates/validations/_cassandra.tpl | 77 - .../common/templates/validations/_mariadb.tpl | 108 - .../common/templates/validations/_mongodb.tpl | 113 - .../common/templates/validations/_mysql.tpl | 108 - .../templates/validations/_postgresql.tpl | 134 - .../common/templates/validations/_redis.tpl | 81 - .../templates/validations/_validations.tpl | 51 - .../charts/minio/charts/common/values.yaml | 8 - helm/thanos/charts/minio/templates/NOTES.txt | 76 - .../charts/minio/templates/_helpers.tpl | 243 - .../charts/minio/templates/api-ingress.yaml | 66 - .../templates/distributed/headless-svc.yaml | 37 - .../minio/templates/distributed/pdb.yaml | 28 - .../templates/distributed/statefulset.yaml | 346 - .../charts/minio/templates/extra-list.yaml | 9 - .../charts/minio/templates/ingress.yaml | 66 - .../charts/minio/templates/networkpolicy.yaml | 39 - .../minio/templates/prometheusrule.yaml | 27 - .../templates/provisioning-configmap.yaml | 78 - .../minio/templates/provisioning-job.yaml | 328 - helm/thanos/charts/minio/templates/pvc.yaml | 34 - .../charts/minio/templates/secrets.yaml | 23 - .../charts/minio/templates/service.yaml | 58 - .../minio/templates/serviceaccount.yaml | 28 - .../minio/templates/servicemonitor.yaml | 56 - .../templates/standalone/deployment.yaml | 263 - .../charts/minio/templates/tls-secrets.yaml | 78 - helm/thanos/charts/minio/values.yaml | 1078 ---- 193 files changed, 4 insertions(+), 35483 deletions(-) create mode 100644 .gitignore delete mode 100644 helm/argocd/charts/redis-ha-4.16.0.tgz delete mode 100644 helm/cert-manager/.helmignore delete mode 100644 helm/cost-analyzer/Chart.lock delete mode 100755 helm/cost-analyzer/Chart.yaml delete mode 100644 helm/cost-analyzer/README.md delete mode 100644 helm/cost-analyzer/attached-disks.json delete mode 100644 helm/cost-analyzer/charts/grafana-1.17.2.tgz delete mode 100644 helm/cost-analyzer/charts/prometheus-11.0.2.tgz delete mode 100644 helm/cost-analyzer/charts/thanos-0.29.0.tgz delete mode 100644 helm/cost-analyzer/cluster-metrics.json delete mode 100644 helm/cost-analyzer/cluster-utilization.json delete mode 100644 helm/cost-analyzer/custom-pricing.csv delete mode 100644 helm/cost-analyzer/deployment-utilization.json delete mode 100644 helm/cost-analyzer/grafana-templates/README.md delete mode 100644 helm/cost-analyzer/grafana-templates/multi-cluster-container-stats.json delete mode 100644 helm/cost-analyzer/grafana-templates/multi-cluster-disk-usage.json delete mode 100644 helm/cost-analyzer/grafana-templates/multi-cluster-network-transfer-data.json delete mode 100644 helm/cost-analyzer/kubernetes-resource-efficiency.json delete mode 100644 helm/cost-analyzer/label-cost-utilization.json delete mode 100644 helm/cost-analyzer/namespace-utilization.json delete mode 100644 helm/cost-analyzer/networkCosts-metrics.json delete mode 100644 helm/cost-analyzer/node-utilization.json delete mode 100644 helm/cost-analyzer/pod-utilization-multi-cluster.json delete mode 100644 helm/cost-analyzer/pod-utilization.json delete mode 100644 helm/cost-analyzer/prom-benchmark.json delete mode 100755 helm/cost-analyzer/scripts/create-admission-controller-tls.sh delete mode 100644 helm/cost-analyzer/templates/NOTES.txt delete mode 100755 helm/cost-analyzer/templates/_helpers.tpl delete mode 100644 helm/cost-analyzer/templates/alibaba-service-key-secret.yaml delete mode 100644 helm/cost-analyzer/templates/aws-service-key-secret.yaml delete mode 100644 helm/cost-analyzer/templates/awsstore-deployment-template.yaml delete mode 100644 helm/cost-analyzer/templates/awsstore-service-account-template.yaml delete mode 100644 helm/cost-analyzer/templates/azure-service-key-secret.yaml delete mode 100644 helm/cost-analyzer/templates/azure-storage-config-secret.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-advanced-reports-configmap.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-alerts-configmap.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-asset-reports-configmap.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-cloud-cost-reports-configmap.yaml delete mode 100755 helm/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml delete mode 100755 helm/cost-analyzer/templates/cost-analyzer-cluster-role-template-readonly.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml delete mode 100755 helm/cost-analyzer/templates/cost-analyzer-config-map-template.yaml delete mode 100755 helm/cost-analyzer/templates/cost-analyzer-db-pvc-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-deployment-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-federator-config-map-template.yaml delete mode 100755 helm/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-ingress-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-metrics-config-map-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-network-costs-podmonitor-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-network-policy-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-network-policy.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-oidc-config-map-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-pkey-configmap.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-prometheus-postgres-adapter-deployment.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-prometheus-postgres-adapter-service.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-psp-role.template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-psp-rolebinding.template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-psp.template.yaml delete mode 100755 helm/cost-analyzer/templates/cost-analyzer-pvc-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-saml-config-map-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-saved-reports-configmap.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-server-configmap.yaml delete mode 100755 helm/cost-analyzer/templates/cost-analyzer-service-account-template.yaml delete mode 100755 helm/cost-analyzer/templates/cost-analyzer-service-template.yaml delete mode 100644 helm/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml delete mode 100644 helm/cost-analyzer/templates/external-grafana-config-map-template.yaml delete mode 100644 helm/cost-analyzer/templates/extra-manifests.yaml delete mode 100644 helm/cost-analyzer/templates/federator-deployment-template.yaml delete mode 100644 helm/cost-analyzer/templates/gcpstore-config-map-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-attached-disk-metrics-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-dashboard-cluster-metrics-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-dashboard-cluster-utilization-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-dashboard-deployment-utilization-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-dashboard-kubernetes-resource-efficiency-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-dashboard-label-cost-utilization-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-dashboard-namespace-utilization-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-dashboard-node-utilization-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-dashboard-pod-utilization-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-dashboard-prometheus-metrics-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-datasource-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-networkcosts-metrics-template.yaml delete mode 100644 helm/cost-analyzer/templates/grafana-pod-utilization-multi-cluster-template.yaml delete mode 100644 helm/cost-analyzer/templates/kubecost-admission-controller-service-template.yaml delete mode 100644 helm/cost-analyzer/templates/kubecost-admission-controller-template.yaml delete mode 100644 helm/cost-analyzer/templates/kubecost-agent-secret-template.yaml delete mode 100644 helm/cost-analyzer/templates/kubecost-agent-secretprovider-template.yaml delete mode 100644 helm/cost-analyzer/templates/kubecost-cluster-controller-template.yaml delete mode 100644 helm/cost-analyzer/templates/kubecost-cluster-manager-configmap-template.yaml delete mode 100644 helm/cost-analyzer/templates/kubecost-metrics-deployment-template.yaml delete mode 100644 helm/cost-analyzer/templates/kubecost-metrics-service-monitor-template.yaml delete mode 100644 helm/cost-analyzer/templates/kubecost-metrics-service-template.yaml delete mode 100644 helm/cost-analyzer/templates/kubecost-oidc-secret-template.yaml delete mode 100644 helm/cost-analyzer/templates/kubecost-priority-class-template.yaml delete mode 100644 helm/cost-analyzer/templates/mimir-proxy-configmap-template.yaml delete mode 100644 helm/cost-analyzer/templates/mimir-proxy-deployment-template.yaml delete mode 100644 helm/cost-analyzer/templates/mimir-proxy-service-template.yaml delete mode 100644 helm/cost-analyzer/templates/network-costs-psp.template.yaml delete mode 100644 helm/cost-analyzer/templates/network-costs-role.template.yaml delete mode 100644 helm/cost-analyzer/templates/network-costs-rolebinding.template.yaml delete mode 100644 helm/cost-analyzer/templates/network-costs-servicemonitor-template.yaml delete mode 100644 helm/cost-analyzer/templates/query-service-cluster-role-binding-template.yaml delete mode 100644 helm/cost-analyzer/templates/query-service-cluster-role-template.yaml delete mode 100644 helm/cost-analyzer/templates/query-service-deployment-template.yaml delete mode 100755 helm/cost-analyzer/templates/query-service-service-account-template.yaml delete mode 100755 helm/cost-analyzer/templates/query-service-service-template.yaml delete mode 100644 helm/cost-analyzer/values-agent.yaml delete mode 100644 helm/cost-analyzer/values-amp.yaml delete mode 100644 helm/cost-analyzer/values-cloud-agent.yaml delete mode 100644 helm/cost-analyzer/values-custom-pricing.yaml delete mode 100644 helm/cost-analyzer/values-eks-cost-monitoring.yaml delete mode 100644 helm/cost-analyzer/values-thanos.yaml delete mode 100644 helm/cost-analyzer/values-windows-node-affinity.yaml delete mode 100644 helm/cost-analyzer/values.yaml delete mode 100644 helm/thanos/Chart.lock delete mode 100644 helm/thanos/charts/common-2.9.0.tgz delete mode 100644 helm/thanos/charts/common/.helmignore delete mode 100644 helm/thanos/charts/common/Chart.yaml delete mode 100644 helm/thanos/charts/common/README.md delete mode 100644 helm/thanos/charts/common/templates/_affinities.tpl delete mode 100644 helm/thanos/charts/common/templates/_capabilities.tpl delete mode 100644 helm/thanos/charts/common/templates/_errors.tpl delete mode 100644 helm/thanos/charts/common/templates/_images.tpl delete mode 100644 helm/thanos/charts/common/templates/_ingress.tpl delete mode 100644 helm/thanos/charts/common/templates/_labels.tpl delete mode 100644 helm/thanos/charts/common/templates/_names.tpl delete mode 100644 helm/thanos/charts/common/templates/_secrets.tpl delete mode 100644 helm/thanos/charts/common/templates/_storage.tpl delete mode 100644 helm/thanos/charts/common/templates/_tplvalues.tpl delete mode 100644 helm/thanos/charts/common/templates/_utils.tpl delete mode 100644 helm/thanos/charts/common/templates/_warnings.tpl delete mode 100644 helm/thanos/charts/common/templates/validations/_cassandra.tpl delete mode 100644 helm/thanos/charts/common/templates/validations/_mariadb.tpl delete mode 100644 helm/thanos/charts/common/templates/validations/_mongodb.tpl delete mode 100644 helm/thanos/charts/common/templates/validations/_mysql.tpl delete mode 100644 helm/thanos/charts/common/templates/validations/_postgresql.tpl delete mode 100644 helm/thanos/charts/common/templates/validations/_redis.tpl delete mode 100644 helm/thanos/charts/common/templates/validations/_validations.tpl delete mode 100644 helm/thanos/charts/common/values.yaml delete mode 100644 helm/thanos/charts/minio-12.8.0.tgz delete mode 100644 helm/thanos/charts/minio/.helmignore delete mode 100644 helm/thanos/charts/minio/Chart.lock delete mode 100644 helm/thanos/charts/minio/Chart.yaml delete mode 100644 helm/thanos/charts/minio/README.md delete mode 100644 helm/thanos/charts/minio/charts/common/.helmignore delete mode 100644 helm/thanos/charts/minio/charts/common/Chart.yaml delete mode 100644 helm/thanos/charts/minio/charts/common/README.md delete mode 100644 helm/thanos/charts/minio/charts/common/templates/_affinities.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/_capabilities.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/_errors.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/_images.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/_ingress.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/_labels.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/_names.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/_secrets.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/_storage.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/_tplvalues.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/_utils.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/_warnings.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/validations/_cassandra.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/validations/_mariadb.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/validations/_mongodb.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/validations/_mysql.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/validations/_postgresql.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/validations/_redis.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/templates/validations/_validations.tpl delete mode 100644 helm/thanos/charts/minio/charts/common/values.yaml delete mode 100644 helm/thanos/charts/minio/templates/NOTES.txt delete mode 100644 helm/thanos/charts/minio/templates/_helpers.tpl delete mode 100644 helm/thanos/charts/minio/templates/api-ingress.yaml delete mode 100644 helm/thanos/charts/minio/templates/distributed/headless-svc.yaml delete mode 100644 helm/thanos/charts/minio/templates/distributed/pdb.yaml delete mode 100644 helm/thanos/charts/minio/templates/distributed/statefulset.yaml delete mode 100644 helm/thanos/charts/minio/templates/extra-list.yaml delete mode 100644 helm/thanos/charts/minio/templates/ingress.yaml delete mode 100644 helm/thanos/charts/minio/templates/networkpolicy.yaml delete mode 100644 helm/thanos/charts/minio/templates/prometheusrule.yaml delete mode 100644 helm/thanos/charts/minio/templates/provisioning-configmap.yaml delete mode 100644 helm/thanos/charts/minio/templates/provisioning-job.yaml delete mode 100644 helm/thanos/charts/minio/templates/pvc.yaml delete mode 100644 helm/thanos/charts/minio/templates/secrets.yaml delete mode 100644 helm/thanos/charts/minio/templates/service.yaml delete mode 100644 helm/thanos/charts/minio/templates/serviceaccount.yaml delete mode 100644 helm/thanos/charts/minio/templates/servicemonitor.yaml delete mode 100644 helm/thanos/charts/minio/templates/standalone/deployment.yaml delete mode 100644 helm/thanos/charts/minio/templates/tls-secrets.yaml delete mode 100644 helm/thanos/charts/minio/values.yaml diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 11085a5c..467b776d 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -45,7 +45,7 @@ jobs: helm repo add $random_name() $repo || true fi done <<< $(yq eval '.dependencies[] | .repository' "$chart_lock_file") # repos - done <<< "$(find . -name "Chart.lock") # chart lock files + done <<< "$(find . -mindepth 2 -maxdepth 2 -name "Chart.lock") # chart lock files - name: Helm build working-directory: helm diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..7fc46728 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +**/charts/* +!**/charts/crds/ +!**/charts/crds/** \ No newline at end of file diff --git a/helm/argocd/charts/redis-ha-4.16.0.tgz b/helm/argocd/charts/redis-ha-4.16.0.tgz deleted file mode 100644 index 63486a99dc06e112b5021b26dbd7024d0b4812b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30122 zcmV)WK(4Dc zVQyr3R8em|NM&qo0PMZ{SL3#}IDUW5U!hN!TcE{GfElLEz0-9m&8PKni^S_V3cmmTlQdcnvcLpLIIK)^lrXzqLhCh?zHrot-hH+@Hcp^dI;A zbi3W|*2|aj-)^^C{&#(2bNxToUv9kI-0W^_Y`pxB?)t{otF8Y4-FqL2<4GBZ^gp_H z?yEexFXVv<{tZ!vN!$bH8!eb5+0QM1!++HZ5eq0zxO{ay#tghg(F6nnT|h#~ISvs6 z5RCC?98Cc{hd6?R2!SJkSpZLx2u)DTp=beIU_NdE0Ko(@j%bHP@En1F#6vtvsVW2G z5Tpz-&_^-HF^T}gAqpU6U`Qw!LL8BEM8O2ca3tGqjmZS{z?k!-*Xc-<_A%+Sa3BUP zUb9}OlO_>?p?`tT@C1bz`h<=;;#VSmbx_>l<8(6UY<0E<9Xa}wcVt9-c0TH?Z*;rK zrB{6GC-JCthNc&UhOF1}fb6;DfipBchf#`J9ta_a1ISQo0&&bCjuDkb(FEeC2N;a- zguw`=i2ctJxX#o&JF(alwzkX;^#3uQ zr6sVVsV@Q)Df$2?`YT0@Gf9ghJi(l`mX-iT!;H$Fr2|A`#F3^Q0qdj;QE!yu5Oo4F zNm7nH(<1A%mX=z00!OIV0)V1~Fw6;^YTDESfWwjIIUbA>9HSNhNg73mB*MY82lj^t zgdbAG1i=@hIYL83Q5+z^2_P{7gn|j72rv{-#F=VKn|lgA?BVD zhwO}X40}ReLP9SfnvQowd!B5}ODH~va=s(XIGu{=DsCyiAEr^%*Q3G=kT{x3UPd*K z)Z=ND3-`buf3}u@r)hgzcP9E(lWe!tG?EAhkbyXz3=ow~BN&WPgZ{u=>4Mu2h1(J+k|;vgZR#acn4z&{VP0ul!(;jD8(=$YUo@)f5fiV$TTtCP-> zfMni_Cwsw&wGtA(&t99Q|3E`TQFw%4IMow|p(mke<|W?ZI7F8y1X8GAV1zh`k&qM; zN+yJ(P-BGRS6K})d&-%VO+XiT;9`t}u~;Wn5Re$)7;{;{M?PqOzxG2LOc0D2_@0mD zCi#JnRlnc@N0I17k4!bIe+WDw6!Ynuu4s)R1YpESugZ)$NpQeAOp8D*N>1`6Y^!De zHCqB;+TDpDV-i~=5{R`m6y9TqN??$%wN$Kdps=fLVFrlc07b0WimaC5yU}KU-p;+C3BFIrFYqo&?*#n%WNVRr6Mrs|%Py(UU5+{N%`Ks*x z5X6K7vHJursm25Xisse;R1IN)(lMfA|y*6Y>N&c#{rC@sUQWHVu?A? z3X0m}zG5f=nM_a|Dgt`R5shUfA*2c}qG|+DDylHQf}+8I#2oor+{L6bhN8cz7X~Cg z@2vYjbg-a@{+Lgqmi{OfN5kciP~HPuo3DQmC}rSRc$>im9KY)Wj_3r(N^K%Bc)KlI zTvMD!5+aRD5S)`Jogg4VEx2vOM8^Oi*;;4-FJ39uk`V>*>I_W}G$H{IAj;p1b`BvQ z_dthF60wq%ma?JZA()aBT)>zE2tpL%Kq9eNAb?|_A(690PmypbDZubU98GHnn`r2K z-&Jx&#^nIW#EqiBp?j0>rO>hAzx01ljn&E<4dl&?UJ%D3X_J-iDyGOr9#Bxx6wE1l zh&5~!J^+AmOq6o3CJizv()>n~gim)dwP12c!afR8!GILFiza~i=A4NeN<`_1IWyg= zr{9^`CFKqkTGUYe>hN5IUpJi-e@(i~48bmDG?kVU@KYL&5MN|1X&QSlk?1U1u-7&m z*z?MJQJrY0i>3R>kdiee+9^K7FNpp+ftTCHTGIpT<}Hp3Z(9YT!#EDkrhp+Ply!@Y z#w0`xoMS<(5B2t1S^~czIu)orOe48pA`*|h2%ii54oDoMKw=Jng5`h!GC58`%jr~8 zVK_-5vDH=A8OgWE%)F9NaiiABKng3gFv6#as&CIKC)f&$M4=woQEXxVP`-;Y_9R|u zYyT2bLL#!OG`e z0grPb=EHD^0}LZGeSjtd6o!IyQ!)|TC1qfOIK=@I;){?an4i(Tp34HHS0VeCQ-m@T zl28}$pp&=mWdfDftCV1TPh!Db)S$!|eiwvX$a4ag0{LRG3vz){SI{f3)oYYkI4lXN+Uqbqp1+S3`BLq z3L;q@9CJj^VblYgT~=sGz+B8yp`HOP;3z^9j_B0O7Dd#MuMwxy60GeOOWe0O@ihr% zF2o;BK!}DoMnd+W1_xwqS=pM@heSx#gl7F%OuPVgJV8Qw7S&4-(4Tr>T>?Ppi$?M& zazj&4?KrjTd*CI@&bG$tq3TRCWU2KOT7Ss$z0IKg=XosO}wcNF65N36@vnrO% z@!=d%ibJ7sM}R0!ue;7jmy1>XY3mryEcS8O% zg9y(#eXZwln!7Zhc5o;m5m{-C2;WJ7#!{Ge0cwU?_hUtw`cF} zY$1gFrwngGRSaMZ&?O2|p}W!n<`hx^^vMLqp(F%p5(;v{rYztQ5X5DIgjU{K0{_qr z#N;C4tzh1JJZ$}q!Dz=DJ`QH-8`%{*8 zS>#J%?S-}gV*n#*_YklR#wbi9MArcFM?PpXPUu;?YWG+KI=LP*Nh6Mv2zgmQ%1f}6 zcdTp<3NeM2p~+!Tq7_7{KddE%j9x1@3P_WQk}V~7(?b4as@}DMVc(OKaWH{A7=wTQ z@#)ir_vw@W=XWnwl|2r|Vn-RXT9}h1H4~;SoRUxQh)KaQM@dQfc*Kky=lfSP8_;$P zIk~KzHGqdoo@9tK&@LC8BGwkWNZF7DgiOyzd8q=I-RD3Wbs57#xf2o-W>U{na))%h zOLLC^Iuz=a*!n2urcY_GXp5ISvW6G|Q-Uu6?U+b)3RvHJ>aFfS7NkN5Y`Gol7YYM( zh$xn{jp*GjH6?ICv9wl3kd6>I+WiTz7$$5?IP<~E+4n5tKbQ$gbakfT(&4fYEMHRR zj14Gng*8S`i8o^VH4VH6wz_hrAj0P;Moeg@WPmJcWqE;YYpW@LD2gkYO$szH+C>qZ zX6MyM=3?tdx@tM!4N-@v8Y|2nQkmL zlDilTF)+IpN_BOBB64Bs{YjB{F^2k!p~eXT6^ZAMyIgJ0GQy|>_z5r z;t5R6j4FkX6L{%Gf@r^zgy%OHrAX{rra+@Az{?4mNJ`)C=0xf}yaejKb|2)9KJ7@1 z8HaIzd?8YqeUQe|fvW^Ut8FcG^g#QZM3CbMc@a(9rH)jgMf$T_^D_xgZ4|@=4Kw6D zlv{WJgR?YY0MbloDYPdUmTBlPlJp`bT(E4&K|}%=ffW*aA!cW*qD5`_W?aj|x=}@| zDDv1;`3$sJAEOK9x$~vZM%v3Rpqz3-(YYXlQaDg5rDENJPM$?#Lt6w`jgi4~!D4>s zcENhPWmy9>(_aH2rYI02 zx8_7hGIg*M1NF?XB@B9?Em(&78V&+7NvN{xmA?p`lBE;#x}fsp8{z&{oxE*)zeVYG^+YWzWXbt!`TiX~165l| z^nFetMgLG|h})h(6|m*PllBkvKBzL}4*fSGm9hLn>{`o@?w z0h_f;75F!+T;^!WJT1~;k|C7kXj30r(mriMBby~+6F-m(#T!y8E(xG=rIrUc4wp4~ z!sn6(iC0qo0+BXd$A}B4D%vxIf$~tvf<4gn<^QVktr^FBGV+F7NUk<=CppETu2-1ZqN}!N21t6sCD;l%iQb2saAT;b{f9d9h?uRZhlj61V?is8VZ_dyZ zoQl?dMblHTqKI!k65q78s;xY#A>~QzWyQ4HPXUux~ca;IEWWAvbI^3h(wbn&fvMe2~seT|mfx zrZpivqDv{iAc-sji-v?wpxBuc3?nF=Ez4P7mzS5o*a5_kWhq*i_5`dcNf3>ux!x~& zKmivbwA%DckHs%&7I)Ap$|MN@QNe>lj;J@mQG{8xAYEgp7yX);c;lfsH)@4lDO)MY z!E=wr_gPZ{zoJO&)M*?rv4~n_2nwVg0ES(58Al-TbP7&hDK*Rv%YnlC6kpS^tM$^QM(^Q8W*lyPX z;sp+avbLZv=}&r%&E#Xm{eV#9Ga~j0iDL~3xdnS*S?-u+DYYGtP;ForV^#-V3T#v33G zy&-~JfchT0GvJdQ!kA;vylII7eLcg>x@|ixwJ|x1hh4~XnFV$;00W^kN0^NTi^|-H zq7O`g?c6j`z*0&JcT+0FBV`7`@n~NWG4*;+x;^AUD8XM;JlIcDPoub(_&kwu>6wnW^}=^*6&o*M|nkH zlJvmURVD|5b{29iSU?;2;O3@Wi6UvKlokCW^}|1a6I3e8NkSqrno2FExVB@$xaiFPmdL{>0TJ?rWPzQQ`Pi4=cJfb7=kEkw_Rr9T4n8bQOTM`nqxfUYAjfQoRamAx zs$oYkWr0;Q>_MiSb08{S8q^-q)ZXUvb${cv-)%geHBTI#iNf1hZ`m<;i z34)X|Ar%CO3V{cp_#9Irg|tjkglb%Nwvg3P77wH&1rt0n2(91YA9oe2pYr&=TzfDJ0y^mTRk%B&e;N8bVrA=UB4srvmR!6U$7mz4Y!9!|VvaZ;UN^bT%!x{7^5RgP@ghNUu&WO@Fge{&< z)}f_LHhrQ8aiY5LqZC%V*JaEw#2h^Rx7ts66)6!?#8VnG0h1I0snKiBr$Z{VDNP-# z)CX?!Hhv;}T>h*A69!1LPPQhk8QPcu!P{T7aPMXcZp zHVvFc@Qqfh{v=M*IUIQk=VJ_u=WraSaB9QFs{WsEbi^A>`B<6MjYr7#2Q8^a4vj}B z3jti*4OD1oRSs3g5i%l!5)jz_y$|}EfKbryzs=6QNh`fn6s1?F;y02bYVs24Gs#UZ zqRc@g{%ExlL>Xor#avl53u177?8Rs*GJ6X+%qjs@3-nc}1&{}aTIL9^+QZ?RiNvsu z75%sU>c^~xasGL2SEY7)P47PKYGfds#&CiIm3N0>5-XakT1#U+0d$Tj$MHzJvS#skUAcBB3r~lhN#&$+H0o}LwgJ)@j;hd9&8~OnM=NS zq}15tm%z_BiZU@n^sQ-FNzW2^AX%-L_VK%Z!EdjRuN{xg30)&WXmBtk0*W4_(YMVb z=8Fb?#t~`*PaV?88(dQ*&d}5@pwHoowse62?$kFT4-IZh{F8;l@u8&YcJXkWdo83_ zEt?3-refS?BNW?t1eDWG%Il(2W|j#LwF}N12nX`0XP&A+N#{CnL&r0i70k|%^N1B) z{|9U!*r7PG#s3$1tk=Zu+Z}HP*EXP-;i;Ocmp{5UX0*q?|(n;AMNcbF?G|7s3+OQvf=_KXK1=C@oZUjuU?1> zW&|anp|u3|{%`yJ;k!McAy{sHnQituok1F$A)d`|xiTO&wyMZpbL9lbQjm)T8^Cc8 zrBWi9n z$bR#qRX%@xvcGG}s$W0m<1y6D2%G}@_ICy6)g~Afi=qaSqiL2YBS+Ni6-6TzR4aZm zHm-w*sbgi~$yL9jRE3>M zWA4S&PDc?Lz{uAHFo{o0!>7`Sq&CBnhg2ytX?4W}L6vaG zfjrK4wkda)1ZkF1v;!0DPr@b9yBwz+MwS@Cax|kI$<@Ee;7$ALN>hB>pJfs+DW6vR2E2I#x>*xLLVMuVB>SyxHdYr5og*q; zQUS#>QBn5M)^4mCg`})UCN&qhx&mT^FH{%4cy)8r1~)eXyFz=O0I+m2fpof9^_KJp z?8lgAu}mgMT^d`k4d3O?7MQDZQ*(Nk$pTN=3b33Fw`zVhG2GBDo!8 zS{0?(!7N2mm}`uxH)~tBbkK9*K(0B4dtiTaN3FA(bGa%eI6D}kVllFiahV+DTxdb! zcUG-J*{Zoe3TDBjC0orB)L}&B$rZUvC8O02do@O>;c+S4Wwn_dPig6E^Egk1OnHvc zh4iB0c%%&WWbiK(aMn>n?JUWEJrkFtQYgrA9+kGU2eLx>j_`77nft4ATrWAR?GGkx z?quqz{j4G#y{tW}v^<)l}PI-s}7PlHXS!GxEQ0yxM$K%K!Uv^L6(*|L?a8yxxc>zX~V()PZaJlpC|Wo6+kop-`aTfvdsTqZ9L!q@;J}cRp(o9 zjwd~7;~L@!@o9qIOaxehG3tSDJ7QA_q}DQgTj%!559hZ9u9tX({%Re_QiT9dqNYMV zxRzPjV-8-LW(~EGmJdv|OH49$GTB6F zEv)0wtMYiXH5Bp9GY2zc;_9V*6ud?%wGM%Uo0} z*?VuwIG=3^RZA8Z;*R)J)v0z+BZh(eScHuK(Ln&7hNFawKF67b1v$%>+trX=sCm~cLTZ}IK2w`Vr#9JgJSf4j7yTh= zPWcFR1q$u_h<96&B2#8A@?`Bt<4XBjJQL3$%R@Y%Rsp6SU5@e?(hl~r)1zj5##%9aKX!5^UgqQ7@=ynnFw z?&R>p(QzAi=r7O(fBu&Vmd~Gprqq6M)!#e%ZGUI)rVYGA{niZ~zw67!ZrXJ?t^p%- zORM7c$K$s*?c5}iTW%KLn85S6^y3ClkcD{(gs3p1c%iVs=y@n=KB){9M~LgRNgfPC z>J6sS(I5cwe!G9XcXaa0(T9(RH*IkJsjvp~eDY`iy__|I z@)Y6=uIzoR>JtFK5NG?rQ;@i6)$N`Wia4ESdnlKk-Yn-0$}(?WT&-J#FG47Jvzhlv zD8K;6;Kd39bTV{Wna6mux@O^@jERsaS5w!?4OXiod9e~gUL2&t;5TjO5-OYmn^sfSI;yHQ z>saa%{7h04dYJ(+Yr-CCdC!*{+Qp#?FT``Tr!l9zZ&bE4$CAq|X@&Jt@`r0-O$3Tv z8i!!zlSPU4cTZki?H}y!{a@RTCd;qUR+6oZ_dcAdDwH=D9%Nn+$zBZ zh$ca$Nss{v%$#m5@-~e9p2xlLm@U$(Mw`o^aZJ)UKpsxOi>vK}gAX4McJ@y81*iM* zM^J9^*7BMGlIc$X$nLG@64^=+s~fshS=}OE(-dkKa-K2XWqfmttw_;KsMjoVX5VLM z(=xqSInv*DdtRtGC3T-98Qx~QY9NUg$gpNRO4zi`>k=-P8u7|tcC}S#YBmBaFwF(0 zcwf_-HMQ!7FE&=U+skcf1Pn+r)!r8e{_T)NN>4^HszXBqUQWPrp{wP*Opt&|j#n#_ zZynU!1DS)ptFaV!;f&!F)5_IQ-AoqYX>wvhr5v#9>Pk_A*Xh?mxFxax-36(c~D zrMGq_S%5b(S9krk?q|uNw5JqixSpq8fN_{7yz^b?Y6e+HJxiO!rfFid1!OES%7Q%C zT-c0dBF_Y;6qWGYM6*G?yI0IMjpZGPH9VSi{^@_KOZwk-6ti_BqMN4tqG4R1Bsi&q z7&KXl93pRMcRCM zo9&X}!fYUww@evQvvy5wd6%@2sDuqo#=4vpEn=xNy%+5^MRQHrOrtD670&)u+T^T@ z_U5pT-4&V|l7&udEmApVI1EwZ^+TGWG}5i)gIJZk?eN3FFSSHM4N4SQE`Pe40Se@1 zl^KRHr>RPet0*Z9aU9kgseVJ$VWO&)@#odX63tsQ7Bvd*wbF83BjpAvGO5#6RbA%X zKn4C^<9e5^NINiI=4yDeZAf_o+nl3GqC_I1(r#wSi9xp3*(*7E7pBgw8{1KS7S zPYGj&xaA<*Z%HJN3X8$4cNq%W4sO2Qb=3SFnImQ+#0#uqnF+x>CKo=~W@nPm&EpgT zcVq$&#Q_?(+C%I!rwUcO{oE`@QHf6CG4+&-#e{gR2*R_`3fr3~k)I+#;e0}kcR zS+HRN&HS`Jyd&{hrRY$*eNF1PI3D?~p*HKkGaYsYsxTN!J$w;)YjN1l3)h)2bt%4- z%w=hZp(it^%`$dc#!I14E$g5w&)o43y36HC)gsN-S=)kB7__tz3Kgv9W&X)r8B?b+ z-?Uw(r59JSt_7-ugoUEo)Ko1fhVkY_!Qdibue-ZxuNFmpW%LonYBq6AdkG2cwkpbn zY10N&77SqKd4iLMh=AObiIZ9$SG49h?R1%qw#HoNu;E%J%Qqzxozp;98IEO}n_-Zx zkLEgul-c22Z$I>p54PX$2?}j;fa^xeLH6Xt+$(7+AAK-hr@qWq;4YfCW`)&B=m_L9 z16W%6*3(4`?CH&{_*xsR+Ek&LPT`kgW^$PG24bkuD2Hree%Uy*Ki(A0_wpN+(nyeq z^6j0uBK@ZEC_zzcua+&v?iL&tcK6k5ekwAD6ULSHC4#@1CkUq6i^Dl7S~8lU%q}oT zq-qH;3$L9LJd38>Yya`y5i9F<-f3Ova9Er%8xd*0;1(Eo_1;^Rkn(5L2O$ zSWDTmMzF8)i{ifpi7K)x%d@9y$lMQ9rtPtrc#(eUceO-Sf63{4(bZTc^X-bzVvP8F zjOwYdMTB$d1w}JOL(9~rt60*FLr*dK#%v@semR8{VRY3_Q%(qg}^VD=p7q32r6%sAch8 zdt(4gJQo^n&vUFnQIph?pHPx@_Hk=*_xd~AhkLsxqOCVCR?PU7@(iw(lMaDp*7@U8 z=bJw}pFVxl87;5=m$jtEi|2}+?!36Nd$_4O_v(DS1~1HHZMA-mNf+Y4^}OA)&f>B1 z>DztX5eS8V?-De!o)uUMP$&YSNb8Oe45yOT)sf8Ri(5-40fgLy{%SbzzgqoXK2*PI z+7#Si=iUC^!STt5L%|Q;w4as<(J2H8P1tO}$kt6TJINw+i(6Hit@3E)h9e2;vAspW z^J1b7l3b|#v89%*q3PP={91`>ueD28Y$K^XGFk4vbhN`=*UEwL;;ORll{VwB(4xGi zz!1g&EDON*v|$KbUz@zl;#t+AbakaN3L!{DwpPj#v=06(k_felvEuRmHWTpMz zfGcHHVL?=LW!$(0wi(dm#^0-}>Plu+jLK(F%dD7kl70BK4gUPI%)m8`&WgI^Crg#q zX*u6)8l&mOSP&>TCV%q{cwrL!dm|3I61OcMt~S7Cza87e?)1gVO4b}$&pfY|H&x9h zGiK}L_ro;G7*ieZ8RAP%CTa2p6ymtTa2mw&qYv-)jIyX?gj|7KSZ;UF^SeY^$gye9 zsobZ}Ar@}WoK4sT^tJr7%sP_9cRI`Yn@_aUvF$5mOX$4;T?70MW2=qZ$W%0iaC4o+ zn-k^iE%1zbi=m!Aex5RkDP}PF0C&%`pnj8Y{{IW>ZA+N*XXmFyiAA`R!!Pd2*7{ zNVhB#lKj!@{n`8e`|rO8=P%E8F3%}Xf;9o6LD`jfiQQ2iZ}m`7w3r%{y4 z*DvJtFTFRp`YPWJ(7>@Wa6`?iS48KGmfS_*A32&(ZDC-r>9LoxKyoBTDO18p;2D+&^9z zICEecFeK>6^e<-W{E(8Ei|<43;%7BnL&!fSZ*?}VoRHN{$YiWE1|Y^F5KuQE*5cTElE&)p zDJf{Vik+dU2DeQ;^8`FI$5%9=7TPFnl9Ztn1JS`*6=F5;5|a6cIGUD$wj>Y6)GS2) ztu*%9)*Ul&4mfYQG(kf;VH9cfQ3x*6motR)jZ#y<$2dOAiK&Bxx}Z}FAI5QTHvI`k zFb>2{%-2l5Li)B9{Zif=%cqGvQKT<@t6Q*pq0nw;Kn+cPlC)T;r=Nh8%4&}0EJOZd zlhu?VuR>b!5L^L9&rf8u+Di6e72JR;5DyqVUzy3cSHTE@4R8ng-Ap`gL)XDj?6=0! zKZ_DKH-KV>GV5@28n#)qr-3Rw@6#`0pB6T%y?Res{CU#bXZCK=*F={$Q^vjJP3ATF zTO$)U4Lf+a-VCB8Pf*4&zcf2cypq>uGoBGm93bm%r~DdhNk8SKqz&Dx8>h9rm6J&^ zD}7T*;gwWH?K!L06b&h2V|~?BQ_4Tnzqwh+%5S)2-{)l#vdc};a!kN(z+s+fOwQL} zKRGE!tG(SmJo@l||FDAsEmMmuVy8o}KZ5oPyLS6Cso`_%>>;5bA|$a-ovwH7)24+$ z87vqxnb%{|kZ8Q26e)v3xI*Jx$@QV~gA8`x!cR6>Ng z65bJ>BxbuZ>r#&|JpQN}5mJo@nGs<$XMB+(@WUDQVSqp5BAC39If9E^@g8>xEUE^2 zWGC&d9afIs&_|rbzW+m=iC15H-QMdPRpi}=?cIG<%CQM6As*FjWR9AcRn2QOZv#P| z@bf-+-UpAk4;~A{vvXz7w0=<>uZ{d$Fz)Y;Nbk5ws|J5-gZ^ft{=xx&cf$UMME=ix z$xFlIy8ma4q6E>$y8oy9YQ4K&z5i$Z`Tn2Bc;>$Ur}J%VN8UjTV1Ak_jiM>|D}|9h z0-31X%6{v285I%-vOEV{n;;lN%D?~xP~Iy~CJ6kR-5RU!yu&C8ne+!lc!IgQqF0_n zS{Y2Gf}`)pljk}T6s-C!IlhYgB(z?o@p}1ZIc9aOxxBDqM1FfLArAn2#AaOqtpObHPgxdh_E&tPK@&FNrly?Ez%E zmBOWL`B)2Y7apM0&xfG>pUnGD)-JWC`dtJ`>i*W)bEML7uqg|8q^`ZLSv+5r@nxC3 zpBEI3FynM;3_uxR+aU?g5cM&!!s28b`=SZoRLq;=aAdDcTXF>Mt}V)5gUn=9gM4J1xY#2mXhnU>p-hk}+W|$F=hI_f9}26B2u3r}0ip z-)_!0j6+C6HC}xOv3d6vMH79Cw%DAmzVp;6Qh+;19L$@y?>}!+PHTWwfTuM?@ed<;2N3;t`K$Low?h$zCX{Be^lkru zq&!J^uLZ#0gq$IiAnL9A8~$bsfD1yygd)bgO@G5*KiTN6zwU0V|KM7*94?-eE2aHY zo$Lec@7kb!(l+$#H#Kx{T_GSAeQV?(0tY1|$WY;4ZQf_$woAj@U7tL|~<) zYL|;$=Ob>f0zYr>97Z^NUu~445xRU2c`yd;fBy05(}nlxlmF*;FWS{1SWDw>P8Dz- zPbzUObJtJ^+S@?3HDg{V7KC5M+3Jcb@)~=w#q43Pwn4kyuneDDfPH@M^f>fC^-7uz z)J4ty6i)7<3C_^}x?8Vbm-N5a>s!zFzdy>O$&X;Y1v~0WOmcG%y2Om*c+{8Zu&M^V5H2A*&o~ z4(7TsPdbC&DOoS)UHUS+o^?ZAVL%1Dn$V+r;6nocN>R%|!!mCPF#npjSD@C1`T})u z4F+2;Q5@L)+$;61-Tz~ldkZyZzAYV?vHv$WUzhAZ8{JpW`~PvC#iIu@6<+N~v1zLN z)Y45C3NfgjG?*jc!1KI1awPHAO^=!#;}v3LOuCqS+SD*g#?U{@R4E^m4krV4vyH6h|89wjKoCzZT zfRkuu;WCV@DX;_uV&q9Wh%g%;5H7QyY=@yxtQ^ z1Jjx9c*JH7tdu)!jc{Y5_!&@LW0w} ziiJXXT^%o7S1SvrHsz~XhALHEiHLk1mgI~jw>hpAe_c1G!clp@#Avb>PG-!k5-_e& ztTBaOrLh?a|NIi~Yoh;#@p~+wIN`VE2Q%$|uQp2h|HjLWt!MiG7*EMFl*xK($w8f= z@6H^e7Pr1KE1&_5nx+DdQibb4o(*)PNJt)L{hRi`$`EmPF>sdrx4zY_*#Fj_<-bRH z9%gr!G3Qwfd;qD;4xg@w0gl5odZ^X&1vQn6M-Y6Y=vQO6EA`z0-eu9_`FR3Q6a9}7 zzaaF?OGt!+>FtdGGwA=zms@4|ue;fOrvH!fl;l6XE8X!-a(X zf_YcQ3B9v8^c?KBk)0M;saoUXX@Yd?9@vjZ6fvfM?U^4){$UDnVg}k)wBKgQJxa1PDr?m8BJxvpr6ukgm@*|QweCD^YsDZ(3p%4s}*l6>?h&iD>DKc zNt(?PqnE((7@6!{YEnSvP~?Ebpszz9`iKiw$-p4x@}N8)BXEqEdYd)%I|3I_of?7X z1cw?j^1^+)0>H6+F;J_fs?W1hJu}k#RsyO3^OBOmgzu@`9Q6 z|CgI(`_Idlub=7vV?1U0pDno%7;TB&<^Vd6IF3htKqw+i9{bDO2Zx15Zhsn}d2D$+ zuIuQ)TyEYTit-c(hX`Fl%-cCYc(+V{;L+4zp|&1{+2iO^#3uQ zs{G$aK}s>7YWsmc96YBEP^^4=(*I@1^Dv6Y#UaJ#I6@<|#{w8hH$hL`b6q`lt$?#b zVva7k&VXRN6rwE@evBC$qQ3glvrfOv)rjCTg7}xuPM7VOLnaRb>uBvXLOrnjK4ttU zjklS)bx-!nax3Qq$0e&(aU8ly+q5!)m-AN{6UO%scMRy%3+-JhzC7ID&0i!2`eFXg zB&hE~eRw zL=YmG5BxXT)=mWRWcgVMT=;3?|CHQ8>9d|$`rpQ8#s0VP>Y4vP%Hufy?amI8nd1jA zs1XX}Cz$dvq4;mf2rbXQ5)qEbT@=Ev$tI}Otd<90f`2I}itV=KQR*gy>}_@eQ_xRD z2ib=a;$=ajNs4oHxU8hPWmmV$2?-4~m&GuWjH57w<&+`2wp@^2E|1J!+kXdF%aeR& z(f}juU}V*fE&gMMWw7yAiL-0h0Jhwq)PQS1wm~8lWq1o9sj%QfA-ZM#q^|k@%~#?-v91@ z{O@|EoDpCN1uL@n&o~aNHC@SL)L0oC`%3m)U9E3ov#Ev6yn)-Kx0;nVNAITRlQ0jK zT}$K8UGYbC*6+VP`E~CfJ$bW_tF#zwmYwV7rd?KH8b&f78me(@|K308@9iAz9iMFP z?CkaX4Wruh6^@-$#-`fI8#vkDt!)Da0b;D$hFe8@@B@m^&x1bA{QpjA-?C>G|KD0K z=l|b&{pvaY+oL>-=S_Pe8d}}K^-_?zdEe8Q4~DJJkxip=2&pC^b6wiByJbwPCPWL& z-#u`kZn>*Vk#>jdXb+JX?G8E79w8mtT{EFQToSaq=0AI=)Ms<;VrR}XPyFK^ zP;0b&){XB)+Q^M5g_Pd4cgQKNQAZoO39~6`g|RMrM?}?}RNq}?h^~IETQ*Gj_N>vY zR=ZeaT=M3f!!(LiVYx!(cdi^im3n!!Z1?lJKj)zTI@Nv6^-BJq&FAx9kMmgm zzZKxy(Qy9u;l8GI%zq0RXxD}Px527)jY^)+N}L_(@=WA8#-+?Zk9gjsLX^f>KKbB0Eiq5!IkcBjZH^)|L7Ywx zVSZ_A0{M8ZzALqFF#tS4B+XPI7EqX=WA$>rG2{&tkmg@xAn|VTedfq0QjQv$wWDU9 zrd%X{!W?H88%;@{n~vZ1Y2^P_%I$}X|9Q3XvRn55zTSHEeE#oIo`-Vi+B_U43A0#s zev0|FC&V*r>V&n{;ki2RoZAXzjueANqnHzhxtVfqJIaa@y zl117DYO+DvMP?Gq?p~6s8fPMf@ndE@FPUMtjblViIQhMPA5$>tdFLT8j_{(}2D-%T5ysfc4VV zsak7AO&-n&FWD$np*HHAVd>4!Tz z9ca!_2NtG*_L%3+ZU=5nJPoEMBqF2fuV~r>#T%B!gmKY;6BqRIP&7pJ*3i8`cr@lc zu-@&Kh9%ZrFXu6$lPYj$EX>TMx&7iSygYYXpaqwxw0ny`3uH?*+E0WGw?ksag&@dT zIg}>vzf#mXJ`6AWXXv89M(TUer7bh+x(&I)eCKM=s$t*UZC;md4*Q$LsBL$6F-Gyn zm_d%&5R1vr*=?ns-MQWiXgi)>z-ghsTHLM0*~M{nZXCT0ZqDL~E{B;act^Kc6OSyN zK6mlmQV}Qbt-7gi;n0?AmU1!?UyAjx)s1Z2sZ#k=B{NizKzGelH>p;oglO4HIaF_ZBuQ4pu5Fzh>Lh>zPygx07<0=`!d-1i9=vBuY5hfvI?@dwkP%2WL%4dh<5|GIR#^J2F z>0)&=t01+t!_#=19gz5l5T0kbFpr%fL*I~Es3=ohfNpg&IgSR(^c#?meW6EI-v(oH z5m&KHd>0iw`Q3qNh5hbRln^G=WvL=nK65y_7q~bkZ>?312gN~qMGd7P&qdp+(+MGm zb7EYfXc61wrwWFdik6w@o?+ayyYX%JwKPY~+|Z5%VdLDiKt}}#b_8Q4aWvHywT`xV zWkpbY-dp@)YHz-KsLLza-#a+oKiGSBvcG#`-7B4;f#@c;`N>F@PqFyFfW&1F{AcKl zXVJH#u7Z^p1%AFNdaw;;*J8iN0eI<(F>wUNeu zsdy*Lfi|GBUmhoEdx6cs+a?0SiEH$bcs@Yu|9cvw^PzsfTQe2iicB)~f_6)kr{C?5S67~)E2lk;ljlhW_D z&D(!2T_~ZbW{G50wqD(FXL~XWF{e5bd5gosg(epvZwrW#&GcchbF;ujA*_9-NklY) z90#yN5)?Bw_JRnbn140Yf=+-p6l_aiF$%^6cnExIzqr!Jif=x(!H?o|8RLWTgoNN_ zw+mcf4VhVp0!bfB0z6!8GJ8A%!~zFWKmHX>cg83oj8r6np#dem7$O%RPKuZ2IT9071?KE2yROZOG*o;aKB)1Go>o`_*P5i_R1}% zj2cv|cscDZ$BJ^%P_g^U4bW*kpYVFQ=QEKnAB8DBiH=hh`<}gEuE?u5Ce`*0UP8Tn< zxMt;Wi2JU%n&7SZ%rDjuvSab{4a3pgXE##S+M|F=QhH1ymAfs4rQuWRr=Fy(28^D|JTDab0H$i2w)?hIJ@h-<_j&?r{d-r+o3 zz^}_&mzJ&A$H0O z&-N`lQ}!GgYs*GQQ?AT;oM(jPw-V#YJ}TbRo{Rb9r;eTcr^sIx$Q&dY`ZgW0vIORN z`MKCP`LWn$ajM`X%mH__x4Yjz+1}kfDq*xUR}PEz$}6BzSFs+s46N7bSjp$w5eZ;4 zCXBbMEy6IQh_TW#)M8gXv9JelPyLrg=Xr$ZGHosc`f$77|NX z`_^5-9Y<%27zD?hC%+(G+)RsQdeC*|%A~BGS@xx@>Vj6t28&QllT8MpdSg{hW3{%b zdQ02W2LGbwy?NljfJJVO1(?@b*l57AT3gJ3mGA0VIl%3usy7JLu9;g9UX<3`f~YD{ z7?-wL$PeB`Um$1qRAEz#)Aw1jaJ@8K=kjpH+|3tnH#^qOtG1s|Ok|{G1Q{!?Zsk)k ziIl5i1*(PHt!q`C?9S_6MU9wCH&pc}Fljm0arVjA+7qtkIHx_ZL}Of5Y}Uc=S~T{W zaP+P~$u0-bt(So$9?a2%mGe(XG0m}`%*-pY(yaN{Nc&#x-cVw317Q%df+|!cNcsC> z!h(h>Zb7)z&}@i{iOi1Atv$0^G9%x0{Z(_$W!IY1dlI4^=)QjS%1L#UskxElm?8_% zo6=?VMUDSFzrg<3h!o1f(6q zsvkyPt7v->2whE&RY9rJ)zv^}{6Vb9ZW$-EY`L$Dh2g)QSsI%bRW~eoL#fUR`U|wZ z_I!1%gEaPQogS;*a&KNo(Z&fD2Wz$JWX`fLJJC`h4?tyC7mRH6?8IcCayIJQT{riD zCJCSJVrNz_^Q|lmUVZtgd++6G$p4#Aayj)vltg4YL3g+SraAxb`quhZ<^Gqg?(_Yx zkMdlVGpNZ`w>gx`+Pj;ffit!5Efe|b?!LA=y-iwOM^f1%5=A&3eUzzWWop}VEI|1d z3z9s2hbNf#zwi#l`G3haLtq_h*KP}nq0W$QgtbD3pSb=IdRKv-d}3mrd|q`yV_)= zR&M9nX`M|M!EoeG+N=wl*vXscNrr41hO;svy9&;ciPV<&m%sr+Aqr*sJdiSh(`h^* zAs%8B0y=#b>=3Jw#y?#tpx_d^p5~Xm+(e5sq2U?^o6^yuZ=Gi+Yk!{Qw zo2~z>+_A2L_n1RAYkuxrvW+$FF{iBRm_I68iiwv`i zFVAyc+1U*~=asF+)VVQqe$1?pYInxd#S$MHLOvr*w^(d}aNT0XTO_8*8hFUWh@Fx^ znU$F*PR~lN7IJtRx3VaRt&EnM5my`>n=Ma9{vhU@cyly}_I!|S`9?sP2h zbD*^w=gc!Rq->UN@;T`Gu}^wBnz*L`FMSZ_@8TzEF!}!b@4vTRJ0pf(*@AX4RA+OTbr+cXje#Gp+ebG=3qsJ%~d5^dr*oyiZRbSw(q;uv1NTN zeh99{UgsLEF5=BU+8@@t>($Yg40KI{ol7>FDHh#24_L}*M+Q}Q5Dz+Kwwpz*j3Gs# z$4GEiheH9|i@lOc|3uQybFa7M1Ti+^ZQOn>^x~i?7Br-mqit((JRt{YgGE z{r^cgxYOmov+w_3?{2*=-~YS5wfXG-e~hP&sFQFPGnytGllZ4J93d_v+ic%|BGtgo z`T78HXm0mCtX8~ZaDc$TuQfp6vF_dVa(SeVZo5`I1J6b|!tryX?elX_&use7k_V>$ z8yl}*mFfS+#&i7FqdZrROP+Fy(ATz0W$`oq_=aGydH6%I(YuF^-I~@1WRj2=#rzhL zN{`AXU=)#yLvxSU9t&V3-Tiqk@FDw!l2j`fG>uRXEWb|~KT6|mwyfTY(b^t09M^<4 z6z{asP1}0p1YRy)bxauFKitX3EM6QSenIG2@#W$EZvMi)zRbKcHjpDikX~)avjZ(I=pGK=(ewIS+_nFE6DT&Y>1%O%l-^-U==1e91Gl_*bK~lGS;>dXuI`r; z5*ijFi(w?WS79j2DMNN`xv1vjLd(!_@ab!}Sk6WN2RIIKJi09#m_`3LH(r&`|Ge(L zey0DA@jPkz|C7SIXEtze3S~O@7YexK1PaW>E6HcTcV<+*AQn0b#L)YO#cly$@%mdW z?Y|qjzV~M){nu-L7ZqRz{omYry;Y|F-L0)>`u`ZuZ2E80?Tk8Wvhhrr?~5{54&Bu( zjMQ|2YFz$8C=#nEE!|0g8;SdLQ?a(CbTe z>qy!WtIJ@2ZHl~}*>WCj4R67Y#6tbrCZP^ScoVik0e(IpGyJd_eDkz2dmhf9 zMMvs3SLC7XF|VDOD^#(0Vuc{d0&*4|`!l`xi~8{IQP7=N{)1Y_yNwt)GyZ3Nvn2nm zzkK%pKF)J%?S4T?(I}Yn3XF3c;J%&cDE8YJQOvV*G^U~+so9h>cWp3+hLr4xKg~xk zf1|-M$3Ax)1bGy>^I2>D_kQN3{}Y|A;{oXZ#%l-t-+J{-{~zPAWm@3d!4m%V;l8F{ z%zq0RXloq6@yHJdMTGeQnRL$A+hA2xUMSy7W0ky2iL2C&pvY@&^?Ty@zwJZneZPfE4< z!?TyDic= zDWPo+d`oUzNHG019Rg7n_74gCD@82>m~svs$NeBp*M}&u$dFk77sNqZ-8d3JKcKt~ zuEAjIC5nT3n{lD##%^bJs?g{b{T6O|sl5fJvDY&+U9{J5dZ{u`^FT3=R+f=rjDoW~J)BOV zbw*$WCot}?F^VEtrgz@;U->FeWS&9I1D+?#ywT~>9G5BE+0?2jNSs#y&A#chl0B^? zwzxB(&6EACA?sN+Bt%A7b4a-fQ8+;7@;XxM6pv$um5dj+%69R&_s7@%%t`+f65d_} zoJs#T%Jjdx(S7+${~zPIW&GbAIE1zWJ|X_lc9`V~!))7p;|@3emvVMm89P1T1=*hp zazTWFH(tmZ2)qQ;-S`V|JR~x`xuo4sij_PmjriZ|$>{&l-uCYMJ%1A3e;Q!f5?CTTp4qo^g7y(g-K@>USX*yt>P~?MsE(((&M=>y2+W{v4G5}>JF~B%Y1D;Z(DG^{e4v=V*fdIyaK#OuX z9C- zEmmYd=9GkKAev~kj&l$V2;q!Vxt732M`q#UDj4I@IGX0IYA|)wm>Gv04bzAr0dvvN zuUTsL47m&0+E+oKBHQ)NC47v)Td~dw49?(4v>(F}q6(i5DU#VG80LtH^~;+F>;CuO zsXH@%LL7qa!+i#{Al3R79R4Q2rE;AM@T7_4%s7@krg4a9G!+BD@sPr7qsU%ACL;<% zGddYt)@mI}fd#~bBf!T{pc|qHj0G452#LwZ>12Q?AVUFS8C1>iB#H2FYT7cGCZ;$M zOxs*q1y+WHf&t0g3#9qLAg7TWvZc#IgzdY6ez)O;Bd zMagi80}LbZ2Q99**mofb&JdL$9w!O`1T_-!22&FbiI}}f_aX135p5m)w7mleErlKe zN+QI3u+1czGqFL{g*6#)hm=gRiTwCx!|(d*f`0w@X4CKb-QwKV!08c*(5e1cpH)0v zlQ23h_I;WkaRzKm(kKK21VR)cLB}RAPGJ;HC5Dw3TkQ=wG67~zz)SzK)#?i=sxs!& zm;U7`c)NWlr9rdz^Ie)}Y)RCb9b0~CfR1b>*8vdyi-FYaQ;6c0L%p{%Yc{xHXqr0fQUr6Oz<8XziH{McfLz3R zQ-;MzG6Vi7OybX#rNZyk3}vJ!A!naJ3MYsQo+jyukU)x<5X#GC%*+*ZTCE?!x8EM) z!@C`a+&-aJu;b6j3)WpqP;GeWvV|2v0r=A=22E1R>^HI`S-X^t7I9aQcCU zh@$Wa!LT~rd+SGHDLHW?>NVIAvMFFl2!TT66f&Z~S&60$T#Rur1~EEE6pRGSDVY$S zsb>nOeXt{SdFe!8N^0%;U|UF^DAe*ISoePL0rrs(HrHMP4{Y+W6fR%#aY4^eolW2w z0+<*2SrasyW@?Tg*l~z1MPCx2r*g8+6OyO0L_a|R9%4B!q3}`w%l3#|PgNDehgz6B zJ%WDI^u8qk)3^hQLZdm=U5kAvej9C}1VK(T=pJNn_xW6dUr>w`-sfhVpjGAs!*xZodBE!J(*6oSYWAK7QB#Iv{ziWrl37M@mfMn8b3* z*O^@nF+D$Jl#7^0^Rl@OZ4Ka|j0}{HP|z+HoFdi+I0pJ428oBCXRa{imPFrI+U+%@WG*w z)s-Gm0^VU%IF-2@lqEJ)r zeri~ge*dMwQ9$v54FV1*4k3t+B>c z7m)Z|C}AX)P>bOt3slpQMI)8qkqV%OX86r95dhg!u~g@B5vWhyL7su^ab_>C}!S_ciH{+ZwWaw;)vdhPtM~}c^+%uSqJQL zk$BrmA}`=(nPM$(`4{j!7A~eq2s!F=8B#AZgP&f5kMd<6X`f@DfnxuQf#MO7QB7(} z_Xd$8W*PkxInDY~z#8 zPm=gL_dJBMgsZYfga}Av#nPvjVD)q=|IqmUj1w{7*pfwOk_eOR=7t733 z|4L)yb>(AlTAOY8bk%L)kVDQ^`gkn!S^+^`jE_9qFBuZx7{Cgc{Kr_pxgTqqUKye9 z-gp6uf2D+`6Wee19>;i+POMBu%Jt1aj07u$bSfyz1Y(sqOto-dqr1oF8k}xC674Pr z9$bUpWW<4;f@P7Q16T=D$ionHi;oqE@bKQx9EzpD16R~R(XP5c;6Y`r9yRu$LcPj? z2bHLUY@uTkqAw-jKt2!e>9s5z3kM!JvLZdH=MkZ|kdwFn#Nk$a9>~Khlg>M0hN|0F zl(aDM3);jFkAP)O$LiXp@~A+Kvc4nV9zH!?M?Vj*@{|BzcfEkhBU2};2sgDXvqk(z zRDBHFEX(@VTwOxH!k8~f;#U|`yD{$GxPW3=U$nYjRB@bBU%WGREv7dXw?wWp3hHZa zs4PVX9|*#%Z%P$(J0U{)W_T3Kyfa_U^YCPwlL*mbe4^?4IQ#U4!}9*+2D@^)51$1Bh9OoN zu{9hqGI1{3*(U(AZ!(xElrVEb_w&Q7`aFgvpz^2)ITc-UTZu9$RwNrhmnK&elv#?u zG$_(E-ew;eqCK$Q?RM9|ko}_0%&4F8`vHlM2;u7Lr#a!SaIw6T^R7RfBT8|IWL8+B z64>a{LRJ;*R_C06IsyMv1fharyZxZJsQ8AXi)-*MXDK<_B_w>Ju&RF^en;oG2A1Gi z1I4`j1C8ndo`;8Gf+)j`qnIn}h|lofs30%*@!u!|r8bs)S8Q?!Q3BeF?LO*uFr2?soeE~vuj5lXsma79^Mv}K~W}IE>Oxn z11ptW`pbQ;!6}LGIilU}*8k7m)i1YgWBdNir#R!>nN2(vW#?<}dfLu)9k=ncaXprM zdpp@q2$7J4HAV0Opk-~G8@#Ekb#ld#$*P}+mmQ!dmY?C8~Cr~S+zaR@tFirM)+X-hme zN{}Nlu1yd^)tMOAGP##`wxz65ZZvstLe<%kvsJPG{7?}vwajgaGxovDbsJ&C0gRR| zJh%DYFpZpP#14OKLj_A9R{VcMN}KITX(99)u8Dx;;^fuo;N8jpod0-nd2;b?aC~uk zewlpyA%Aht*aa;&Q8Z4aZ+O8JUlPU_@ROv@@pNkHm^@{HP|iy#h<>nPWsTBz3q`#H z$daT!xciy=!J0-IM_vaglRkbn+qkSw3rK8=s?O!c7K-RNeob<}N)F5h<9^@M2gQOb zJp;{2G1!b;S}oap$J?f@xhxnVfe2V(&i`x@QZhEQ7>`G*Aq8Mnc+bCXcuhx12$IyE3KWC%oNW}({i81W(rM`+U1-qw5{h90(N9PmYTMkH)S=xc4s|H1T&}(mHM&IO zV1`N%^Q^t-IP( zr&K6(3^HeSU)deqrzR!f#7!h`46gC8xyXZXV)18=*qX9}BbLI`*4vZMp}3`&E^E+5 zc!9eeTzi$1tFg-K`FBQR!#^M5=<2i()_>StHt=gIW`Zf&p=Q^)TX>DZjS?h`BkpNc z9Lk)enqlTp+j4tH60?Um@93uOc9XycNNX%@T9=#x>)ElDi5$bSzS*&4?Dk$Gw~l)B z5oLYIESX0y>3$u%m3#w?(AEdc|C{u&E!~$1ZN6M}N&Thk!OpSC6>@sMvj;o1o|cLo zeHz+1;~8qx))d0^wz7c4ceEQDk~WHkCA{s?)<)6QGm$Xh@v6}<8CZrC9GVa0i@b1G z6rD7_tg>h(!bX{R3BcfC7rpAVH13{PF%i8{R1_q?6l64F>5}@!G11C;AH-4Nj9m{` zt&fQu!7K7#telG5bjVoWJ}4DSujc;tEeV0cN04)p!O&IE;=2k_%<^UrBw@2?PTc8m|hx{Rr}i=uG|^df0kaTg7W&0cTz?#tV9eZ*W;3FFF*<<^`ue zEw$m3HGUg^!HI4F`(3&LtU}Q%J!=$KL$@Wq0h&yu%3deV04q^6=0#Sk{>S0Pj*a4$ zP`pQ*VZ9r*nfW2g`q#xzvl(86+r!%tcW*3w2a10Po8k4D7T$v5tv17Lj@x9T;RjzA z@3I+Q+QT=|hIoDF=-YVlk6<&rz8SqbP^OD6ior3r_F8OxylD9$w)z;qn}m0siDMdH z$p#kcsDt-a7LYveU`4czuR_rTs;YT$C5o=nc7SN|_jCp0YF@n7y8v8|<$+)v zqbKG>%0MZ$^gD{$wJm<&OtG4L@}iu}RORTD+qTYemSP6Tz*`>u<@3V(Anrg>*MxFgqC+eoIm%~b-ifAr2}N{Nf6b*D%w@8GH{Nd@g~X&Ubw5Tt&&)oZ z^!4vO*-h{6v8;EGZd~U#d2ws+@?kC72$@c3R^?PQ;st|3hIA%WF zae*16N2o)=%GuCd@vGNQ5MO$ePDnAPVbaiz#C(x-jbOcUG?qYz z;PKIxPwoXIDd~Dz3n~>CG?vd|Be~Q%*$eZit-tBP(a!@IJcFF4J{Cn*O-twji)jq< z*HvxH_@$0tOWKUL`8(_TXk!Z-i{I4p}C2`=0aZ+uyJD&wna zNJT-lJk5Cj@4UEk%x4o?{8UJym>en)WHYsQ!Wi%RlFd-t-%Y)>jO*ETYBm;YV zJ1XWgGEdsO3`tWe<-034;P2gKj(#4zJ32l-84TWifAY(_(^qIEfi1w&&h_AwFVSia zQXfI<;NXtDs}Xiw~3@G_4mW-<|$=wxI+DWrL(FgVzyj0yBqfbvmIp*XX}%r9_cRP_#R`mjo3ny? z^S;bjs{OTy&7kyj`R3%i(=)gj9Krd;>3<(xp1}7fzu=R<7I7Tg|KJZNXRlUP?Bob! z^EsG!f`&%f$V7mCMV@|XAW8EoL*fV4j$+Ww)%rb_Me_F7q^9*pBY-4`nwvp%Fzk1{K?u+EN-wnwHRWmNG zY>d98WFo;UHpLm7g>RrxY~mG#V~&S|jVXFc?bw3*4gR;H0=M#vj`VI^&tRhp!Cau&92)jM zD79|2dM~vl7pl%6d5HmfrE+25@u}DHYzSqm$|8CDo5`hVRN?ynF`uU5DbEk#^7#Ds zJ+M_IEfgzgzOvRz(CDok@^7&S-3%OWV-b2Qhup~`8$#Kt;!Z@e%$fQ|5LUdR%7n>l z2mHY5;5-yzNY#we!bLf=++)*rqN4-02}9kear>0;m|+BLUSx9JaYPr%%l+GFU2^M3 zYk=j7n=hR}y{JbfR`47sNyD4fO1d!qNv|iV(kHR6FkZNPIeh2;<0hlggRMxKyv(>*UGXCmCydS^lk-XIFihczCvwdfDt~(e- zdX|zQzpm{sF~O_`;=*zKAR=5O%Q5DwhTx54>2I`T-3Hj~y}g4Ednrd%q! zW^hq28_k!kU!)DwLL?AW7MP&2C1Dy&!K?AaFmcey1gavV!e6A@K>fO-iQnPuuQ3cL z>JP3Y3~A11*g*{@xh5>f>j~STIEvn$m;r#gTk8hBv%wNy`?an=KbPk*R*e0H>q|byM_0-kG*$0+1cwrHb zB0rJ+uvH}n56pbTW@h{&kWc*7{nFI`8orzosi^3U1+U7U9_X*(OJt|76Fs%2q_va< zjcC5_k&%9V%JQ69ApxH4@9*Ev$?X~aam;+nHxJE64P&2dS-}TJx2O8I4-!LS&Tc%YrP{_|B-?9 zABiHf!A!{n%aD{HaSfkbC~hl!~MttU$buT!eIn9WNv2M>?45CF4+HQ z<()(1`yTX%tmw;${i}DA+W%YhA|pVWZ$NJb1=VYgps@$%s{@=KrXo!z915zXrmw-9 z828P%^rzE)0NOhZn#Qbe`)sC|W&t16n+R2vQS`HBAD=l^IwJRgDZ|x7DLO4tGPNTFnzo$@W#nkd82$p6(GV#&L9NzdRx=*OOrB zGpFacI&c+;4;qGBqxZme8&Bfs2xOH`Al1`4#Z_-Y%90lPlbT<+ zNGDV(Vw2mKw8$L)7QD_>H?q{Cvw3vEUL$3TOVlK&GX%~67u*>UCK>lCKU8fDda=H{MJ zi5tUh>R&uam_w7r%4`9UG_-<=KTC$uMR8$pvbb@BH~MitGjV@KgwGAi@! z&1l#iACf=D<5v=>iH12(ubLNndeDrdpjnu}+q|JhGGek8j+%BE8Bb+DWn?LMm0;@N$v@tBn5VZDjC^4o7ch>yxLMsv>Jf47exJ+f*t!v|V; zDs3o@$94kPgJ8~QPxc%e>QOLnDBkqdcQ3j2P4kETPYtKhb-sM|=f4C$LsQ$i;)SPo zykP`r!^t=u&Uxkqmmn8hpb3;AMfx1C7YG{8Fn#2mO;|d?6-9|ERk-pov?EMOp5yEy zMSE&q(YaZ+2BB6?ges0uH|+=0hvKsMn*Ju#jQe2C5Jm19D# znFgInyMXA`k`?1aJ7sMb<%}u4)wttBL1!Rn5BXmoa`5!B2g6E1#;MuL%{xe0NJ|WF z$lox^fnKM$U}L6-H)Arbq_nwWjgtf)=5z`ZBJD=5w?MNyed!i6s|C|XyH}*h=C7Q7 z%xcB@Ov;MN{=w6OuVbUeDg`gOq!~z_SBRwsu@YL&%ICoJ)YQwqQ=dqd(UgeLLs4Td zszN^<5;*~x3RbFGGW9S*&c`e@$NQ6OD&}{oi=C81ET-_7NXtjVxgU=wy33mP#8e-F zbnB-hE#TQ=O1q)R z`lB;42d4fcA>##wtP)P>(_)rx^vNDhL4WRQd>1d^%nD)!B%c81Qom5|rf7+ydCpMf zxrI%qG-E_j6cM6FaBN%`e&AzVX`aUi&*Q&94|aFq{Kw0av&++?AK;sdlcVoX&%T4> z*GFgHoy4%a8=dNdbXKJ%wAI9*?ie=_-$RzF~anytJl^t+7 zpirj#_|Mzd-~VxlzSxA~2=Aw?@5s0Ea4(RoKj|C#)cNxHbNqLIf4}|j{?nJwzBqXP z^!c-A`%j-feg4J%!OItae)a|I-y4{5m;Fm$&D2AIO9{oivAUyAHoju(@q4fEPST6IY!mW5EJ;^JZpaH dp&|QRK9|qsbNNG*{|f*B|NoDZ8#e$B0|0d}JS+eJ diff --git a/helm/cert-manager/.helmignore b/helm/cert-manager/.helmignore deleted file mode 100644 index 8842b308..00000000 --- a/helm/cert-manager/.helmignore +++ /dev/null @@ -1,27 +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 - -BUILD.bazel -Chart.template.yaml -README.template.md -OWNERS -cert-manager*.tgz diff --git a/helm/cost-analyzer/Chart.lock b/helm/cost-analyzer/Chart.lock deleted file mode 100644 index 2630fa5d..00000000 --- a/helm/cost-analyzer/Chart.lock +++ /dev/null @@ -1,12 +0,0 @@ -dependencies: -- name: grafana - repository: file://./charts/grafana - version: 1.17.2 -- name: prometheus - repository: file://./charts/prometheus - version: 11.0.2 -- name: thanos - repository: file://./charts/thanos - version: 0.29.0 -digest: sha256:83cfc854d81baa359b3299978f9652bf7bd8dde2b3fe31693c1cb11315488dff -generated: "2023-08-24T15:09:12.249121+09:00" diff --git a/helm/cost-analyzer/Chart.yaml b/helm/cost-analyzer/Chart.yaml deleted file mode 100755 index af1fb305..00000000 --- a/helm/cost-analyzer/Chart.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: v2 -appVersion: "1.106.0-rc.4" -description: A Helm chart that sets up Kubecost, Prometheus, and Grafana to monitor - cloud costs. -name: cost-analyzer -version: "1.106.0-rc.4" -annotations: - "artifacthub.io/links": | - - name: Homepage - url: https://www.kubecost.com -dependencies: - - condition: global.grafana.enabled - name: grafana - repository: file://./charts/grafana - version: "~1.17.2" - - condition: global.prometheus.enabled - name: prometheus - repository: file://./charts/prometheus - version: "~11.0.2" - - condition: global.thanos.enabled - name: thanos - repository: file://./charts/thanos - version: "~0.29.0" diff --git a/helm/cost-analyzer/README.md b/helm/cost-analyzer/README.md deleted file mode 100644 index cc07efaf..00000000 --- a/helm/cost-analyzer/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# Kubecost helm chart -Helm chart for the Kubecost project, which is created to monitor and manage Kubernetes resource spend. Please contact team@kubecost.com or visit [kubecost.com](http://kubecost.com) for more info. - -While Helm is the [recommended install path](http://kubecost.com/install), these resources can also be deployed with the following command: - -`kubectl apply -f https://raw.githubusercontent.com/kubecost/cost-analyzer-helm-chart/master/kubecost.yaml --namespace kubecost` - -
-The following table lists the commonly used configurable parameters of the Kubecost Helm chart and their default values. - -| Parameter | Description | Default | -|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------| -| `global.prometheus.enabled` | If false, use an existing Prometheus install. [More info](http://docs.kubecost.com/custom-prom). | `true` | -| `prometheus.kube-state-metrics.disabled` | If false, deploy [kube-state-metrics](https://github.com/kubernetes/kube-state-metrics) for Kubernetes metrics | `false` | -| `prometheus.kube-state-metrics.resources` | Set kube-state-metrics resource requests and limits. | `{}` | -| `prometheus.server.persistentVolume.enabled` | If true, Prometheus server will create a Persistent Volume Claim. | `true` | -| `prometheus.server.persistentVolume.size` | Prometheus server data Persistent Volume size. Default set to retain ~6000 samples per second for 15 days. | `32Gi` | -| `prometheus.server.retention` | Determines when to remove old data. | `15d` | -| `prometheus.server.resources` | Prometheus server resource requests and limits. | `{}` | -| `prometheus.nodeExporter.resources` | Node exporter resource requests and limits. | `{}` | -| `prometheus.nodeExporter.enabled` `prometheus.serviceAccounts.nodeExporter.create` | If false, do not crate NodeExporter daemonset. | `true` | -| `prometheus.alertmanager.persistentVolume.enabled` | If true, Alertmanager will create a Persistent Volume Claim. | `true` | -| `prometheus.pushgateway.persistentVolume.enabled` | If true, Prometheus Pushgateway will create a Persistent Volume Claim. | `true` | -| `persistentVolume.enabled` | If true, Kubecost will create a Persistent Volume Claim for product config data. | `true` | -| `persistentVolume.size` | Define PVC size for cost-analyzer | `32.0Gi` | -| `persistentVolume.dbSize` | Define PVC size for cost-analyzer's flat file database | `32.0Gi` | -| `ingress.enabled` | If true, Ingress will be created | `false` | -| `ingress.annotations` | Ingress annotations | `{}` | -| `ingress.className` | Ingress class name | `{}` | -| `ingress.paths` | Ingress paths | `["/"]` | -| `ingress.hosts` | Ingress hostnames | `[cost-analyzer.local]` | -| `ingress.tls` | Ingress TLS configuration (YAML) | `[]` | -| `networkPolicy.enabled` | If true, create a NetworkPolicy to deny egress | `false` | -| `networkPolicy.costAnalyzer.enabled` | If true, create a newtork policy for cost-analzyer | `false` | -| `networkPolicy.costAnalyzer.annotations` | Annotations to be added to the network policy | `{}` | -| `networkPolicy.costAnalyzer.additionalLabels` | Additional labels to be added to the network policy | `{}` | -| `networkPolicy.costAnalyzer.ingressRules` | A list of network policy ingress rules | `null` | -| `networkPolicy.costAnalyzer.egressRules` | A list of network policy egress rules | `null` | -| `networkCosts.enabled` | If true, collect network allocation metrics [More info](http://docs.kubecost.com/network-allocation) | `false` | -| `networkCosts.podMonitor.enabled` | If true, a [PodMonitor](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#podmonitor) for the network-cost daemonset is created | `false` | -| `serviceMonitor.enabled` | Set this to `true` to create ServiceMonitor for Prometheus operator | `false` | -| `serviceMonitor.additionalLabels` | Additional labels that can be used so ServiceMonitor will be discovered by Prometheus | `{}` | -| `serviceMonitor.relabelings` | Sets Prometheus metric_relabel_configs on the scrape job | `[]` | -| `serviceMonitor.metricRelabelings` | Sets Prometheus relabel_configs on the scrape job | `[]` | -| `prometheusRule.enabled` | Set this to `true` to create PrometheusRule for Prometheus operator | `false` | -| `prometheusRule.additionalLabels` | Additional labels that can be used so PrometheusRule will be discovered by Prometheus | `{}` | -| `grafana.resources` | Grafana resource requests and limits. | `{}` | -| `grafana.sidecar.datasources.defaultDatasourceEnabled` | Set this to `false` to disable creation of Prometheus datasource in Grafana | `true` | -| `serviceAccount.create` | Set this to `false` if you want to create the service account `kubecost-cost-analyzer` on your own | `true` | -| `tolerations` | node taints to tolerate | `[]` | -| `affinity` | pod affinity | `{}` | -| `kubecostProductConfigs.productKey.mountPath` | Use instead of `kubecostProductConfigs.productKey.secretname` to declare the path at which the product key file is mounted (eg. by a secrets provisioner) | `N/A` | -| `kubecostFrontend.api.fqdn` | Customize the upstream api FQDN | `computed in terms of the service name and namespace` | -| `kubecostFrontend.model.fqdn` | Customize the upstream model FQDN | `computed in terms of the service name and namespace` | -| `clusterController.fqdn` | Customize the upstream cluster controller FQDN | `computed in terms of the service name and namespace` | -| `global.grafana.fqdn` | Customize the upstream grafana FQDN | `computed in terms of the release name and namespace` | - -## Testing -To perform local testing do next: -- install locally [kind](https://github.com/kubernetes-sigs/kind) according to documentation. -- install locally [ct](https://github.com/helm/chart-testing) according to documentation. -- create local cluster using `kind` \ -use image version from [kind docker registry](https://hub.docker.com/r/kindest/node/tags?page=1) -```shell -kind create cluster --image kindest/node: -``` -- perform ct execution -```shell -ct install --chart-dirs="." --charts="." --helm-repo-extra-args="--set=global.prometheus.enabled=false --set=global.grafana.enabled=false" -``` diff --git a/helm/cost-analyzer/attached-disks.json b/helm/cost-analyzer/attached-disks.json deleted file mode 100644 index 0badbedd..00000000 --- a/helm/cost-analyzer/attached-disks.json +++ /dev/null @@ -1,534 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 15, - "iteration": 1674508602609, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 2, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.0.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(container_fs_limit_bytes{instance=~'$disk', device!=\"tmpfs\", id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance)", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}}/{{instance}}", - "range": true, - "refId": "A" - } - ], - "title": "Disk Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 1, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 4, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.0.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(container_fs_usage_bytes{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance) / sum(container_fs_limit_bytes{instance=~'$disk',device!=\"tmpfs\", id=\"/\", cluster_id=~'$cluster'}) by (cluster_id,instance)", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}}-{{instance}}", - "range": true, - "refId": "A" - } - ], - "title": "Disk Utilization", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 1, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 5, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.0.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "1 - sum(container_fs_inodes_free{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance) / sum(container_fs_inodes_total{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}}/{{instance}}", - "range": true, - "refId": "A" - } - ], - "title": "iNode Utilization", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 3, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.0.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(container_fs_usage_bytes{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance)", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}}/{{instance}}", - "range": true, - "refId": "A" - } - ], - "title": "Disk Usage", - "type": "timeseries" - } - ], - "schemaVersion": 36, - "style": "dark", - "tags": [ - "cost", - "utilization", - "metrics" - ], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "Thanos", - "value": "Thanos" - }, - "hide": 0, - "includeAll": false, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(cluster_id)", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "cluster", - "options": [], - "query": { - "query": "label_values(cluster_id)", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(container_fs_limit_bytes{cluster_id=~\"$cluster\"}, instance)", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "disk", - "options": [], - "query": { - "query": "label_values(container_fs_limit_bytes{cluster_id=~\"$cluster\"}, instance)", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "tagValuesQuery": "", - "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": 4, - "weekStart": "" -} \ No newline at end of file diff --git a/helm/cost-analyzer/charts/grafana-1.17.2.tgz b/helm/cost-analyzer/charts/grafana-1.17.2.tgz deleted file mode 100644 index 286f6da335c46e33058fa66d37070a51cadc8e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10954 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 diff --git a/helm/cost-analyzer/charts/prometheus-11.0.2.tgz b/helm/cost-analyzer/charts/prometheus-11.0.2.tgz deleted file mode 100644 index b39bb9c70624276c226e96d65f2e86174d4547c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33716 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 diff --git a/helm/cost-analyzer/charts/thanos-0.29.0.tgz b/helm/cost-analyzer/charts/thanos-0.29.0.tgz deleted file mode 100644 index a3502af1a1adcf6c3460201960957071d2b71a18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12383 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 {{ 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": [ - "cost", - "utilization", - "metrics" - ], - "templating": { - "list": [ - { - "allValue": "()", - "current": { - "selected": false, - "tags": [], - "text": "All", - "value": "$__all" - }, - "datasource": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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 - }, - { - "current": { - "selected": true, - "text": "default-kubecost", - "value": "default-kubecost" - }, - "error": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - } - ] - }, - "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/helm/cost-analyzer/grafana-templates/README.md b/helm/cost-analyzer/grafana-templates/README.md deleted file mode 100644 index c6f34420..00000000 --- a/helm/cost-analyzer/grafana-templates/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Kubecost Grafana Dashboards - -## Overview - -Kubecost, by default, is bundled with a Grafana instance that already contains the dashboards in this repo. - -The dashboards in this repo are templated for those wanting to load the dashboards into an existing Grafana instance. - -## Caveats - -Note that the only method to get accurate costs (reconciled with cloud provider billing) is to use the Kubecost API. Prometheus contains real-time metrics that can only estimate costs using custom pricing or onDemand cloud provider rates. - -The primary purpose of the dashboards provided is to allow visibility into the metrics used by Kubecost to create the cost-model. - -The networkCosts-metrics dashboard requires the optional networkCosts daemonset to be [enabled](https://docs.kubecost.com/install-and-configure/advanced-configuration/network-costs-configuration). - -## Metrics Required - -`kubecost-container-stats` metrics: - -``` -container_cpu_usage_seconds_total -kube_pod_container_resource_requests -container_memory_working_set_bytes -container_cpu_cfs_throttled_periods_total -container_cpu_cfs_periods_total -``` - -`network-transfer-data` metrics: - -``` -kubecost_pod_network_ingress_bytes_total -kubecost_pod_network_egress_bytes_total -``` - -`disk-usage` metrics: -``` -container_fs_limit_bytes -container_fs_usage_bytes -``` - -## Additional Information - -Kubecost Grafana [Configuration Guide](https://docs.kubecost.com/install-and-configure/install/custom-grafana) \ No newline at end of file diff --git a/helm/cost-analyzer/grafana-templates/multi-cluster-container-stats.json b/helm/cost-analyzer/grafana-templates/multi-cluster-container-stats.json deleted file mode 100644 index 7467e2ed..00000000 --- a/helm/cost-analyzer/grafana-templates/multi-cluster-container-stats.json +++ /dev/null @@ -1,852 +0,0 @@ -{ - "__inputs": [ - { - "name": "DS_PROMETHEUS", - "label": "Prometheus", - "description": "", - "type": "datasource", - "pluginId": "prometheus", - "pluginName": "Prometheus" - } - ], - "__elements": {}, - "__requires": [ - { - "type": "grafana", - "id": "grafana", - "name": "Grafana", - "version": "9.5.2" - }, - { - "type": "datasource", - "id": "prometheus", - "name": "Prometheus", - "version": "1.0.0" - }, - { - "type": "panel", - "id": "table", - "name": "Table", - "version": "" - }, - { - "type": "panel", - "id": "timeseries", - "name": "Time series", - "version": "" - } - ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "description": "Visualize your kubernetes costs at the pod level.", - "editable": true, - "fiscalYearStartMonth": 0, - "gnetId": 9063, - "graphTooltip": 0, - "id": null, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "container" - }, - "properties": [ - { - "id": "displayName", - "value": "Container" - }, - { - "id": "unit", - "value": "currencyUSD" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "rgba(245, 54, 54, 0.9)", - "value": null - }, - { - "color": "rgba(50, 172, 45, 0.97)", - "value": 30 - }, - { - "color": "#c15c17", - "value": 80 - } - ] - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #memory_requests" - }, - "properties": [ - { - "id": "displayName", - "value": "Memory Request" - }, - { - "id": "unit", - "value": "bytes" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #cpu_requests" - }, - "properties": [ - { - "id": "displayName", - "value": "CPU Request" - }, - { - "id": "unit", - "value": "none" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Time" - }, - "properties": [ - { - "id": "unit", - "value": "short" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #C" - }, - "properties": [ - { - "id": "displayName", - "value": "Memory ($/hour)" - }, - { - "id": "unit", - "value": "currencyUSD" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #D" - }, - "properties": [ - { - "id": "displayName", - "value": "Spot/PE RAM" - }, - { - "id": "unit", - "value": "currencyUSD" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #E" - }, - "properties": [ - { - "id": "displayName", - "value": "Total" - }, - { - "id": "unit", - "value": "currencyUSD" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "#bf1b00", - "value": null - }, - { - "color": "rgba(50, 172, 45, 0.97)" - } - ] - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "cluster_id" - }, - "properties": [ - { - "id": "custom.width", - "value": 226 - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 0 - }, - "hideTimeOverride": true, - "id": 98, - "links": [], - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true, - "sortBy": [ - { - "desc": true, - "displayName": "Memory Request" - } - ] - }, - "pluginVersion": "9.5.2", - "repeatDirection": "v", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "sum(\n avg_over_time(kube_pod_container_resource_requests{resource=\"memory\",cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\"}[$__range])\n) by (cluster_id, namespace, container)", - "format": "table", - "instant": true, - "intervalFactor": 1, - "refId": "memory_requests" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "sum(\n avg_over_time(kube_pod_container_resource_requests{resource=\"cpu\",cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\"}[$__range])\n or up * 0 \n) by (cluster_id, namespace, container)", - "format": "table", - "hide": false, - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "cpu_requests" - } - ], - "timeFrom": "1M", - "title": "Container allocation analysis", - "transformations": [ - { - "id": "merge", - "options": { - "reducers": [] - } - } - ], - "type": "table" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "CPU usage vs requests", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "stepAfter", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 8 - }, - "id": 94, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.1.0-beta1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "avg(rate(container_cpu_usage_seconds_total{cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\",container!=\"\"}[10m])) by (cluster_id, namespace, container)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}}/{{namespace}}/{{container}} (usage)", - "metric": "container_cpu", - "refId": "usage", - "step": 10 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": true, - "expr": "avg(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\", cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\"}) by (cluster_id, namespace, container)", - "legendFormat": "{{cluster_id}}/{{namespace}}/{{ container }} (request)", - "range": true, - "refId": "requests" - } - ], - "timeFrom": "", - "title": "CPU Usage vs Requested", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Memory usage vs. requests", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "stepAfter", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 15 - }, - "id": 96, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.1.0-beta1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "avg(avg_over_time(container_memory_working_set_bytes{cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\",container!=\"\"}[5m])) by (cluster_id, namespace, container)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}}/{{namespace}}/{{ container }} (usage)", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "avg(kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\", cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\"}) by (cluster_id, namespace, container)", - "format": "time_series", - "hide": false, - "instant": false, - "intervalFactor": 1, - "legendFormat": "{{cluster_id}}/{{namespace}}/{{ container }} (requested)", - "refId": "B" - } - ], - "timeFrom": "", - "title": "RAM Usage vs Requested", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Percentage of time a pod is being throttled. Values range from 0-100", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "stepAfter", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 24, - "x": 0, - "y": 22 - }, - "id": 99, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.1.0-beta1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "100\n * sum by(cluster_id, namespace, container) (increase(container_cpu_cfs_throttled_periods_total{container!=\"\",cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\"}[5m]))\n / sum by(cluster_id, namespace, container) (increase(container_cpu_cfs_periods_total{container!=\"\",cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\"}[5m]))", - "format": "time_series", - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}}/{{namespace}}/{{ container }}", - "refId": "B" - } - ], - "timeFrom": "", - "title": "CPU throttle percent", - "type": "timeseries" - } - ], - "refresh": "", - "revision": 1, - "schemaVersion": 38, - "style": "dark", - "tags": [ - "utilization", - "metrics", - "kubecost" - ], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "includeAll": false, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "current": {}, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(kube_namespace_labels, cluster_id)", - "hide": 0, - "includeAll": true, - "label": "", - "multi": false, - "name": "cluster", - "options": [], - "query": { - "query": "label_values(kube_namespace_labels, cluster_id)", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": {}, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", - "hide": 0, - "includeAll": true, - "label": "", - "multi": false, - "name": "namespace", - "options": [], - "query": { - "query": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": {}, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(container_memory_working_set_bytes{cluster_id=~\"$cluster\",namespace=~\"$namespace\", container!=\"POD\"}, container) ", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "container", - "options": [], - "query": { - "query": "label_values(container_memory_working_set_bytes{cluster_id=~\"$cluster\",namespace=~\"$namespace\", container!=\"POD\"}, container) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - } - ] - }, - "time": { - "from": "now-7d", - "to": "now" - }, - "timepicker": { - "hidden": false, - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Kubecost - container CPU & Memory usage(multi-cluster)", - "uid": "kubecost-container-stats", - "version": 1, - "weekStart": "" -} \ No newline at end of file diff --git a/helm/cost-analyzer/grafana-templates/multi-cluster-disk-usage.json b/helm/cost-analyzer/grafana-templates/multi-cluster-disk-usage.json deleted file mode 100644 index 0c2e8000..00000000 --- a/helm/cost-analyzer/grafana-templates/multi-cluster-disk-usage.json +++ /dev/null @@ -1,568 +0,0 @@ -{ - "__inputs": [ - { - "name": "DS_PROMETHEUS", - "label": "Prometheus", - "description": "", - "type": "datasource", - "pluginId": "prometheus", - "pluginName": "Prometheus" - } - ], - "__elements": {}, - "__requires": [ - { - "type": "grafana", - "id": "grafana", - "name": "Grafana", - "version": "9.3.1" - }, - { - "type": "datasource", - "id": "prometheus", - "name": "Prometheus", - "version": "1.0.0" - }, - { - "type": "panel", - "id": "timeseries", - "name": "Time series", - "version": "" - } - ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": null, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 2, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.0.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(container_fs_limit_bytes{instance=~'$disk', device!=\"tmpfs\", id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance)", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}}/{{instance}}", - "range": true, - "refId": "A" - } - ], - "title": "Disk Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 1, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 4, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.0.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(container_fs_usage_bytes{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance) / sum(container_fs_limit_bytes{instance=~'$disk',device!=\"tmpfs\", id=\"/\", cluster_id=~'$cluster'}) by (cluster_id,instance)", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}}-{{instance}}", - "range": true, - "refId": "A" - } - ], - "title": "Disk Utilization", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 1, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 5, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.0.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "1 - sum(container_fs_inodes_free{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance) / sum(container_fs_inodes_total{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}}/{{instance}}", - "range": true, - "refId": "A" - } - ], - "title": "iNode Utilization", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 3, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.0.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(container_fs_usage_bytes{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance)", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}}/{{instance}}", - "range": true, - "refId": "A" - } - ], - "title": "Disk Usage", - "type": "timeseries" - } - ], - "schemaVersion": 37, - "style": "dark", - "tags": [ - "cost", - "utilization", - "metrics" - ], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "includeAll": false, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "current": {}, - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "definition": "label_values(cluster_id)", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "cluster", - "options": [], - "query": { - "query": "label_values(cluster_id)", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - }, - { - "current": {}, - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "definition": "label_values(container_fs_limit_bytes{cluster_id=~\"$cluster\"}, instance)", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "disk", - "options": [], - "query": { - "query": "label_values(container_fs_limit_bytes{cluster_id=~\"$cluster\"}, instance)", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "tagValuesQuery": "", - "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": 1, - "weekStart": "" -} \ No newline at end of file diff --git a/helm/cost-analyzer/grafana-templates/multi-cluster-network-transfer-data.json b/helm/cost-analyzer/grafana-templates/multi-cluster-network-transfer-data.json deleted file mode 100644 index a153b053..00000000 --- a/helm/cost-analyzer/grafana-templates/multi-cluster-network-transfer-data.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "__inputs": [ - { - "name": "DS_PROMETHEUS", - "label": "Prometheus", - "description": "", - "type": "datasource", - "pluginId": "prometheus", - "pluginName": "Prometheus" - } - ], - "__elements": {}, - "__requires": [ - { - "type": "grafana", - "id": "grafana", - "name": "Grafana", - "version": "9.3.1" - }, - { - "type": "datasource", - "id": "prometheus", - "name": "Prometheus", - "version": "1.0.0" - }, - { - "type": "panel", - "id": "timeseries", - "name": "Time series", - "version": "" - } - ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "description": "https://docs.kubecost.com/install-and-configure/advanced-configuration/network-costs-configuration", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": null, - "links": [], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 12, - "panels": [], - "title": "Network Data Transfers (negative is egress data)", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 2, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decmbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 14, - "w": 11, - "x": 0, - "y": 1 - }, - "id": 10, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum by($aggregation) (increase(kubecost_pod_network_ingress_bytes_total{namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\"}[60m])) / 1024 / 1024", - "interval": "", - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "- sum by($aggregation) (increase(kubecost_pod_network_egress_bytes_total{namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\"}[60m])) / 1024 / 1024", - "hide": false, - "legendFormat": "__auto", - "range": true, - "refId": "B" - } - ], - "title": "All Data", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decmbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 14, - "w": 13, - "x": 11, - "y": 1 - }, - "id": 2, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum by($aggregation) (increase(kubecost_pod_network_ingress_bytes_total{internet=\"true\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\"}[60m])) / 1024 / 1024", - "hide": false, - "interval": "", - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "- sum by($aggregation) (increase(kubecost_pod_network_egress_bytes_total{internet=\"true\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\"}[60m])) / 1024 / 1024", - "hide": false, - "legendFormat": "__auto", - "range": true, - "refId": "B" - } - ], - "title": "Internet Data", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Cross region and cross zone subnets must be defined via the configMap. \nSee: \n", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 2, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decmbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 14, - "w": 11, - "x": 0, - "y": 15 - }, - "id": 9, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum by($aggregation) (increase(kubecost_pod_network_ingress_bytes_total{internet=\"false\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\", sameRegion=\"false\", sameZone=\"false\"}[60m])) / 1024 / 1024", - "interval": "", - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "- sum by($aggregation) (increase(kubecost_pod_network_egress_bytes_total{internet=\"false\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\", sameRegion=\"false\", sameZone=\"false\"}[60m])) / 1024 / 1024", - "hide": false, - "legendFormat": "__auto", - "range": true, - "refId": "B" - } - ], - "title": "Cross Region Data", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Cross region and cross zone subnets must be defined via the configMap. \nSee: \n", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 2, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decmbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 14, - "w": 13, - "x": 11, - "y": 15 - }, - "id": 8, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum by($aggregation) (increase(kubecost_pod_network_ingress_bytes_total{internet=\"false\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\", sameRegion=\"true\", sameZone=\"false\"}[60m])) / 1024 / 1024", - "interval": "", - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "- sum by($aggregation) (increase(kubecost_pod_network_egress_bytes_total{internet=\"false\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\", sameRegion=\"true\", sameZone=\"false\"}[60m])) / 1024 / 1024", - "hide": false, - "legendFormat": "__auto", - "range": true, - "refId": "B" - } - ], - "title": "Cross Zone Data", - "type": "timeseries" - } - ], - "refresh": false, - "schemaVersion": 37, - "style": "dark", - "tags": [ - "kubecost" - ], - "templating": { - "list": [ - { - "current": {}, - "hide": 0, - "includeAll": false, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "current": { - "selected": true, - "text": "namespace", - "value": "namespace" - }, - "hide": 0, - "includeAll": false, - "multi": false, - "name": "aggregation", - "options": [ - { - "selected": false, - "text": "cluster_id", - "value": "cluster_id" - }, - { - "selected": true, - "text": "namespace", - "value": "namespace" - }, - { - "selected": false, - "text": "pod", - "value": "pod" - } - ], - "query": "cluster_id, namespace, pod", - "queryValue": "", - "skipUrlSync": false, - "type": "custom" - }, - { - "current": {}, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(cluster_id)", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "cluster", - "options": [], - "query": { - "query": "label_values(cluster_id)", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - }, - { - "current": { - "selected": true, - "text": "kubecost", - "value": "kubecost" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "namespace", - "options": [], - "query": { - "query": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - }, - { - "current": {}, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(kube_pod_labels{cluster_id=~\"$cluster\",namespace=~\"$namespace\"}, pod) ", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "pod", - "options": [], - "query": { - "query": "label_values(kube_pod_labels{cluster_id=~\"$cluster\",namespace=~\"$namespace\"}, pod) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "filters": [], - "hide": 0, - "name": "filter", - "skipUrlSync": false, - "type": "adhoc" - } - ] - }, - "time": { - "from": "now-7d", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Kubecost - networkCosts Metrics", - "uid": "kubecost-networkCosts-metrics", - "version": 7, - "weekStart": "" -} \ No newline at end of file diff --git a/helm/cost-analyzer/kubernetes-resource-efficiency.json b/helm/cost-analyzer/kubernetes-resource-efficiency.json deleted file mode 100644 index 156b3c29..00000000 --- a/helm/cost-analyzer/kubernetes-resource-efficiency.json +++ /dev/null @@ -1,408 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 29, - "links": [], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 2, - "panels": [], - "title": "Requests - Usage (negative values are unused reservations)", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": 3600000, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 16, - "w": 24, - "x": 0, - "y": 1 - }, - "id": 4, - "options": { - "legend": { - "calcs": [ - "lastNotNull" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum by ($aggregation) (\n (sum by (cluster_id,namespace,pod,container) (container_memory_usage_bytes{cluster_id=~\"$cluster\",namespace=~\"$namespace\",container=~\"$container\",container!=\"POD\",container!=\"\"}))\n -(sum by (cluster_id,namespace,pod,container) (kube_pod_container_resource_requests{resource=\"memory\",unit=\"byte\",cluster_id=~\"$cluster\",namespace=~\"$namespace\",container=~\"$container\",container!=\"POD\",container!=\"\"}))\n)", - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum by ($aggregation) (\n -(sum by (cluster_id,namespace,pod,container) (kube_pod_container_resource_requests{resource=\"memory\",unit=\"byte\",cluster_id=~\"$cluster\",namespace=~\"$namespace\",container=~\"$container\",container!=\"POD\",container!=\"\"}))\n)", - "hide": true, - "legendFormat": "{{$aggregation}} Request", - "range": true, - "refId": "B" - } - ], - "title": "Memory Request-Usage", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": 3600000, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 14, - "w": 24, - "x": 0, - "y": 17 - }, - "id": 6, - "options": { - "legend": { - "calcs": [ - "lastNotNull" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum by ($aggregation)(\n (sum by (cluster_id,namespace,pod,container) (rate(container_cpu_usage_seconds_total{cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\",container!=\"\"}[1h])))\n - \n (sum by (cluster_id,namespace,pod,container) (kube_pod_container_resource_requests{resource=\"cpu\",cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\",container!=\"\"}))\n)\n \n", - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "-sum by ($aggregation)(\n (sum by (cluster_id,namespace,pod,container) (kube_pod_container_resource_requests{resource=\"cpu\",cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\",container!=\"\"}))\n)", - "hide": true, - "legendFormat": "{{$aggregation}} Request", - "range": true, - "refId": "B" - } - ], - "title": "CPU Request-Usage", - "type": "timeseries" - } - ], - "schemaVersion": 37, - "style": "dark", - "tags": [ - "utilization", - "metrics", - "kubecost" - ], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "default", - "value": "default" - }, - "hide": 0, - "includeAll": false, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "current": { - "selected": true, - "text": "namespace", - "value": "namespace" - }, - "hide": 0, - "includeAll": false, - "multi": false, - "name": "aggregation", - "options": [ - { - "selected": false, - "text": "cluster_id", - "value": "cluster_id" - }, - { - "selected": true, - "text": "namespace", - "value": "namespace" - }, - { - "selected": false, - "text": "container", - "value": "container" - } - ], - "query": "cluster_id,namespace,container", - "queryValue": "", - "skipUrlSync": false, - "type": "custom" - }, - { - "current": { - "selected": true, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(kube_namespace_labels, cluster_id)", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "cluster", - "options": [], - "query": { - "query": "label_values(kube_namespace_labels, cluster_id)", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - }, - { - "current": { - "selected": true, - "text": "kubecost", - "value": "kubecost" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "namespace", - "options": [], - "query": { - "query": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(container_memory_working_set_bytes{cluster_id=~\"$cluster\",namespace=~\"$namespace\", container!=\"POD\"}, container) ", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "container", - "options": [], - "query": { - "query": "label_values(container_memory_working_set_bytes{cluster_id=~\"$cluster\",namespace=~\"$namespace\", container!=\"POD\"}, container) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Kubernetes Resource Efficiency", - "uid": "kubernetes-resource-efficiency", - "version": 1, - "weekStart": "" -} \ No newline at end of file diff --git a/helm/cost-analyzer/label-cost-utilization.json b/helm/cost-analyzer/label-cost-utilization.json deleted file mode 100644 index 4c144df1..00000000 --- a/helm/cost-analyzer/label-cost-utilization.json +++ /dev/null @@ -1,1145 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "iteration": 1645115160709, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Monthly projected CPU cost given last 10m", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 2, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "currencyUSD" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 0, - "y": 0 - }, - "hideTimeOverride": true, - "id": 15, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "P0C970EB638C812D0" - }, - "exemplar": false, - "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" - } - ], - "timeFrom": "15m", - "title": "CPU Cost", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Based on CPU usage over last 24 hours", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 2, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "currencyUSD" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 6, - "y": 0 - }, - "hideTimeOverride": true, - "id": 16, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "P0C970EB638C812D0" - }, - "exemplar": false, - "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" - } - ], - "timeFrom": "15m", - "title": "Memory Cost", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 2, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "currencyUSD" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 12, - "y": 0 - }, - "hideTimeOverride": true, - "id": 21, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "P0C970EB638C812D0" - }, - "exemplar": false, - "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" - } - ], - "timeFrom": "15m", - "title": "Storage Cost", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Cost of memory + CPU usage", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 2, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "currencyUSD" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 18, - "y": 0 - }, - "hideTimeOverride": true, - "id": 20, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "P0C970EB638C812D0" - }, - "exemplar": false, - "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" - } - ], - "timeFrom": "15m", - "title": "Total Cost", - "type": "stat" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 0, - "y": 5 - }, - "id": 10, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "targets": [ - { - "expr": "sum(\n sum (kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\"}) 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" - } - ], - "title": "CPU Request", - "type": "stat" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 2, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 3, - "y": 5 - }, - "id": 17, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "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" - } - ], - "title": "CPU Used", - "type": "stat" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 0, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 6, - "y": 5 - }, - "id": 11, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "targets": [ - { - "expr": "sum(\n sum (kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\"}) 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" - } - ], - "title": "Memory Request", - "type": "stat" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 9, - "y": 5 - }, - "id": 18, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "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" - } - ], - "title": "Memory Usage", - "type": "stat" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 0, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 5 - }, - "id": 22, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "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" - } - ], - "title": "Storage Request", - "type": "stat" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "${datasource}" - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "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", - "options": { - "alertThreshold": true - }, - "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{resource=\"cpu\", unit=\"core\"}) 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{resource=\"cpu\", unit=\"core\"}) 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": [], - "timeRegions": [], - "title": "CPU Usage vs Requests vs Limits", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "logBase": 1, - "min": "0", - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "${datasource}" - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 9 - }, - "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", - "options": { - "alertThreshold": true - }, - "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{resource=\"memory\", unit=\"byte\"}) 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{resource=\"memory\", unit=\"byte\"}) 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": [], - "timeRegions": [], - "title": "Memory Usage vs Requests vs Limits", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "logBase": 1, - "min": "0", - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - } - ], - "refresh": false, - "schemaVersion": 34, - "style": "dark", - "tags": [ - "cost", - "utilization", - "metrics" - ], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "filters": [], - "hide": 0, - "label": "", - "name": "Filters", - "skipUrlSync": false, - "type": "adhoc" - }, - { - "current": { - "tags": [], - "text": "app", - "value": "app" - }, - "hide": 0, - "includeAll": false, - "label": "Label", - "multi": false, - "name": "label", - "options": [ - { - "selected": true, - "text": "app", - "value": "app" - }, - { - "selected": false, - "text": "tier", - "value": "tier" - }, - { - "selected": false, - "text": "component", - "value": "component" - }, - { - "selected": false, - "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": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "Value", - "multi": false, - "name": "label_value", - "options": [], - "query": { - "query": "query_result(SUM(kube_pod_labels{label_$label!=\"\",namespace!=\"kube-system\"}) by (label_$label))", - "refId": "default-kubecost-label_value-Variable-Query" - }, - "refresh": 1, - "regex": "/label_$label=\\\"(.*?)(\\\")/", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": "()", - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "", - "multi": false, - "name": "Deployments", - "options": [], - "query": { - "query": "label_values(deployment)", - "refId": "default-kubecost-Deployments-Variable-Query" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "Secondary", - "options": [], - "query": { - "query": "query_result(kube_pod_labels)", - "refId": "default-kubecost-Secondary-Variable-Query" - }, - "refresh": 1, - "regex": "/.+?label_([^=]*).*/", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": { - "selected": false, - "text": "default-kubecost", - "value": "default-kubecost" - }, - "hide": 0, - "includeAll": false, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - } - ] - }, - "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": 1, - "weekStart": "" -} \ No newline at end of file diff --git a/helm/cost-analyzer/namespace-utilization.json b/helm/cost-analyzer/namespace-utilization.json deleted file mode 100644 index a2e60c1f..00000000 --- a/helm/cost-analyzer/namespace-utilization.json +++ /dev/null @@ -1,1175 +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":"${datasource}", - "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":"${datasource}", - "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":"${datasource}", - "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{resource=\"cpu\", unit=\"core\", 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":"${datasource}", - "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":"${datasource}", - "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":"${datasource}", - "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":"${datasource}", - "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":"${datasource}", - "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":"${datasource}", - "filters":[ - - ], - "hide":0, - "label":"", - "name":"Filters", - "skipUrlSync":false, - "type":"adhoc" - }, - { - "current": { - "selected": true, - "text": "default-kubecost", - "value": "default-kubecost" - }, - "error": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - } - ] - }, - "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/helm/cost-analyzer/networkCosts-metrics.json b/helm/cost-analyzer/networkCosts-metrics.json deleted file mode 100644 index e09239b0..00000000 --- a/helm/cost-analyzer/networkCosts-metrics.json +++ /dev/null @@ -1,639 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "description": "https://docs.kubecost.com/install-and-configure/advanced-configuration/network-costs-configuration", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 24, - "links": [], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 12, - "panels": [], - "title": "Network Data Transfers (negative is egress data)", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "bars", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 14, - "w": 11, - "x": 0, - "y": 1 - }, - "id": 10, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(increase(kubecost_pod_network_ingress_bytes_total\n {namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\"}\n [1h]\n ))\nby($aggregation) ", - "interval": "1h", - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "-sum(increase(kubecost_pod_network_egress_bytes_total\n {namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\"}\n [1h]\n ))\nby($aggregation) ", - "hide": false, - "interval": "1h", - "legendFormat": "__auto", - "range": true, - "refId": "B" - } - ], - "title": "All Data", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "bars", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 14, - "w": 13, - "x": 11, - "y": 1 - }, - "id": 2, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(increase(kubecost_pod_network_ingress_bytes_total\n {internet=\"true\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\"}\n [1h]\n))\nby($aggregation) ", - "hide": false, - "interval": "1h", - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "- sum(increase(kubecost_pod_network_egress_bytes_total\n {internet=\"true\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\"}\n [1h]))\nby($aggregation) ", - "hide": false, - "interval": "1h", - "legendFormat": "__auto", - "range": true, - "refId": "B" - } - ], - "title": "Internet Data", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Cross region and cross zone subnets must be defined via the configMap. \nSee: \n", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "bars", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 2, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 14, - "w": 11, - "x": 0, - "y": 15 - }, - "id": 9, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(increase(kubecost_pod_network_ingress_bytes_total\n {internet=\"false\",namespace=~\"$namespace\",cluster_id=~\"$cluster\",pod_name=~\"$pod\", sameRegion=\"false\",sameZone=\"false\"}\n [1h]))\nby($aggregation)", - "interval": "1h", - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "- sum(increase(kubecost_pod_network_egress_bytes_total\n {internet=\"false\", namespace=~\"$namespace\",cluster_id=~\"$cluster\",pod_name=~\"$pod\",sameRegion=\"false\", sameZone=\"false\"}\n [1h]))\nby($aggregation) ", - "hide": false, - "interval": "1h", - "legendFormat": "__auto", - "range": true, - "refId": "B" - } - ], - "title": "Cross Region Data", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Cross region and cross zone subnets must be defined via the configMap. \nSee: \n", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "bars", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 2, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 14, - "w": 13, - "x": 11, - "y": 15 - }, - "id": 8, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(increase(kubecost_pod_network_ingress_bytes_total\n {internet=\"false\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\", sameRegion=\"true\", sameZone=\"false\"}\n [1h]))\nby($aggregation)", - "interval": "1h", - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "- sum(increase(kubecost_pod_network_egress_bytes_total\n {internet=\"false\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod\", sameRegion=\"true\", sameZone=\"false\"}\n [1h]))\nby($aggregation)", - "hide": false, - "interval": "1h", - "legendFormat": "__auto", - "range": true, - "refId": "B" - } - ], - "title": "Cross Zone Data", - "type": "timeseries" - } - ], - "refresh": "", - "revision": 1, - "schemaVersion": 38, - "style": "dark", - "tags": [ - "kubecost" - ], - "templating": { - "list": [ - { - "current": { - "selected": true, - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "includeAll": false, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "current": { - "selected": true, - "text": "pod", - "value": "pod" - }, - "hide": 0, - "includeAll": false, - "multi": false, - "name": "aggregation", - "options": [ - { - "selected": false, - "text": "cluster_id", - "value": "cluster_id" - }, - { - "selected": false, - "text": "namespace", - "value": "namespace" - }, - { - "selected": true, - "text": "pod", - "value": "pod" - } - ], - "query": "cluster_id, namespace, pod", - "queryValue": "", - "skipUrlSync": false, - "type": "custom" - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(cluster_id)", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "cluster", - "options": [], - "query": { - "query": "label_values(cluster_id)", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "kubecost", - "value": "kubecost" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "namespace", - "options": [], - "query": { - "query": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(kube_pod_labels{cluster_id=~\"$cluster\",namespace=~\"$namespace\"}, pod) ", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "pod", - "options": [], - "query": { - "query": "label_values(kube_pod_labels{cluster_id=~\"$cluster\",namespace=~\"$namespace\"}, pod) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "filters": [], - "hide": 0, - "name": "filter", - "skipUrlSync": false, - "type": "adhoc" - } - ] - }, - "time": { - "from": "now-7d", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Kubecost networkCosts Metrics", - "uid": "kubecost-networkCosts-metrics", - "version": 8, - "weekStart": "" -} \ No newline at end of file diff --git a/helm/cost-analyzer/node-utilization.json b/helm/cost-analyzer/node-utilization.json deleted file mode 100644 index dc03cc07..00000000 --- a/helm/cost-analyzer/node-utilization.json +++ /dev/null @@ -1,1389 +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":"${datasource}", - "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":"${datasource}", - "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{resource=\"memory\", unit=\"byte\", 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":"${datasource}", - "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":"${datasource}", - "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{resource=\"cpu\", unit=\"core\", 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{resource=\"memory\", unit=\"byte\", 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":"${datasource}", - "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{resource=\"cpu\", unit=\"core\", 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":"${datasource}", - "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":"${datasource}", - "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{resource=\"cpu\", unit=\"core\", 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":"${datasource}", - "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{resource=\"memory\", unit=\"byte\", 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":"${datasource}", - "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":"${datasource}", - "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{resource=\"memory\", unit=\"byte\", 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":"${datasource}", - "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":"${datasource}", - "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":"${datasource}", - "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 - }, - { - "current": { - "selected": true, - "text": "default-kubecost", - "value": "default-kubecost" - }, - "error": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - } - ] - }, - "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/helm/cost-analyzer/pod-utilization-multi-cluster.json b/helm/cost-analyzer/pod-utilization-multi-cluster.json deleted file mode 100644 index 135efa47..00000000 --- a/helm/cost-analyzer/pod-utilization-multi-cluster.json +++ /dev/null @@ -1,777 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "description": "", - "editable": true, - "fiscalYearStartMonth": 0, - "gnetId": 9063, - "graphTooltip": 0, - "id": 13, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Maximum CPU Core Usage vs avg Requested", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": 3600000, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 94, - "links": [], - "options": { - "legend": { - "calcs": [ - "max" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.4.7", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "max(irate(container_cpu_usage_seconds_total\r\n {cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\", container=~\"$container\", container!=\"POD\",container!=\"\"}\r\n [$__rate_interval])) \r\n by (cluster_id, namespace, pod, container)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}/{{container}} (usage max)", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": true, - "expr": "avg(kube_pod_container_resource_requests\r\n {cluster_id=\"$cluster\",resource=\"cpu\",unit=\"core\",namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\",container!=\"POD\"}\r\n ) \r\nby (cluster_id,namespace,pod,container)", - "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}/{{container}} (requested)", - "range": true, - "refId": "B" - } - ], - "timeFrom": "", - "title": "CPU Core Usage vs Requested", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Max memory used vs avg requested", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": 3600000, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 96, - "links": [], - "options": { - "legend": { - "calcs": [ - "max" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "asc" - } - }, - "pluginVersion": "9.4.7", - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "max(max_over_time(container_memory_working_set_bytes\r\n {namespace=~\"$namespace\",pod=~\"$pod\",cluster_id=\"$cluster\",container=~\"$container\",container!=\"POD\",container!=\"\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}/{{container}} (usage max)", - "metric": "container_cpu", - "refId": "MEMORY_USAGE", - "step": 10 - }, - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "avg(kube_pod_container_resource_requests\n {resource=\"memory\",unit=\"byte\",cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\", container=~\"$container\",container!=\"POD\"}\n )\nby (cluster_id,namespace,pod,container)", - "format": "time_series", - "hide": false, - "instant": false, - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}/{{container}} (requested)", - "refId": "MEMORY_REQUESTED" - } - ], - "timeFrom": "", - "title": "Memory Usage vs Requested", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Network traffic by pod", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": 3600000, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 7 - }, - "id": 95, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.4.7", - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(container_network_receive_bytes_total\n {cluster_id=~\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\"}\n [$__rate_interval])) \nby (cluster_id, namespace, pod)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}<- in", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "- sum(irate(container_network_transmit_bytes_total\n {cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\"}\n [$__rate_interval])) \nby (cluster_id, namespace, pod)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}-> out", - "refId": "B" - } - ], - "timeFrom": "", - "title": "Network IO", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Disk read writes", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": 3600000, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 7 - }, - "id": 97, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.4.7", - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(container_fs_writes_bytes_total\r\n {cluster_id=\"$cluster\",namespace=~\"$namespace\",container!=\"POD\",pod!=\"\",pod=~\"$pod\",container=~\"$container\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{pod}}/{{container}}<- write", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "- sum(irate(container_fs_reads_bytes_total\r\n {cluster_id=\"$cluster\",namespace=~\"$namespace\",container!=\"POD\",pod!=\"\",pod=~\"$pod\",container=~\"$container\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{pod}}/{{container}}-> read", - "refId": "B" - } - ], - "timeFrom": "", - "title": "Disk IO", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "This graph shows the % of periods where a pod is being throttled. Values range from 0-100", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": 1800000, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 14 - }, - "id": 99, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.4.7", - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "100\n * sum by(cluster_id, namespace, pod, container) (increase(container_cpu_cfs_throttled_periods_total{container!=\"\",cluster_id=\"$cluster\", namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\", container!=\"POD\"}[$__rate_interval]))\n / sum by(cluster_id,namespace,pod,container) (increase(container_cpu_cfs_periods_total{container!=\"\",cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\",container!=\"POD\"}[$__rate_interval]))", - "format": "time_series", - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "B" - } - ], - "timeFrom": "", - "title": "CPU throttle percent", - "type": "timeseries" - } - ], - "refresh": "", - "revision": 1, - "schemaVersion": 38, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "Thanos", - "value": "Thanos" - }, - "hide": 0, - "includeAll": false, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(cluster_id)", - "hide": 0, - "includeAll": false, - "multi": false, - "name": "cluster", - "options": [], - "query": { - "query": "label_values(cluster_id)", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - }, - { - "current": { - "selected": false - }, - "datasource": { - "uid": "${datasource}" - }, - "definition": "label_values(kube_namespace_labels{cluster_id=\"$cluster\"}, namespace) ", - "hide": 0, - "includeAll": true, - "label": "", - "multi": false, - "name": "namespace", - "options": [], - "query": { - "query": "label_values(kube_namespace_labels{cluster_id=\"$cluster\"}, namespace) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "uid": "${datasource}" - }, - "definition": "label_values(kube_pod_labels{cluster_id=\"$cluster\",namespace=~\"$namespace\"}, pod) ", - "hide": 0, - "includeAll": true, - "label": "pod", - "multi": false, - "name": "pod", - "options": [], - "query": { - "query": "label_values(kube_pod_labels{cluster_id=\"$cluster\",namespace=~\"$namespace\"}, pod) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(container_memory_working_set_bytes{cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\", container!=\"POD\"}, container) ", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "container", - "options": [], - "query": { - "query": "label_values(container_memory_working_set_bytes{cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\", container!=\"POD\"}, container) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - } - ] - }, - "time": { - "from": "now-2d", - "to": "now" - }, - "timepicker": { - "hidden": false, - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Pod utilization metrics (multi-cluster)", - "uid": "at-cost-analysis-pod2", - "version": 2, - "weekStart": "" -} diff --git a/helm/cost-analyzer/pod-utilization.json b/helm/cost-analyzer/pod-utilization.json deleted file mode 100644 index 2b11a01d..00000000 --- a/helm/cost-analyzer/pod-utilization.json +++ /dev/null @@ -1,757 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "description": "", - "editable": true, - "fiscalYearStartMonth": 0, - "gnetId": 9063, - "graphTooltip": 0, - "id": 11, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Maximum CPU Core Usage vs Requested", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": 3600000, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 94, - "links": [], - "options": { - "legend": { - "calcs": [ - "max" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.4.7", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "max(irate(\r\n container_cpu_usage_seconds_total\r\n {namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\",container!=\"POD\",container!=\"\"}\r\n [$__rate_interval])) \r\n by (cluster_id, namespace, pod, container)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{pod}}/{{container}} (usage max)", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": true, - "expr": "avg(kube_pod_container_resource_requests\r\n {resource=\"cpu\",unit=\"core\",namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\",container!=\"POD\"}\r\n ) \r\nby (cluster_id, namespace, pod, container)", - "legendFormat": "{{cluster_id}} {{pod}}/{{container}} (avg requested)", - "range": true, - "refId": "B" - } - ], - "timeFrom": "", - "title": "CPU Core Usage vs Requested", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Max Memory usage vs avg requested", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": 3600000, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 96, - "links": [], - "options": { - "legend": { - "calcs": [ - "max" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "asc" - } - }, - "pluginVersion": "9.4.7", - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "max(max_over_time(\r\n container_memory_working_set_bytes\r\n {namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\",container!=\"POD\",container!=\"\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{pod}}/{{container}} (usage max)", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "avg(\n kube_pod_container_resource_requests\n {resource=\"memory\",unit=\"byte\",namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\", container!=\"POD\"}\n )\nby (cluster_id,namespace,pod,container)", - "format": "time_series", - "hide": false, - "instant": false, - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{pod}}/{{container}} (avg requested)", - "refId": "B" - } - ], - "timeFrom": "", - "title": "Memory Usage vs Requested", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Network traffic by pod", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": 3600000, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 7 - }, - "id": 95, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.4.7", - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(container_network_receive_bytes_total\n {namespace=~\"$namespace\",pod=~\"$pod\"}\n [$__rate_interval])) \nby (cluster_id, namespace, pod)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}<- in", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "- sum(irate(container_network_transmit_bytes_total\n {namespace=~\"$namespace\",pod=~\"$pod\"}\n [$__rate_interval])) \nby (cluster_id, namespace, pod)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}-> out", - "refId": "B" - } - ], - "timeFrom": "", - "title": "Network IO", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Disk read writes", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": 3600000, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 7 - }, - "id": 97, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.4.7", - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(container_fs_writes_bytes_total\r\n {container!=\"POD\",pod!=\"\",pod=~\"$pod\",container=~\"$container\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{pod}}/{{container}}<- write", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "- sum(irate(container_fs_reads_bytes_total\r\n {container!=\"POD\",pod!=\"\",pod=~\"$pod\",container=~\"$container\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{cluster_id}} {{pod}}/{{container}}-> read", - "refId": "B" - } - ], - "timeFrom": "", - "title": "Disk IO", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "This graph shows the % of periods where a pod is being throttled. Values range from 0-100", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": 1800000, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 14 - }, - "id": 99, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.4.7", - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "100\n * sum by(cluster_id, namespace, pod, container) (increase(container_cpu_cfs_throttled_periods_total{container!=\"\", namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\", container!=\"POD\"}[$__rate_interval]))\n / sum by(cluster_id, namespace, pod, container) (increase(container_cpu_cfs_periods_total{container!=\"\", namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\", container!=\"POD\"}[$__rate_interval]))", - "format": "time_series", - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "__auto", - "refId": "B" - } - ], - "timeFrom": "", - "title": "CPU throttle percent", - "type": "timeseries" - } - ], - "refresh": "", - "revision": 1, - "schemaVersion": 38, - "style": "dark", - "tags": [ - "cost", - "utilization", - "metrics" - ], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "includeAll": false, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "uid": "${datasource}" - }, - "definition": "label_values(kube_namespace_labels, namespace) ", - "hide": 0, - "includeAll": true, - "label": "", - "multi": false, - "name": "namespace", - "options": [], - "query": { - "query": "label_values(kube_namespace_labels, namespace) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "uid": "${datasource}" - }, - "definition": "label_values(kube_pod_labels{namespace=~\"$namespace\"}, pod) ", - "hide": 0, - "includeAll": true, - "label": "pod", - "multi": false, - "name": "pod", - "options": [], - "query": { - "query": "label_values(kube_pod_labels{namespace=~\"$namespace\"}, pod) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(container_memory_working_set_bytes{namespace=~\"$namespace\",pod=~\"$pod\", container!=\"POD\"}, container) ", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "container", - "options": [], - "query": { - "query": "label_values(container_memory_working_set_bytes{namespace=~\"$namespace\",pod=~\"$pod\", container!=\"POD\"}, container) ", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - } - ] - }, - "time": { - "from": "now-2d", - "to": "now" - }, - "timepicker": { - "hidden": false, - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Pod utilization metrics", - "uid": "at-cost-analysis-pod", - "version": 2, - "weekStart": "" -} \ No newline at end of file diff --git a/helm/cost-analyzer/prom-benchmark.json b/helm/cost-analyzer/prom-benchmark.json deleted file mode 100644 index 0c5eae7e..00000000 --- a/helm/cost-analyzer/prom-benchmark.json +++ /dev/null @@ -1,5689 +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": "${datasource}", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 49, - "panels": [], - "title": "Basics", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 75 - }, - "id": 99, - "panels": [], - "title": "Scraping", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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": "${datasource}", - "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 - }, - { - "current": { - "selected": true, - "text": "default-kubecost", - "value": "default-kubecost" - }, - "error": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - } - ] - }, - "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/helm/cost-analyzer/scripts/create-admission-controller-tls.sh b/helm/cost-analyzer/scripts/create-admission-controller-tls.sh deleted file mode 100755 index 8f0d1c32..00000000 --- a/helm/cost-analyzer/scripts/create-admission-controller-tls.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -namespace=$1 -if [ "$namespace" == "" ]; then - namespace=kubecost -fi - -DIRECTORY=$(cd `dirname $0` && pwd) - -echo "Creating certificates" -mkdir certs -openssl genrsa -out certs/tls.key 2048 -openssl req -new -key certs/tls.key -out certs/tls.csr -subj "/CN=webhook-server.$namespace.svc" -openssl x509 -req -days 500 -extfile <(printf "subjectAltName=DNS:webhook-server.$namespace.svc") -in certs/tls.csr -signkey certs/tls.key -out certs/tls.crt - -echo "Creating Webhook Server TLS Secret" -kubectl create secret tls webhook-server-tls \ - --cert "certs/tls.crt" \ - --key "certs/tls.key" -n $namespace - - -echo "Updating values.yaml" -ENCODED_CA=$(cat certs/tls.crt | base64 | tr -d '\n') -sed -i 's@${CA_BUNDLE}@'"$ENCODED_CA"'@g' ../values.yaml diff --git a/helm/cost-analyzer/templates/NOTES.txt b/helm/cost-analyzer/templates/NOTES.txt deleted file mode 100644 index 3958f66d..00000000 --- a/helm/cost-analyzer/templates/NOTES.txt +++ /dev/null @@ -1,41 +0,0 @@ - - --------------------------------------------------- -{{- $node := (lookup "v1" "Node" "" "") }} -{{- $isEKS := (regexMatch ".*eks.*" (.Capabilities.KubeVersion | quote) )}} -{{- $isGT22 := (semverCompare ">=1.23-0" .Capabilities.KubeVersion.GitVersion) }} -{{- $PVNotExists := (empty (lookup "v1" "PersistentVolume" "" "")) }} -{{- $EBSCSINotExists := (empty (lookup "apps/v1" "Deployment" "kube-system" "ebs-csi-controller")) }} - -{{- $servicePort := .Values.service.port | default 9090 -}} -Kubecost has been successfully installed. - -{{ if (and $isEKS $isGT22) -}} - -WARNING: ON EKS v1.23+ INSTALLATION OF EBS-CSI DRIVER IS REQUIRED TO MANAGE PERSISTENT VOLUMES. LEARN MORE HERE: https://docs.kubecost.com/install-and-configure/install/provider-installations/aws-eks-cost-monitoring#prerequisites - -{{ if (and $EBSCSINotExists $PVNotExists) -}} - -ERROR: MISSING EBS-CSI DRIVER WHICH IS REQUIRED ON EKS v1.23+ TO MANAGE PERSISTENT VOLUMES. LEARN MORE HERE: https://docs.kubecost.com/install-and-configure/install/provider-installations/aws-eks-cost-monitoring#prerequisites - -{{ else if (and $EBSCSINotExists (not $PVNotExists)) -}} - -ERROR: MISSING EBS-CSI DRIVER WHICH IS REQUIRED ON EKS v1.23+ TO MANAGE PERSISTENT VOLUMES. LEARN MORE HERE: https://docs.kubecost.com/install-and-configure/install/provider-installations/aws-eks-cost-monitoring#prerequisites - -{{ end -}} -{{ end -}} - - -Please allow 5-10 minutes for Kubecost to gather metrics. - -If you have configured cloud-integrations, it can take up to 48 hours for cost reconciliation to occur. - -When using Durable storage (Enterprise Edition), please allow up to 4 hours for data to be collected and the UI to be healthy. - -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. - -Having installation issues? View our Troubleshooting Guide at http://docs.kubecost.com/troubleshoot-install diff --git a/helm/cost-analyzer/templates/_helpers.tpl b/helm/cost-analyzer/templates/_helpers.tpl deleted file mode 100755 index bd24f670..00000000 --- a/helm/cost-analyzer/templates/_helpers.tpl +++ /dev/null @@ -1,310 +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 -}} -{{- define "query-service.name" -}} -{{- default "query-service" | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- define "federator.name" -}} -{{- default "federator" | 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 -}} - -{{- define "query-service.fullname" -}} -{{- if .Values.queryServiceFullnameOverride -}} -{{- .Values.queryServiceFullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name "query-service" | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} - -{{- define "federator.fullname" -}} -{{- printf "%s-%s" .Release.Name "federator" | trunc 63 | trimSuffix "-" -}} -{{- 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 -}} - -{{- define "query-service.serviceName" -}} -{{- printf "%s-%s" .Release.Name "query-service-load-balancer" | 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 -}} - -{{- define "kubecost.kubeMetricsName" -}} -{{- if .Values.agent }} -{{- printf "%s-%s" .Release.Name "agent" -}} -{{- else if .Values.cloudAgent }} -{{- printf "%s-%s" .Release.Name "cloud-agent" -}} -{{- else }} -{{- printf "%s-%s" .Release.Name "metrics" -}} -{{- end }} -{{- end -}} - -{{/* -Create the chart labels. -*/}} -{{- define "kubecost.chartLabels" -}} -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 }} -{{- end -}} -{{- define "kubecost.queryService.chartLabels" -}} -app.kubernetes.io/name: {{ include "query-service.name" . }} -helm.sh/chart: {{ include "cost-analyzer.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} -{{- define "kubecost.federator.chartLabels" -}} -app.kubernetes.io/name: {{ include "federator.name" . }} -helm.sh/chart: {{ include "cost-analyzer.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- 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 -}} -{{- define "query-service.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "query-service.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 -}} -{{- define "query-service.commonLabels" -}} -{{ include "kubecost.queryService.chartLabels" . }} -app: query-service -{{- end -}} -{{- define "federator.commonLabels" -}} -{{ include "kubecost.federator.chartLabels" . }} -app: federator -{{- 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 -}} -{{- define "query-service.selectorLabels" -}} -app.kubernetes.io/name: {{ include "query-service.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app: query-service -{{- end -}} -{{- define "federator.selectorLabels" -}} -app.kubernetes.io/name: {{ include "federator.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app: federator -{{- 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 -}} - -{{/* -This template runs the full check for leader/follower requirements in order to determine -whether it should be configured. This template will return true if it's enabled and all -requirements are met. -*/}} -{{- define "cost-analyzer.leaderFollowerEnabled" }} - {{- if .Values.kubecostDeployment }} - {{- if .Values.kubecostDeployment.leaderFollower }} - {{- if .Values.kubecostDeployment.leaderFollower.enabled }} - {{- $replicas := .Values.kubecostDeployment.replicas | default 1 }} - {{- if not .Values.kubecostModel.etlFileStoreEnabled }} - {{- "" }} - {{- else if (eq (quote .Values.kubecostModel.etlBucketConfigSecret) "") }} - {{- "" }} - {{- else if not (gt (int $replicas) 1) }} - {{- ""}} - {{- else }} - {{- "true" }} - {{- end }} - {{- else }} - {{- "" }} - {{- end }} - {{- else }} - {{- "" }} - {{- end }} - {{- else }} - {{- "" }} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/alibaba-service-key-secret.yaml b/helm/cost-analyzer/templates/alibaba-service-key-secret.yaml deleted file mode 100644 index bffb7d8f..00000000 --- a/helm/cost-analyzer/templates/alibaba-service-key-secret.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.createServiceKeySecret }} -{{- if .Values.kubecostProductConfigs.alibabaServiceKeyName }} -apiVersion: v1 -kind: Secret -metadata: - name: cloud-service-key - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -type: Opaque -stringData: - service-key.json: |- - { - "alibaba_access_key_id": "{{ .Values.kubecostProductConfigs.alibabaServiceKeyName }}", - "alibaba_secret_access_key": "{{ .Values.kubecostProductConfigs.alibabaServiceKeyPassword }}" - } -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/aws-service-key-secret.yaml b/helm/cost-analyzer/templates/aws-service-key-secret.yaml deleted file mode 100644 index eeecc03f..00000000 --- a/helm/cost-analyzer/templates/aws-service-key-secret.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.createServiceKeySecret }} -{{- if .Values.kubecostProductConfigs.awsServiceKeyName }} -apiVersion: v1 -kind: Secret -metadata: - name: cloud-service-key - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -type: Opaque -stringData: - service-key.json: |- - { - "aws_access_key_id": "{{ .Values.kubecostProductConfigs.awsServiceKeyName }}", - "aws_secret_access_key": "{{ .Values.kubecostProductConfigs.awsServiceKeyPassword }}" - } -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/awsstore-deployment-template.yaml b/helm/cost-analyzer/templates/awsstore-deployment-template.yaml deleted file mode 100644 index 8c02d88b..00000000 --- a/helm/cost-analyzer/templates/awsstore-deployment-template.yaml +++ /dev/null @@ -1,35 +0,0 @@ -{{- if .Values.awsstore }} -{{- if .Values.awsstore.useAwsStore }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "cost-analyzer.fullname" . }}-awsstore - namespace: {{ .Release.Namespace }} - 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 - {{- if .Values.awsstore.priorityClassName }} - priorityClassName: "{{ .Values.awsstore.priorityClassName }}" - {{- end }} - containers: - - image: {{ .Values.awsstore.imageNameAndVersion }} - name: awsstore - # Just sleep forever - command: [ "sleep" ] - args: [ "infinity" ] -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/awsstore-service-account-template.yaml b/helm/cost-analyzer/templates/awsstore-service-account-template.yaml deleted file mode 100644 index 0dadeaac..00000000 --- a/helm/cost-analyzer/templates/awsstore-service-account-template.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.awsstore }} -{{- if .Values.awsstore.createServiceAccount }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: awsstore-serviceaccount - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -{{- with .Values.awsstore.annotations }} - annotations: - {{- toYaml . | nindent 4 }} -{{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/azure-service-key-secret.yaml b/helm/cost-analyzer/templates/azure-service-key-secret.yaml deleted file mode 100644 index e61b61e8..00000000 --- a/helm/cost-analyzer/templates/azure-service-key-secret.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.createServiceKeySecret }} -{{- if .Values.kubecostProductConfigs.azureSubscriptionID }} -apiVersion: v1 -kind: Secret -metadata: - name: cloud-service-key - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -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/helm/cost-analyzer/templates/azure-storage-config-secret.yaml b/helm/cost-analyzer/templates/azure-storage-config-secret.yaml deleted file mode 100644 index f27cb4e8..00000000 --- a/helm/cost-analyzer/templates/azure-storage-config-secret.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{/*This method of configuration is deprecated*/}} -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.azureStorageCreateSecret }} -{{- if .Values.kubecostProductConfigs.azureStorageAccessKey }} -{{- if .Values.kubecostProductConfigs.azureStorageAccount }} -{{- if .Values.kubecostProductConfigs.azureStorageContainer }} -apiVersion: v1 -kind: Secret -metadata: - name: azure-storage-config - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -type: Opaque -stringData: - azure-storage-config.json: |- - { - "azureStorageAccount": "{{ .Values.kubecostProductConfigs.azureStorageAccount }}", - "azureStorageAccessKey": "{{ .Values.kubecostProductConfigs.azureStorageAccessKey }}", - "azureStorageContainer": "{{ .Values.kubecostProductConfigs.azureStorageContainer }}" - } -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/cost-analyzer-advanced-reports-configmap.yaml b/helm/cost-analyzer/templates/cost-analyzer-advanced-reports-configmap.yaml deleted file mode 100644 index 8b31cb0d..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-advanced-reports-configmap.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.global.advancedReports }} -{{- if .Values.global.advancedReports.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{default "advanced-report-configs" .Values.advancedReportConfigmapName }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - advanced-reports.json: '{{ toJson .Values.global.advancedReports.reports }}' -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/cost-analyzer-alerts-configmap.yaml b/helm/cost-analyzer/templates/cost-analyzer-alerts-configmap.yaml deleted file mode 100644 index c2491dfb..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-alerts-configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -{{- if .Values.global.notifications.alertConfigs }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ default "alert-configs" .Values.alertConfigmapName }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - alerts.json: '{{ toJson .Values.global.notifications.alertConfigs }}' -{{- end -}} diff --git a/helm/cost-analyzer/templates/cost-analyzer-asset-reports-configmap.yaml b/helm/cost-analyzer/templates/cost-analyzer-asset-reports-configmap.yaml deleted file mode 100644 index 387b0afc..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-asset-reports-configmap.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.global.assetReports }} -{{- if .Values.global.assetReports.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ default "asset-report-configs" .Values.assetReportConfigmapName }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - asset-reports.json: '{{ toJson .Values.global.assetReports.reports }}' -{{- end -}} -{{- end -}} - diff --git a/helm/cost-analyzer/templates/cost-analyzer-cloud-cost-reports-configmap.yaml b/helm/cost-analyzer/templates/cost-analyzer-cloud-cost-reports-configmap.yaml deleted file mode 100644 index 97e74156..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-cloud-cost-reports-configmap.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.global.cloudCostReports }} -{{- if .Values.global.cloudCostReports.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{default "cloud-cost-report-configs" .Values.cloudCostReportConfigmapName }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - cloud-cost-reports.json: '{{ toJson .Values.global.cloudCostReports.reports }}' -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml deleted file mode 100755 index 91867dd9..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml +++ /dev/null @@ -1,36 +0,0 @@ -{{- if .Values.reporting }} -{{- if .Values.reporting.logCollection }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "cost-analyzer.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} - 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 }} -{{- if (not .Values.kubecostModel.etlReadOnlyMode) }} -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 }} -{{- end }} diff --git a/helm/cost-analyzer/templates/cost-analyzer-cluster-role-template-readonly.yaml b/helm/cost-analyzer/templates/cost-analyzer-cluster-role-template-readonly.yaml deleted file mode 100755 index c84f105e..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-cluster-role-template-readonly.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if (.Values.kubecostModel.etlReadOnlyMode) }} -{{- 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 - - apiGroups: - - '' - resources: - - configmaps - verbs: - - get - - list - - watch -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml deleted file mode 100644 index e8c2a7a4..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml +++ /dev/null @@ -1,118 +0,0 @@ -{{- if not .Values.kubecostModel.etlReadOnlyMode -}} -{{- if and .Values.reporting .Values.reporting.logCollection -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - namespace: {{ .Release.Namespace }} - name: {{ template "cost-analyzer.serviceAccountName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -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 -{{- $isLeaderFollowerEnabled := include "cost-analyzer.leaderFollowerEnabled" . }} -{{- if $isLeaderFollowerEnabled }} - - apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - '*' -{{- end }} - - 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 -{{- end }} diff --git a/helm/cost-analyzer/templates/cost-analyzer-config-map-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-config-map-template.yaml deleted file mode 100755 index 20033422..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-config-map-template.yaml +++ /dev/null @@ -1,35 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "cost-analyzer.fullname" . }} - namespace: {{ .Release.Namespace }} - 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.gmp.enabled }} - prometheus-server-endpoint: {{ .Values.global.gmp.prometheusServerEndpoint }} - {{- else if .Values.global.amp.enabled }} - prometheus-server-endpoint: {{ .Values.global.amp.prometheusServerEndpoint }} - {{- else 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/helm/cost-analyzer/templates/cost-analyzer-db-pvc-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-db-pvc-template.yaml deleted file mode 100755 index 0eb9091a..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-db-pvc-template.yaml +++ /dev/null @@ -1,37 +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 - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- with .Values.persistentVolume.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.persistentVolume.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -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/helm/cost-analyzer/templates/cost-analyzer-deployment-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-deployment-template.yaml deleted file mode 100644 index be899d41..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-deployment-template.yaml +++ /dev/null @@ -1,1147 +0,0 @@ -{{- if and (not .Values.agent) (not .Values.cloudAgent) }} -{{- $nginxPort := int .Values.service.port | default 9090 -}} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "cost-analyzer.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if and .Values.kubecostDeployment .Values.kubecostDeployment.labels }} - {{- toYaml .Values.kubecostDeployment.labels | nindent 4 }} - {{- end }} - {{- if and .Values.kubecostDeployment .Values.kubecostDeployment.annotations }} - annotations: - {{- toYaml .Values.kubecostDeployment.annotations | nindent 4 }} - {{- end }} -spec: -{{- if .Values.kubecostDeployment }} - replicas: {{ .Values.kubecostDeployment.replicas | default 1 }} -{{- end }} - selector: - matchLabels: - {{- include "cost-analyzer.selectorLabels" . | nindent 8}} -{{- if .Values.kubecostDeployment }} -{{- if .Values.kubecostDeployment.deploymentStrategy }} -{{- with .Values.kubecostDeployment.deploymentStrategy }} - strategy: {{ toYaml . | nindent 4 }} -{{- end }} -{{- else }} - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate -{{- end }} -{{- end }} - template: - metadata: - labels: - {{- include "cost-analyzer.selectorLabels" . | nindent 8 }} - {{- if .Values.global.additionalLabels }} - {{ toYaml .Values.global.additionalLabels | nindent 8 }} - {{- end }} - {{- if and .Values.kubecostDeployment .Values.kubecostDeployment.labels }} - {{- toYaml .Values.kubecostDeployment.labels | nindent 8 }} - {{- 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 if .Values.global.securityContext }} - securityContext: - {{- toYaml .Values.global.securityContext | nindent 8 }} - {{- else }} - securityContext: - runAsUser: 1001 - runAsGroup: 1001 - fsGroup: 1001 - {{- end }} - restartPolicy: Always - serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} - volumes: - {{- if .Values.global.gcpstore.enabled }} - - name: ubbagent-config - configMap: - name: ubbagent-config - {{- end }} - {{- if .Values.hosted }} - - name: config-store - secret: - defaultMode: 420 - secretName: kubecost-thanos - {{- end }} - - name: tmp - emptyDir: {} - - name: nginx-conf - configMap: - name: nginx-conf - items: - - key: nginx.conf - path: default.conf - {{- if .Values.global.containerSecuritycontext }} - - name: var-run - emptyDir: { } - - name: cache - emptyDir: { } - {{- end }} - {{- /* - If Thanos is enabled, then enable ETL backups by default. - To opt out of ETL backups, set .Values.kubecostModel.etlBucketConfigSecret="" - */}} - {{- $etlBackupBucketSecret := "" }} - {{- if .Values.kubecostModel.etlBucketConfigSecret }} - {{- $etlBackupBucketSecret = .Values.kubecostModel.etlBucketConfigSecret }} - {{- else if and .Values.global.thanos.enabled (ne (typeOf .Values.kubecostModel.etlBucketConfigSecret) "string") }} - {{- $etlBackupBucketSecret = .Values.thanos.storeSecretName }} - {{- end }} - {{- if $etlBackupBucketSecret }} - - name: etl-bucket-config - secret: - defaultMode: 420 - secretName: {{ $etlBackupBucketSecret }} - {{- end }} - {{- if .Values.kubecostModel.federatedStorageConfigSecret }} - - name: federated-storage-config - secret: - defaultMode: 420 - secretName: {{ .Values.kubecostModel.federatedStorageConfigSecret }} - {{- end }} - {{- if .Values.kubecostProductConfigs }} - {{- if .Values.kubecostProductConfigs.productKey }} - {{- if and .Values.kubecostProductConfigs.productKey.enabled .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 }} - {{- if .Values.kubecostProductConfigs.gcpSecretName }} - - name: gcp-key-secret - secret: - secretName: {{ .Values.kubecostProductConfigs.gcpSecretName }} - items: - - key: compute-viewer-kubecost-key.json - path: service-key.json - {{- end }} - {{- 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.azureStorageSecretName }} - - name: azure-storage-config - secret: - secretName: {{ .Values.kubecostProductConfigs.azureStorageSecretName }} - items: - - key: azure-storage-config.json - path: azure-storage-config.json - {{- else if .Values.kubecostProductConfigs.azureStorageCreateSecret }} - - name: azure-storage-config - secret: - secretName: azure-storage-config - {{- end }} - {{- if .Values.kubecostProductConfigs.cloudIntegrationSecret }} - - name: cloud-integration - secret: - secretName: {{ .Values.kubecostProductConfigs.cloudIntegrationSecret }} - items: - - key: cloud-integration.json - path: cloud-integration.json - {{- 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.kubecostAdmissionController }} - {{- if .Values.kubecostAdmissionController.enabled }} - {{- if .Values.kubecostAdmissionController.secretName }} - - name: webhook-server-tls - secret: - secretName: {{ .Values.kubecostAdmissionController.secretName }} - items: - - key: tls.crt - path: tls.crt - - key: tls.key - path: tls.key - {{- end }} - {{- 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.encryptionCertSecret }} - - name: saml-encryption-cert - secret: - secretName: {{ .Values.saml.encryptionCertSecret }} - {{- end }} - {{- if .Values.saml.decryptionKeySecret }} - - name: saml-decryption-key - secret: - secretName: {{ .Values.saml.decryptionKeySecret }} - {{- 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 }} - {{- if .Values.oidc }} - {{- if .Values.oidc.enabled }} - - name: oidc-config - configMap: - name: {{ template "cost-analyzer.fullname" . }}-oidc - {{- if .Values.oidc.secretName }} - - name: oidc-client-secret - secret: - secretName: {{ .Values.oidc.secretName }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.extraVolumes }} - # Extra volume(s) - {{- toYaml .Values.extraVolumes | nindent 8 }} - {{- 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.global.gmp.enabled }} - - name: {{ .Values.global.gmp.gmpProxy.name }} - image: {{ .Values.global.gmp.gmpProxy.image }} - {{- if .Values.global.gmp.gmpProxy.imagePullPolicy }} - imagePullPolicy: {{ .Values.global.gmp.gmpProxy.imagePullPolicy }} - {{- else }} - imagePullPolicy: Always - {{- end }} - args: - - "--web.listen-address=:{{ .Values.global.gmp.gmpProxy.port }}" - - "--query.project-id={{ .Values.global.gmp.gmpProxy.projectId }}" - ports: - - name: web - containerPort: {{ .Values.global.gmp.gmpProxy.port | int }} - readinessProbe: - httpGet: - path: /-/ready - port: web - livenessProbe: - httpGet: - path: /-/healthy - port: web - {{- end }} - {{- if .Values.global.amp.enabled }} - - name: sigv4proxy - image: {{ .Values.sigV4Proxy.image }} - {{- if .Values.sigV4Proxy.imagePullPolicy }} - imagePullPolicy: {{ .Values.sigV4Proxy.imagePullPolicy }} - {{- else }} - imagePullPolicy: Always - {{- end }} - args: - - --name - - {{ .Values.sigV4Proxy.name }} - - --region - - {{ .Values.sigV4Proxy.region }} - - --host - - {{ .Values.sigV4Proxy.host }} - {{- if .Values.sigV4Proxy.role_arn }} - - --role-arn - - {{ .Values.sigV4Proxy.role_arn }} - {{- end }} - - --port - - :{{ .Values.sigV4Proxy.port }} - ports: - - name: aws-sigv4-proxy - containerPort: {{ .Values.sigV4Proxy.port | int }} - {{- if .Values.sigV4Proxy.extraEnv }} - env: - {{- toYaml .Values.sigV4Proxy.extraEnv | nindent 10 }} - {{- end }} - {{- end }} - {{- if .Values.global.gcpstore.enabled }} - - name: ubbagent - image: gcr.io/kubecost1/gcp-mp/ent/cost-model/ubbagent:1.0 - env: - - name: AGENT_CONFIG_FILE - value: "/etc/ubbagent/config.yaml" - - name: AGENT_LOCAL_PORT - value: "6080" - - name: AGENT_ENCODED_KEY - valueFrom: - secretKeyRef: - name: {{ default "kubecost-reporting-secret" .Values.reportingSecret }} - key: reporting-key - - name: AGENT_CONSUMER_ID - valueFrom: - secretKeyRef: - name: {{ default "kubecost-reporting-secret" .Values.reportingSecret }} - key: consumer-id - volumeMounts: - - name: ubbagent-config - mountPath: /etc/ubbagent - {{- end }} - {{- if .Values.kubecostModel }} - {{- if .Values.kubecostModel.openSourceOnly }} - - image: quay.io/kubecost1/kubecost-cost-model:{{ .Values.imageVersion }} - {{- else if .Values.kubecostModel.fullImageName }} - - image: {{ .Values.kubecostModel.fullImageName }} - {{- else 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.extraArgs }} - args: - {{- toYaml .Values.kubecostModel.extraArgs | nindent 12 }} - {{- end }} - securityContext: - {{- if .Values.kubecostModel.securityContext }} - {{- toYaml .Values.kubecostModel.securityContext | nindent 12 -}} - {{- else if .Values.global.containerSecurityContext }} - {{- toYaml .Values.global.containerSecurityContext | nindent 12 -}} - {{- end }} - {{- if .Values.kubecostModel.imagePullPolicy }} - imagePullPolicy: {{ .Values.kubecostModel.imagePullPolicy }} - {{- else }} - imagePullPolicy: Always - {{- end }} - ports: - - name: tcp-model - containerPort: 9003 - protocol: TCP - - name: tcp-frontend - containerPort: 9090 - protocol: TCP - resources: -{{ toYaml .Values.kubecostModel.resources | indent 12 }} - readinessProbe: - httpGet: - path: /healthz - port: 9003 - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - {{- if .Values.kubecostFrontend.livenessProbe.enabled }} - livenessProbe: - httpGet: - path: /healthz - port: 9003 - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - {{- end }} - {{- if .Values.global.containerSecuritycontext }} - securityContext: - {{- toYaml .Values.global.containerSecuritycontext | nindent 12 }} - {{- end }} - volumeMounts: - {{- if .Values.hosted }} - - name: config-store - mountPath: /var/secrets - readOnly: true - {{- end }} - - name: persistent-configs - mountPath: /var/configs - {{- if .Values.extraVolumeMounts }} - # Extra volume mount(s) - {{- toYaml .Values.extraVolumeMounts | nindent 12 }} - {{- end }} - {{- if $etlBackupBucketSecret }} - - name: etl-bucket-config - mountPath: /var/configs/etl - readOnly: true - {{- else if and (.Values.kubecostModel.etlToDisk | default true) .Values.persistentVolume.dbPVEnabled }} - - name: persistent-db - mountPath: /var/db - {{- end }} - {{- if .Values.kubecostModel.federatedStorageConfigSecret }} - - name: federated-storage-config - mountPath: /var/configs/etl/federated - readOnly: true - {{- end }} - {{- if .Values.kubecostAdmissionController }} - {{- if .Values.kubecostAdmissionController.enabled }} - {{- if .Values.kubecostAdmissionController.secretName }} - - name: {{ .Values.kubecostAdmissionController.secretName }} - mountPath: /certs - {{- end }} - {{- end }} - {{- 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: /var/secrets - {{- end }} - {{- if or .Values.kubecostProductConfigs.azureStorageSecretName .Values.kubecostProductConfigs.azureStorageCreateSecret }} - - name: azure-storage-config - mountPath: /var/azure-storage-config - {{- end }} - {{- if .Values.kubecostProductConfigs.cloudIntegrationSecret }} - - name: cloud-integration - mountPath: /var/configs/cloud-integration - {{- 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.encryptionCertSecret }} - - name: saml-encryption-cert - mountPath: /var/configs/saml-encryption-cert - {{- end }} - {{- if .Values.saml.decryptionKeySecret }} - - name: saml-decryption-key - mountPath: /var/configs/saml-decryption-key - {{- 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 }} - {{- if .Values.oidc }} - {{- if .Values.oidc.enabled }} - - name: oidc-config - mountPath: /var/configs/oidc - {{- if .Values.oidc.secretName }} - - name: oidc-client-secret - mountPath: /var/configs/oidc-client-secret - {{- end }} - {{- end }} - {{- end }} - env: - {{- if .Values.global.grafana }} - - name: GRAFANA_ENABLED - value: {{ (quote .Values.global.grafana.enabled) | default (quote false) }} - {{- end}} - {{- if .Values.kubecostModel.extraEnv -}} - {{ toYaml .Values.kubecostModel.extraEnv | nindent 12 }} - {{- end }} - {{- if .Values.reporting }} - {{- if .Values.reporting.valuesReporting }} - - name: HELM_VALUES - value: {{ template "cost-analyzer.filterEnabled" .Values }} - {{- end }} - {{- end }} - {{- if .Values.alertConfigmapName }} - - name: ALERT_CONFIGMAP_NAME - value: {{ .Values.alertConfigmapName }} - {{- end }} - {{- if .Values.productConfigmapName }} - - name: PRODUCT_CONFIGMAP_NAME - value: {{ .Values.productConfigmapName }} - {{- end }} - {{- if .Values.appConfigmapName }} - - name: APP_CONFIGMAP_NAME - value: {{ .Values.appConfigmapName }} - {{- end }} - {{- if .Values.kubecostModel.softMemoryLimit }} - - name: GOMEMLIMIT - value: {{ .Values.kubecostModel.softMemoryLimit }} - {{- end }} - {{- if .Values.assetReportConfigmapName }} - - name: ASSET_REPORT_CONFIGMAP_NAME - value: {{ .Values.assetReportConfigmapName }} - {{- end }} - {{- if .Values.cloudCostReportConfigmapName }} - - name: CLOUD_COST_REPORT_CONFIGMAP_NAME - value: {{ .Values.cloudCostReportConfigmapName }} - {{- end }} - {{- if .Values.savedReportConfigmapName }} - - name: SAVED_REPORT_CONFIGMAP_NAME - value: {{ .Values.savedReportConfigmapName }} - {{- end }} - {{- if .Values.groupFiltersConfigmapName }} - - name: GROUP_FILTERS_CONFIGMAP_NAME - value: {{ .Values.groupFiltersConfigmapName }} - {{- end }} - {{- if .Values.pricingConfigmapName }} - - name: PRICING_CONFIGMAP_NAME - value: {{ .Values.pricingConfigmapName }} - {{- end }} - {{- if .Values.metricsConfigmapName }} - - name: METRICS_CONFIGMAP_NAME - value: {{ .Values.metricsConfigmapName }} - {{- end }} - - name: READ_ONLY - value: {{ (quote .Values.readonly) | default (quote false) }} - - 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 key.This GCP api key is expected to be here and is limited to accessing google's billing API. - {{- if .Values.kubecostProductConfigs }} - {{- if .Values.kubecostProductConfigs.gcpSecretName }} - - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/configs/key.json - {{- end }} - {{- end }} - - 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 }} - {{- if .Values.kubecostProductConfigs }} - {{- if .Values.kubecostProductConfigs.productKey }} - {{- if .Values.kubecostProductConfigs.productKey.mountPath }} - - name: PRODUCT_KEY_MOUNT_PATH - value: {{ .Values.kubecostProductConfigs.productKey.mountPath }} - {{- end }} - {{- end }} - {{- if .Values.kubecostProductConfigs.ingestPodUID }} - - name: INGEST_POD_UID - value: {{ (quote .Values.kubecostProductConfigs.ingestPodUID) }} - {{- end }} - {{- if .Values.kubecostProductConfigs.regionOverrides }} - - name: REGION_OVERRIDE_LIST - value: {{ (quote .Values.kubecostProductConfigs.regionOverrides) }} - {{- end }} - {{- end }} - - name: REMOTE_WRITE_PASSWORD - value: {{ .Values.remoteWrite.postgres.auth.password }} - {{- if .Values.remoteWrite.postgres.enabled }} - - name: REMOTE_WRITE_ENABLED - value: "true" - {{- 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 }} - {{- 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.kubecostMetrics }} - - name: EMIT_POD_ANNOTATIONS_METRIC - value: {{ (quote .Values.kubecostMetrics.emitPodAnnotations) | default (quote false) }} - - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC - value: {{ (quote .Values.kubecostMetrics.emitNamespaceAnnotations) | default (quote false) }} - {{- end }} - {{- if .Values.kubecostMetrics }} - - name: EMIT_KSM_V1_METRICS - value: {{ (quote .Values.kubecostMetrics.emitKsmV1Metrics) | default (quote true) }} - {{- end }} - {{- if .Values.kubecostMetrics }} - - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default - value: {{ (quote .Values.kubecostMetrics.emitKsmV1MetricsOnly) | default (quote false) }} - {{- 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: LEGACY_EXTERNAL_API_DISABLED - value: {{ (quote .Values.kubecostModel.legacyOutOfClusterAPIDisabled) | default (quote false) }} - - name: OUT_OF_CLUSTER_PROM_METRICS_ENABLED - value: {{ (quote .Values.kubecostModel.outOfClusterPromMetricsEnabled) | default (quote false) }} - - name: CACHE_WARMING_ENABLED - value: {{ (quote .Values.kubecostModel.warmCache) | default (quote true) }} - - name: SAVINGS_ENABLED - value: {{ (quote .Values.kubecostModel.warmSavingsCache) | default (quote true) }} - - name: ETL_ENABLED - value: {{ (quote .Values.kubecostModel.etl) | default (quote true) }} - {{- if .Values.kubecostModel.etlReadOnlyMode }} - - name: ETL_READ_ONLY - value: "true" - {{- end }} - {{- if $etlBackupBucketSecret }} - - name: ETL_BUCKET_CONFIG - value: "/var/configs/etl/object-store.yaml" - {{- end }} - {{- if .Values.kubecostModel.federatedStorageConfigSecret }} - - name: FEDERATED_STORE_CONFIG - value: "/var/configs/etl/federated/federated-store.yaml" - {{- end }} - {{- if or .Values.federatedETL.federatedCluster .Values.kubecostModel.federatedStorageConfigSecret }} - - name: FEDERATED_CLUSTER - value: "true" - {{- end}} - {{- if .Values.federatedETL.primaryCluster }} - - name: FEDERATED_PRIMARY_CLUSTER - value: "true" - {{- end}} - {{- if .Values.federatedETL.redirectS3Backup }} - - name: FEDERATED_REDIRECT_BACKUP - value: "true" - {{- end}} - - name: ETL_STORE_READ_ONLY - value: {{ (quote .Values.kubecostModel.etlStoreReadOnly) | default (quote false) }} - - name : ETL_CLOUD_USAGE_ENABLED - {{- if kindIs "bool" .Values.kubecostModel.etlCloudUsage }} - value: {{ (quote .Values.kubecostModel.etlCloudUsage) }} - {{- else if kindIs "bool" .Values.kubecostModel.etlCloudAsset }} - value: {{ (quote .Values.kubecostModel.etlCloudAsset) }} - {{- else }} - value: "false" - {{- end }} - - name: CLOUD_ASSETS_EXCLUDE_PROVIDER_ID - value: {{ (quote .Values.kubecostModel.cloudAssetsExcludeProviderID) | default (quote false) }} - - name: ETL_CLOUD_REFRESH_RATE_HOURS - value: {{ (quote .Values.kubecostModel.etlCloudRefreshRateHours) | default (quote 6) }} - - name: ETL_CLOUD_QUERY_WINDOW_DAYS - value: {{ (quote .Values.kubecostModel.etlCloudQueryWindowDays) | default (quote 7) }} - - name: ETL_CLOUD_RUN_WINDOW_DAYS - value: {{ (quote .Values.kubecostModel.etlCloudRunWindowDays) | default (quote 3) }} - {{- if .Values.persistentVolume.dbPVEnabled }} - - name: ETL_PATH_PREFIX - value: "/var/db" - {{- end }} - - name: ETL_RESOLUTION_SECONDS - value: {{ (quote .Values.kubecostModel.etlResolutionSeconds) | default (quote 300) }} - - name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES - value: {{ (quote .Values.kubecostModel.maxPrometheusQueryDurationMinutes) | default (quote 1440) }} - - name: ETL_DAILY_STORE_DURATION_DAYS - value: {{ (quote .Values.kubecostModel.etlDailyStoreDurationDays) | default (quote 91) }} - - name: ETL_HOURLY_STORE_DURATION_HOURS - value: {{ (quote .Values.kubecostModel.etlHourlyStoreDurationHours) | default (quote 49) }} - - name: ETL_WEEKLY_STORE_DURATION_WEEKS - value: {{ (quote .Values.kubecostModel.etlWeeklyStoreDurationWeeks) | default (quote 53) }} - - name: ETL_FILE_STORE_ENABLED - value: {{ (quote .Values.kubecostModel.etlFileStoreEnabled) | default (quote true) }} - - name: ETL_ASSET_RECONCILIATION_ENABLED - value: {{ (quote .Values.kubecostModel.etlAssetReconciliationEnabled) | default (quote true) }} - - name: ETL_USE_UNBLENDED_COST - value: {{ (quote .Values.kubecostModel.etlUseUnblendedClost) | default (quote false) }} - {{- if .Values.kubecostModel }} - {{- if .Values.kubecostModel.allocation }} - {{- if .Values.kubecostModel.allocation.nodeLabels }} - {{- with .Values.kubecostModel.allocation.nodeLabels }} - - name: ALLOCATION_NODE_LABELS_ENABLED - value: {{ (quote .enabled) | default (quote true) }} - - name: ALLOCATION_NODE_LABELS_INCLUDE_LIST - value: {{ (quote .includeList) }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- with .Values.kubecostModel.cloudCost }} - - name: CLOUD_COST_ENABLED - value: {{ (quote .enabled) | default (quote true) }} - {{- with .labelList }} - - name: CLOUD_COST_IS_INCLUDE_LIST - value: {{ (quote .IsIncludeList) | default (quote false) }} - - name: CLOUD_COST_LABEL_LIST - value: {{ (quote .labels) }} - {{- end }} - - name: CLOUD_COST_TOP_N - value: {{ (quote .topNItems) | default (quote 1000) }} - {{- end }} - - name: CONTAINER_STATS_ENABLED - value: {{ (quote .Values.kubecostModel.containerStatsEnabled) | default (quote false) }} - - name: RECONCILE_NETWORK - value: {{ (quote .Values.kubecostModel.reconcileNetwork) | default (quote true) }} - {{- if .Values.systemProxy.enabled }} - - name: HTTP_PROXY - value: {{ .Values.systemProxy.httpProxyUrl }} - - name: http_proxy - value: {{ .Values.systemProxy.httpProxyUrl }} - - name: HTTPS_PROXY - value: {{ .Values.systemProxy.httpsProxyUrl }} - - name: https_proxy - value: {{ .Values.systemProxy.httpsProxyUrl }} - - name: NO_PROXY - value: {{ .Values.systemProxy.noProxy }} - - name: no_proxy - value: {{ .Values.systemProxy.noProxy }} - {{- end }} - {{- if .Values.kubecostMetrics }} - {{- if .Values.kubecostMetrics.exporter }} - - name: KUBECOST_METRICS_POD_ENABLED - value: {{ (quote .Values.kubecostMetrics.exporter.enabled) | default (quote false) }} - {{- end }} - {{- 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 - {{- if .Values.hosted }} - value: "false" - {{- else }} - value: "true" - {{- end }} - - 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.oidc.enabled }} - - name: OIDC_ENABLED - value: "true" - {{- 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.isGLUUProvider }} - - name: GLUU_SAML_PROVIDER - value: {{ (quote .Values.saml.isGLUUProvider) }} - {{- end }} - {{- if .Values.saml.nameIDFormat }} - - name: NAME_ID_FORMAT - value: {{ .Values.saml.nameIDFormat }} - {{- end}} - {{- if .Values.saml.authTimeout }} - - name: AUTH_TOKEN_TIMEOUT - value: {{ (quote .Values.saml.authTimeout) }} - {{- end}} - {{- if .Values.saml.redirectURL }} - - name: LOGOUT_REDIRECT_URL - value: {{ .Values.saml.redirectURL }} - {{- end}} - {{- if .Values.saml.rbac.enabled }} - - name: SAML_RBAC_ENABLED - value: "true" - {{- end }} - {{- if and .Values.saml.encryptionCertSecret .Values.saml.decryptionKeySecret }} - - name: SAML_RESPONSE_ENCRYPTED - 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 }} - {{- if .Values.kubecostModel.promClusterIDLabel }} - - name: PROM_CLUSTER_ID_LABEL - value: {{ .Values.kubecostModel.promClusterIDLabel }} - {{- end }} - {{- if .Values.hosted }} - - name: KUBECOST_CONFIG_BUCKET - value: /var/secrets/object-store.yaml - - name: CLUSTER_INFO_FILE_ENABLED - value: "true" - - name: CLUSTER_CACHE_FILE_ENABLED - value: "true" - {{- end }} - {{- if .Values.reporting.googleAnalyticsTag }} - - name: GOOGLE_ANALYTICS_TAG - value: {{ .Values.reporting.googleAnalyticsTag }} - {{- end }} - {{- if .Values.costEventsAudit }} - - name: COST_EVENTS_AUDIT_ENABLED - value: {{ (quote .Values.costEventsAudit.enabled) | default (quote false) }} - {{- end }} - {{- /* - Leader/Follower has baseline requirements before enabling: - * ETL FileStore Enabled - * Bucket Backup Configured - * Replicas > 1 - */}} - {{- if .Values.kubecostDeployment }} - {{- if .Values.kubecostDeployment.leaderFollower }} - {{- if .Values.kubecostDeployment.leaderFollower.enabled -}} - - {{- $etlFileStore := .Values.kubecostModel.etlFileStoreEnabled }} - {{- if not $etlFileStore }} - {{- fail "Leader/Follower requires kubecostModel.etlFileStoreEnabled be true." }} - {{- end -}} - - {{- if (eq (quote .Values.kubecostModel.etlBucketConfigSecret) "") }} - {{- fail "Leader/Follower requires kubecostModel.etlBucketConfigSecret be valid." }} - {{- end -}} - - {{- $replicas := .Values.kubecostDeployment.replicas | default 1 }} - {{- if not (gt (int $replicas) 1) }} - {{- fail "Leader/Follower should be used with kubecostDeployment.replicas > 1" }} - {{- end }} - {{- /* - Checks to ensure that the named template returns true if we've made it here - */}} - {{- $result := include "cost-analyzer.leaderFollowerEnabled" . }} - {{- if not $result }} - {{- fail (quote $result) }} - {{- end }} - - name: LEADER_FOLLOWER_ENABLED - value: "true" - {{- end }} - {{- end }} - {{- end }} - - name: RELEASE_NAME - value: {{ .Release.Name }} - - name: KUBECOST_NAMESPACE - value: {{ .Release.Namespace }} - - name: POD_NAME - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: metadata.name - - name: KUBECOST_TOKEN - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: kubecost-token - {{- if .Values.kubecostFrontend }} - {{- if .Values.kubecostFrontend.fullImageName }} - - image: {{ .Values.kubecostFrontend.fullImageName }} - {{- else 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 - {{- if .Values.kubecostFrontend.extraEnv -}} - {{ toYaml .Values.kubecostFrontend.extraEnv | nindent 12 }} - {{- end }} - name: cost-analyzer-frontend - {{- if .Values.kubecostFrontend.securityContext }} - securityContext: - {{- toYaml .Values.kubecostFrontend.securityContext | nindent 12 }} - {{- else if .Values.global.containerSecurityContext }} - securityContext: - {{- toYaml .Values.global.containerSecurityContext | nindent 12 }} - {{- end }} - volumeMounts: - - name: tmp - mountPath: /tmp - - name: nginx-conf - mountPath: /etc/nginx/conf.d/ - {{- if .Values.global.containerSecuritycontext }} - - mountPath: /var/cache/nginx - name: cache - - mountPath: /var/run - name: var-run - {{- end }} - {{- 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.kubecostFrontend.livenessProbe.enabled }} - livenessProbe: - httpGet: - path: /healthz - port: 9003 - initialDelaySeconds: {{ .Values.kubecostFrontend.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.kubecostFrontend.livenessProbe.periodSeconds }} - failureThreshold: {{ .Values.kubecostFrontend.livenessProbe.failureThreshold }} - {{- end }} - {{- if .Values.global.containerSecuritycontext }} - securityContext: - {{- toYaml .Values.global.containerSecuritycontext | nindent 12 }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.priority }} - {{- if .Values.priority.enabled }} - {{- if gt (len .Values.priority.name) 0 }} - priorityClassName: {{ .Values.priority.name }} - {{- else }} - priorityClassName: {{ template "cost-analyzer.fullname" . }}-priority - {{- end }} - {{- 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 }} -{{- end }} diff --git a/helm/cost-analyzer/templates/cost-analyzer-federator-config-map-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-federator-config-map-template.yaml deleted file mode 100644 index 72a326af..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-federator-config-map-template.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.federatedETL.federator }} -{{- if .Values.federatedETL.federator.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "cost-analyzer.fullname" . }}-federator - namespace: {{ .Release.Namespace }} - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} -data: -{{- $root := . }} - federator.json: '{{ toJson .Values.federatedETL.federator }}' -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml deleted file mode 100755 index 713c6a98..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml +++ /dev/null @@ -1,335 +0,0 @@ -{{- if and (not .Values.agent) (not .Values.cloudAgent) }} -{{- $serviceName := include "cost-analyzer.serviceName" . -}} -{{- $nginxPort := .Values.service.targetPort | default 9090 -}} -{{- if .Values.saml.enabled }} -{{- if .Values.oidc.enabled }} -{{- fail "SAML and OIDC cannot both be enabled" }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: nginx-conf - namespace: {{ .Release.Namespace }} - 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 - application/atom+xml - application/geo+json - application/javascript - application/x-javascript - application/json - application/ld+json - application/manifest+json - application/rdf+xml - application/rss+xml - application/vnd.ms-fontobject - application/wasm - application/x-web-app-manifest+json - application/xhtml+xml - application/xml - font/eot - font/otf - font/ttf - image/bmp - image/svg+xml - text/cache-manifest - text/calendar - text/css - text/javascript - text/markdown - text/plain - text/xml - text/x-component - text/x-cross-domain-policy; - - upstream api { -{{- if.Values.kubecostFrontend.api }} -{{- if.Values.kubecostFrontend.api.fqdn }} - server {{ .Values.kubecostFrontend.api.fqdn }}; -{{- else }} - server {{ $serviceName }}.{{ .Release.Namespace }}:9001; -{{- end }} -{{- else }} - server {{ $serviceName }}.{{ .Release.Namespace }}:9001; -{{- end }} - } - - upstream model { -{{- if.Values.kubecostFrontend.model }} -{{- if.Values.kubecostFrontend.model.fqdn }} - server {{ .Values.kubecostFrontend.model.fqdn }}; -{{- else }} - server {{ $serviceName }}.{{ .Release.Namespace }}:9003; -{{- end }} -{{- else }} - server {{ $serviceName }}.{{ .Release.Namespace }}:9003; -{{- end }} - } - -{{- if .Values.clusterController }} -{{- if .Values.clusterController.enabled }} - upstream clustercontroller { -{{- if .Values.clusterController.fqdn }} - server {{ .Values.clusterController.fqdn }}; -{{- else }} - server {{ template "kubecost.clusterControllerName" . }}-service.{{ .Release.Namespace }}:9731; -{{- end }} - } -{{- end }} -{{- end }} - -{{- if .Values.global.grafana.proxy }} - upstream grafana { -{{- if .Values.global.grafana.enabled }} -{{- if .Values.global.grafana.fqdn }} - server {{ .Values.global.grafana.fqdn }}; -{{- else }} - server {{ .Release.Name }}-grafana.{{ .Release.Namespace }}; -{{- end }} -{{- else }} - server {{.Values.global.grafana.domainName}}; -{{- end }} - } -{{- end }} - - {{- if and (.Values.kubecostDeployment) (.Values.kubecostDeployment.queryServiceReplicas) (gt (.Values.kubecostDeployment.queryServiceReplicas | toString | atoi) 0) }} - upstream queryservice { - server {{ .Release.Name }}-query-service-load-balancer.{{ .Release.Namespace }}:9003; - } - {{- end }} - - server { - server_name _; - root /var/www; - index index.html; - - add_header Cache-Control "must-revalidate"; - - {{- if.Values.kubecostFrontend.extraServerConfig }} - {{- .Values.kubecostFrontend.extraServerConfig | toString | nindent 8 -}} - {{- else }} - large_client_header_buffers 4 32k; - {{- end }} - - error_page 504 /custom_504.html; - location = /custom_504.html { - internal; - } - -{{- if or .Values.saml.enabled .Values.oidc.enabled }} - add_header Cache-Control "max-age=0"; - location / { - auth_request /auth; - 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; - error_page 401 = /login; - try_files $uri $uri/ /index.html; - } -{{- else }} - add_header Cache-Control "max-age=300"; - location / { - try_files $uri $uri/ /index.html; - } -{{- end }} -{{- if .Values.imageVersion }} - add_header ETag "{{ $.Values.imageVersion }}"; -{{- else }} - add_header ETag "{{ $.Chart.Version }}"; -{{- end }} -{{- if .Values.kubecostFrontend.tls }} -{{- if .Values.kubecostFrontend.tls.enabled }} -{{- if .Values.kubecostFrontend.tls.specifyProtocols }} - ssl_protocols {{ $.Values.kubecostFrontend.tls.protocols }}; -{{- end }} - ssl_certificate /etc/ssl/certs/kc.crt; - ssl_certificate_key /etc/ssl/certs/kc.key; - listen 443 ssl; -{{- if .Values.kubecostFrontend.ipv6.enabled }} - listen [::]:443 ssl; -{{- end }} -{{- else }} - listen {{ $nginxPort }}; -{{- if .Values.kubecostFrontend.ipv6.enabled }} - listen [::]:{{ $nginxPort }}; -{{- end }} -{{- end }} -{{- else }} - listen {{ $nginxPort }}; -{{- if .Values.kubecostFrontend.ipv6.enabled }} - listen [::]:{{ $nginxPort }}; -{{- end }} -{{- end }} - location /api/ { - {{- if or .Values.saml.enabled .Values.oidc.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 600; - proxy_send_timeout 600; - proxy_read_timeout 600; - 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; - {{- if .Values.kubecostFrontend.extraModelConfigs }} - {{- .Values.kubecostFrontend.extraModelConfigs | toString | nindent 12 -}} - {{- end }} - } - - location ~ ^/(turndown|cluster)/ { - - add_header 'Access-Control-Allow-Origin' '*' always; - add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS' always; -{{- if .Values.clusterController }} -{{- if .Values.clusterController.enabled }} - {{- if or .Values.saml .Values.oidc }} - {{- if or .Values.saml.enabled .Values.oidc.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 /oidc/ { - proxy_connect_timeout 180; - proxy_send_timeout 180; - proxy_read_timeout 180; - proxy_pass http://model/oidc/; - 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 /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; - proxy_set_header X-Original-URI $request_uri; - } - - location /logout { - proxy_connect_timeout 180; - proxy_send_timeout 180; - proxy_read_timeout 180; - proxy_pass http://model/logout; - 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; - proxy_set_header Host $http_host; - } - {{ end }} - {{- if or .Values.saml.enabled .Values.oidc.enabled }} - location /auth { - proxy_pass http://model/isAuthenticated; - } - {{- end }} - {{- if .Values.saml.rbac.enabled }} - location /authrbac { - proxy_pass http://model/isAdminAuthenticated; - } - {{- end }} - - {{- if and (.Values.kubecostDeployment) (.Values.kubecostDeployment.queryServiceReplicas) (gt (.Values.kubecostDeployment.queryServiceReplicas | toString | atoi) 0) }} - location /model/allocation { - proxy_connect_timeout 600; - proxy_send_timeout 600; - proxy_read_timeout 600; - proxy_pass http://queryservice/allocation; - 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/assets { - proxy_connect_timeout 600; - proxy_send_timeout 600; - proxy_read_timeout 600; - proxy_pass http://queryservice/assets; - 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.kubecostFrontend.trendsDisabled }} - location /model/allocation/trends { - return 204 'endpoint disabled'; - } - {{ end }} - } -{{- end }} diff --git a/helm/cost-analyzer/templates/cost-analyzer-ingress-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-ingress-template.yaml deleted file mode 100644 index 85394080..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-ingress-template.yaml +++ /dev/null @@ -1,66 +0,0 @@ -{{- if .Values.ingress -}} -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "cost-analyzer.fullname" . -}} -{{- $serviceName := include "cost-analyzer.serviceName" . -}} -{{- $ingressPaths := .Values.ingress.paths -}} -{{- $ingressPathType := .Values.ingress.pathType -}} -{{- $apiV1 := false -}} -{{- if and (.Capabilities.APIVersions.Has "networking.k8s.io/v1") (semverCompare "^1.19-0" .Capabilities.KubeVersion.GitVersion) }} -{{- $apiV1 = true -}} -apiVersion: networking.k8s.io/v1 -{{ else if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} -apiVersion: networking.k8s.io/v1beta1 -{{ else }} -apiVersion: extensions/v1beta1 -{{ end -}} -kind: Ingress -metadata: - name: {{ $fullName }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- with .Values.ingress.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if .Values.ingress.className }} - ingressClassName: {{ .Values.ingress.className }} -{{- end }} -{{- 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 }} - {{- if $apiV1 }} - - path: {{ . }} - pathType: {{ $ingressPathType }} - backend: - service: - name: {{ $serviceName }} - port: - name: tcp-frontend - {{- else }} - - path: {{ . }} - backend: - serviceName: {{ $serviceName }} - servicePort: tcp-frontend - {{- end }} - {{- end }} - {{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/cost-analyzer-metrics-config-map-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-metrics-config-map-template.yaml deleted file mode 100644 index 136d7fa9..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-metrics-config-map-template.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.kubecostProductConfigs -}} -{{- if .Values.kubecostProductConfigs.metricsConfigs -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ default "metrics-config" .Values.metricsConfigmapName }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - metrics.json: '{{ toJson .Values.kubecostProductConfigs.metricsConfigs }}' -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml deleted file mode 100644 index 378fca58..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if .Values.networkCosts -}} -{{- if .Values.networkCosts.enabled -}} -{{- if .Values.networkCosts.config -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: network-costs-config - namespace: {{ .Release.Namespace }} - 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/helm/cost-analyzer/templates/cost-analyzer-network-costs-podmonitor-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-network-costs-podmonitor-template.yaml deleted file mode 100644 index d0b5b5dd..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-network-costs-podmonitor-template.yaml +++ /dev/null @@ -1,32 +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" . }} - namespace: {{ .Release.Namespace }} - 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/helm/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml deleted file mode 100644 index fda8ccaf..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml +++ /dev/null @@ -1,35 +0,0 @@ -{{- if .Values.networkCosts }} -{{- if .Values.networkCosts.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "cost-analyzer.networkCostsName" . }} - namespace: {{ .Release.Namespace }} -{{- if (or .Values.networkCosts.service.annotations .Values.networkCosts.prometheusScrape) }} - annotations: -{{- if .Values.networkCosts.service.annotations }} -{{ toYaml .Values.networkCosts.service.annotations | indent 4 }} -{{- end }} -{{- if .Values.networkCosts.prometheusScrape }} - prometheus.io/scrape: "true" - prometheus.io/port: {{ (quote .Values.networkCosts.port) | default (quote 3001) }} -{{- end }} -{{- end }} - labels: - {{ unset (include "cost-analyzer.commonLabels" . | fromYaml) "app" | toYaml | nindent 4 }} - app: {{ template "cost-analyzer.networkCostsName" . }} -{{- if .Values.networkCosts.service.labels }} -{{ toYaml .Values.networkCosts.service.labels | indent 4 }} -{{- end }} -spec: - clusterIP: None - ports: - - name: metrics - port: {{ .Values.networkCosts.port | default 3001 }} - protocol: TCP - targetPort: {{ .Values.networkCosts.port | default 3001 }} - selector: - app: {{ template "cost-analyzer.networkCostsName" . }} - type: ClusterIP -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml deleted file mode 100644 index b4b1ea6e..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml +++ /dev/null @@ -1,143 +0,0 @@ -{{- if .Values.networkCosts -}} -{{- if .Values.networkCosts.enabled -}} -apiVersion: {{ include "cost-analyzer.daemonset.apiVersion" . }} -kind: DaemonSet -metadata: - name: {{ template "cost-analyzer.networkCostsName" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} -{{- if .Values.networkCosts.additionalLabels }} -{{ toYaml .Values.networkCosts.additionalLabels | indent 4 }} -{{- end }} -spec: - {{- if .Values.networkCosts.updateStrategy }} - updateStrategy: - {{- toYaml .Values.networkCosts.updateStrategy | nindent 4 }} - {{- end }} - selector: - matchLabels: - app: {{ template "cost-analyzer.networkCostsName" . }} - template: - metadata: - {{- with .Values.networkCosts.annotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - app: {{ template "cost-analyzer.networkCostsName" . }} - {{- if .Values.networkCosts.additionalLabels }} - {{ toYaml .Values.networkCosts.additionalLabels | nindent 8 }} - {{- end }} - spec: - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - hostNetwork: true - serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} - containers: - - name: {{ template "cost-analyzer.networkCostsName" . }} - image: {{ .Values.networkCosts.image }} - {{- if .Values.networkCosts.extraArgs }} - args: - {{- toYaml .Values.networkCosts.extraArgs | nindent 8 }} - {{- end }} -{{- if .Values.networkCosts.imagePullPolicy }} - imagePullPolicy: {{ .Values.networkCosts.imagePullPolicy }} -{{- else }} - imagePullPolicy: Always -{{- end }} -{{- if .Values.networkCosts.resources }} - resources: {{- toYaml .Values.networkCosts.resources | nindent 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) }} - {{- if .Values.networkCosts.softMemoryLimit }} - - name: GOMEMLIMIT - value: {{ .Values.networkCosts.softMemoryLimit }} - {{- end }} - {{- if .Values.networkCosts.heapMonitor }} - {{- if .Values.networkCosts.heapMonitor.enabled }} - - name: HEAP_MONITOR_ENABLED - value: "true" - - name: HEAP_MONITOR_THRESHOLD - value: {{ .Values.networkCosts.heapMonitor.threshold }} - {{- if .Values.networkCosts.heapMonitor.outFile }} - - name: HEAP_MONITOR_OUTPUT - value: {{ .Values.networkCosts.heapMonitor.outFile }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.networkCosts.healthCheckProbes }} - {{- toYaml .Values.networkCosts.healthCheckProbes | nindent 8 }} - {{- end }} - 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 - {{- if .Values.networkCosts.additionalSecurityContext }} - {{- toYaml .Values.networkCosts.additionalSecurityContext | nindent 10 }} - {{- end }} - 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 }} - {{- with .Values.networkCosts.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 10 }} - {{- end }} -{{- if .Values.networkCosts.tolerations }} - tolerations: -{{ toYaml .Values.networkCosts.tolerations | indent 8 }} - {{- end }} - {{- with .Values.networkCosts.affinity }} - affinity: - {{- toYaml . | nindent 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/helm/cost-analyzer/templates/cost-analyzer-network-policy-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-network-policy-template.yaml deleted file mode 100644 index 2cfa39c2..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-network-policy-template.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- if .Values.networkPolicy -}} -{{- if .Values.networkPolicy.costAnalyzer.enabled -}} -kind: NetworkPolicy -apiVersion: {{ include "cost-analyzer.networkPolicy.apiVersion" . }} -metadata: - name: {{ template "cost-analyzer.fullname" . }} -{{- if .Values.networkPolicy.costAnalyzer.annotations }} - annotations: -{{ toYaml .Values.networkPolicy.costAnalyzer.annotations | indent 4}} -{{- end }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} -{{- if .Values.networkPolicy.costAnalyzer.additionalLabels }} -{{ toYaml .Values.networkPolicy.costAnalyzer.additionalLabels | indent 4 }} -{{- end }} -spec: - podSelector: - matchLabels: - {{- include "cost-analyzer.selectorLabels" . | nindent 6 }} - policyTypes: -{{- if .Values.networkPolicy.costAnalyzer.ingressRules }} - - Ingress -{{- end }} -{{- if .Values.networkPolicy.costAnalyzer.egressRules }} - - Egress -{{- end }} -{{- if .Values.networkPolicy.costAnalyzer.egressRules }} - egress: -{{- range $rule := .Values.networkPolicy.costAnalyzer.egressRules }} - - to: -{{ toYaml $rule.selectors | indent 7 }} - ports: -{{ toYaml $rule.ports | indent 9 }} -{{- end }} -{{- end }} -{{- if .Values.networkPolicy.costAnalyzer.ingressRules }} - ingress: -{{- range $rule := .Values.networkPolicy.costAnalyzer.ingressRules }} - - from: -{{ toYaml $rule.selectors | indent 7 }} - ports: -{{ toYaml $rule.ports | indent 9 }} -{{- end }} -{{- end }} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/cost-analyzer-network-policy.yaml b/helm/cost-analyzer/templates/cost-analyzer-network-policy.yaml deleted file mode 100644 index 8b11d477..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-network-policy.yaml +++ /dev/null @@ -1,51 +0,0 @@ -{{- if .Values.networkPolicy -}} -{{- if .Values.networkPolicy.enabled -}} -apiVersion: {{ include "cost-analyzer.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -{{- if .Values.networkPolicy.denyEgress }} -metadata: - name: deny-egress - namespace: {{ .Release.Namespace }} - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - podSelector: - matchLabels: - {{- include "cost-analyzer.selectorLabels" . | nindent 6 }} - policyTypes: - - Egress - egress: - - to: - - namespaceSelector: {} -{{- else }} -{{- if .Values.networkPolicy.sameNamespace}} -metadata: - name: shared-namespace - namespace: {{ default "kubecost" .Values.networkPolicy.namespace}} -spec: - podSelector: - matchLabels: - app: prometheus - component: server -{{- else }} -metadata: - name: closed-traffic - namespace: {{ default "kubecost" .Values.networkPolicy.namespace}} -spec: - podSelector: - matchLabels: - app.kubernetes.io/name: cost-analyzer -{{- end }} - policyTypes: - - Ingress - ingress: - - from: - - podSelector: - matchLabels: - app.kubernetes.io/name: cost-analyzer - - namespaceSelector: - matchLabels: - name: k8s-kubecost -{{- end }} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/cost-analyzer-oidc-config-map-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-oidc-config-map-template.yaml deleted file mode 100644 index ee447680..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-oidc-config-map-template.yaml +++ /dev/null @@ -1,43 +0,0 @@ -{{- if .Values.oidc }} -{{- if .Values.oidc.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "cost-analyzer.fullname" . }}-oidc - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: -{{- $root := . }} - oidc.json: |- - { - "enabled" : {{ .Values.oidc.enabled }}, - "useIDToken" : {{ .Values.oidc.useIDToken | default "false" }}, - "clientID" : "{{ .Values.oidc.clientID }}", - "secretName" : "{{ .Values.oidc.secretName }}", - "authURL" : "{{ .Values.oidc.authURL }}", - "loginRedirectURL" : "{{ .Values.oidc.loginRedirectURL }}", - "discoveryURL" : "{{ .Values.oidc.discoveryURL }}", - "hostedDomain" : "{{ .Values.oidc.hostedDomain }}", - "rbac" : { - "enabled" : {{ .Values.oidc.rbac.enabled }}, - "groups" : [ - {{- range $i, $g := .Values.oidc.rbac.groups }} - {{- if ne $i 0 }},{{- end }} - { - "roleName": "{{ $g.name }}", - "enabled": {{ $g.enabled }}, - "claimName": "{{ $g.claimName }}", - "claimValues": [ - {{- range $j, $v := $g.claimValues }} - {{- if ne $j 0 }},{{- end }} - "{{ $v }}" - {{- end }} - ] - } - {{- end }} - ] - } - } -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/cost-analyzer-pkey-configmap.yaml b/helm/cost-analyzer/templates/cost-analyzer-pkey-configmap.yaml deleted file mode 100644 index 6420ac75..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-pkey-configmap.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.productKey }} -{{- if .Values.kubecostProductConfigs.productKey.enabled }} -# If the productKey.key is not specified, the configmap will not be created -{{- if .Values.kubecostProductConfigs.productKey.key }} -# If the secretname is specified, the configmap will not be created -{{- if not .Values.kubecostProductConfigs.productKey.secretname }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ default "product-configs" .Values.productConfigmapName }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - {{- if .Values.kubecostProductConfigs.productKey.key }} - key: {{ .Values.kubecostProductConfigs.productKey.key | quote }} - {{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml b/helm/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml deleted file mode 100644 index 1325d443..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml +++ /dev/null @@ -1,141 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ default "pricing-configs" .Values.pricingConfigmapName }} - namespace: {{ .Release.Namespace }} - 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.clusterAccountID }} - clusterAccountID: "{{ .Values.kubecostProductConfigs.clusterAccountID }}" - {{- 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.azureOfferDurableID }} - azureOfferDurableID: "{{ .Values.kubecostProductConfigs.azureOfferDurableID }}" - {{- 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.sharedOverhead }} - sharedOverhead: "{{ .Values.kubecostProductConfigs.sharedOverhead }}" - {{- end -}} - {{- if gt (len (toString .Values.kubecostProductConfigs.shareTenancyCosts)) 0 }} - {{- if eq (toString .Values.kubecostProductConfigs.shareTenancyCosts) "false" }} - shareTenancyCosts: "false" - {{- else if eq (toString .Values.kubecostProductConfigs.shareTenancyCosts) "true" }} - shareTenancyCosts: "true" - {{- end -}} - {{- 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.athenaWorkgroup }} - athenaWorkgroup: "{{ .Values.kubecostProductConfigs.athenaWorkgroup }}" - {{- 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/helm/cost-analyzer/templates/cost-analyzer-prometheus-postgres-adapter-deployment.yaml b/helm/cost-analyzer/templates/cost-analyzer-prometheus-postgres-adapter-deployment.yaml deleted file mode 100644 index 57bfcfa7..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-prometheus-postgres-adapter-deployment.yaml +++ /dev/null @@ -1,61 +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 - namespace: {{ .Release.Namespace }} - 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: - {{- if .Values.remoteWrite.postgres.priorityClassName }} - priorityClassName: "{{ .Values.remoteWrite.postgres.priorityClassName }}" - {{- end }} - 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 }}" - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 10 }} - {{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/cost-analyzer-prometheus-postgres-adapter-service.yaml b/helm/cost-analyzer/templates/cost-analyzer-prometheus-postgres-adapter-service.yaml deleted file mode 100644 index cad11064..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-prometheus-postgres-adapter-service.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -kind: Service -apiVersion: v1 -metadata: - name: pgprometheus-adapter - namespace: {{ .Release.Namespace }} - 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/helm/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml deleted file mode 100644 index eba7797f..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml +++ /dev/null @@ -1,22 +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" . }} - namespace: {{ .Release.Namespace }} - 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/helm/cost-analyzer/templates/cost-analyzer-psp-role.template.yaml b/helm/cost-analyzer/templates/cost-analyzer-psp-role.template.yaml deleted file mode 100644 index c62be765..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-psp-role.template.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -{{- if .Values.podSecurityPolicy }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "cost-analyzer.fullname" . }}-psp - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - annotations: -{{- if .Values.podSecurityPolicy.annotations }} -{{ toYaml .Values.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "cost-analyzer.fullname" . }}-psp -{{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/cost-analyzer-psp-rolebinding.template.yaml b/helm/cost-analyzer/templates/cost-analyzer-psp-rolebinding.template.yaml deleted file mode 100644 index 2eda00d4..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-psp-rolebinding.template.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -{{- if .Values.podSecurityPolicy }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "cost-analyzer.fullname" . }}-psp - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 6 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "cost-analyzer.fullname" . }}-psp -subjects: -- kind: ServiceAccount - name: {{ template "cost-analyzer.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -{{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/cost-analyzer-psp.template.yaml b/helm/cost-analyzer/templates/cost-analyzer-psp.template.yaml deleted file mode 100644 index d33b9c2a..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-psp.template.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -{{- if .Values.podSecurityPolicy }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: {{ include "cost-analyzer.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: {{ template "cost-analyzer.fullname" . }}-psp - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 6 }} -spec: - privileged: false - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - volumes: - - '*' -{{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/cost-analyzer-pvc-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-pvc-template.yaml deleted file mode 100755 index 82a9cdcd..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-pvc-template.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- if .Values.persistentVolume -}} -{{- if not .Values.persistentVolume.existingClaim -}} -{{- if .Values.persistentVolume.enabled -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ template "cost-analyzer.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- with .Values.persistentVolume.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.persistentVolume.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - accessModes: - - ReadWriteOnce - {{- if .Values.persistentVolume.storageClass }} - storageClassName: {{ .Values.persistentVolume.storageClass }} - {{ end }} - resources: - requests: - {{- if .Values.persistentVolume }} - storage: {{ .Values.persistentVolume.size }} - {{- else }} - storage: 32.0Gi - {{ end }} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/cost-analyzer-saml-config-map-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-saml-config-map-template.yaml deleted file mode 100644 index 3293f259..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-saml-config-map-template.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.saml }} -{{- if .Values.saml.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "cost-analyzer.fullname" . }}-saml - namespace: {{ .Release.Namespace }} - 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/helm/cost-analyzer/templates/cost-analyzer-saved-reports-configmap.yaml b/helm/cost-analyzer/templates/cost-analyzer-saved-reports-configmap.yaml deleted file mode 100644 index 285229ab..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-saved-reports-configmap.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.global.savedReports }} -{{- if .Values.global.savedReports.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{default "saved-report-configs" .Values.savedReportConfigmapName }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - saved-reports.json: '{{ toJson .Values.global.savedReports.reports }}' -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/cost-analyzer-server-configmap.yaml b/helm/cost-analyzer/templates/cost-analyzer-server-configmap.yaml deleted file mode 100644 index dc8741ff..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-server-configmap.yaml +++ /dev/null @@ -1,73 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if or .Values.kubecostProductConfigs.grafanaURL .Values.kubecostProductConfigs.labelMappingConfigs }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ default "app-configs" .Values.appConfigmapName }} - namespace: {{ .Release.Namespace }} - 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 -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.owner_external_label }} - owner_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.owner_external_label }}" - {{- end -}} -{{- end -}} -{{- end -}} - {{- if .Values.kubecostProductConfigs.grafanaURL }} - grafanaURL: "{{ .Values.kubecostProductConfigs.grafanaURL }}" - {{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/cost-analyzer-service-account-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-service-account-template.yaml deleted file mode 100755 index f2a2cec8..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-service-account-template.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "cost-analyzer.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -{{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/cost-analyzer-service-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-service-template.yaml deleted file mode 100755 index ab7e469b..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-service-template.yaml +++ /dev/null @@ -1,76 +0,0 @@ -{{- if and (not .Values.agent) (not .Values.cloudAgent) }} -{{- $nginxPort := .Values.service.targetPort | default 9090 -}} -{{- $servicePort := .Values.service.port | default 9090 -}} -kind: Service -apiVersion: v1 -metadata: - name: {{ template "cost-analyzer.serviceName" . }} - namespace: {{ .Release.Namespace }} - 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: tcp-model - port: 9003 - targetPort: 9003 - - name: tcp-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 }} - {{- if .Values.oidc }} - {{- if .Values.oidc.enabled }} - - name: apiserver - port: 9004 - targetPort: 9004 - {{- end }} - {{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml b/helm/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml deleted file mode 100644 index f35fa4c1..00000000 --- a/helm/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{- if .Values.serviceMonitor }} -{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "cost-analyzer.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if .Values.serviceMonitor.additionalLabels }} - {{ toYaml .Values.serviceMonitor.additionalLabels | nindent 4 }} - {{- end }} -spec: - endpoints: - - port: tcp-model - honorLabels: true - interval: 1m - scrapeTimeout: 10s - path: /metrics - scheme: http - {{- with .Values.serviceMonitor.metricRelabelings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.serviceMonitor.relabelings }} - relabelings: {{ toYaml . | nindent 8 }} - {{- end }} - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - selector: - matchLabels: - {{ include "cost-analyzer.selectorLabels" . | nindent 6 }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/external-grafana-config-map-template.yaml b/helm/cost-analyzer/templates/external-grafana-config-map-template.yaml deleted file mode 100644 index 1ac24ee3..00000000 --- a/helm/cost-analyzer/templates/external-grafana-config-map-template.yaml +++ /dev/null @@ -1,11 +0,0 @@ -{{- if eq .Values.global.grafana.proxy false -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: external-grafana-config-map - namespace: {{ .Release.Namespace }} - 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/helm/cost-analyzer/templates/extra-manifests.yaml b/helm/cost-analyzer/templates/extra-manifests.yaml deleted file mode 100644 index edad397d..00000000 --- a/helm/cost-analyzer/templates/extra-manifests.yaml +++ /dev/null @@ -1,8 +0,0 @@ -{{ range .Values.extraObjects }} ---- -{{- if typeIs "string" . }} - {{- tpl . $ }} -{{- else }} - {{- tpl (toYaml .) $ }} -{{- end }} -{{ end }} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/federator-deployment-template.yaml b/helm/cost-analyzer/templates/federator-deployment-template.yaml deleted file mode 100644 index 1744dc07..00000000 --- a/helm/cost-analyzer/templates/federator-deployment-template.yaml +++ /dev/null @@ -1,120 +0,0 @@ -{{- if .Values.federatedETL.useExistingS3Config -}} -{{- fail "ERROR: You are using a deprecated configuration `.Values.federatedETL.useExistingS3Config`. Please use `.Values.kubecostModel.federatedStorageConfigSecret` instead." -}} -{{- end -}} - -{{- if and (.Values.federatedETL.federator) (.Values.federatedETL.federator.enabled) }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "federator.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "federator.commonLabels" . | nindent 4 }} -spec: - replicas: 1 - selector: - matchLabels: - {{- include "federator.selectorLabels" . | nindent 6 }} - template: - metadata: - labels: - {{- include "federator.selectorLabels" . | nindent 8 }} - spec: - {{- if .Values.global.securityContext }} - securityContext: - {{- toYaml .Values.global.securityContext | nindent 8 }} - {{- end }} - containers: - - name: federator - {{- if .Values.kubecostModel }} - {{- if .Values.kubecostModel.fullImageName }} - image: {{ .Values.kubecostModel.fullImageName }} - {{- else 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 }} - imagePullPolicy: Always - {{- if .Values.global.containerSecurityContext }} - securityContext: - {{- toYaml .Values.global.containerSecurityContext | nindent 12 -}} - {{- end }} - args: ["federator"] - ports: - - name: tcp-model - containerPort: 9001 - protocol: TCP - volumeMounts: - - name: federator-config - mountPath: /var/configs/federator - - name: federated-storage-config - mountPath: /var/configs/etl/federated - readOnly: true - {{- if .Values.federatedETL.federator.extraVolumeMounts }} - {{- toYaml .Values.federatedETL.federator.extraVolumeMounts | nindent 12 }} - {{- end }} - readinessProbe: - httpGet: - path: /healthz - port: 9001 - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - resources: - {{- toYaml .Values.federatedETL.federator.resources | nindent 12 }} - env: - - name: CONFIG_PATH - value: /var/configs/ - - name: DB_PATH - value: /var/db/ - {{- if .Values.kubecostModel.federatedStorageConfigSecret }} - - name: FEDERATED_STORE_CONFIG - value: "/var/configs/etl/federated/federated-store.yaml" - {{- end }} - {{- if .Values.federatedETL.federator.extraEnv }} - {{- toYaml .Values.federatedETL.federator.extraEnv | nindent 12 }} - {{- end }} - restartPolicy: Always - serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} - volumes: - - name: federator-config - configMap: - name: {{ template "cost-analyzer.fullname" . }}-federator - {{- if .Values.kubecostModel.federatedStorageConfigSecret }} - - name: federated-storage-config - secret: - defaultMode: 420 - secretName: {{ .Values.kubecostModel.federatedStorageConfigSecret }} - {{- end }} - {{- if .Values.federatedETL.federator.extraVolumes }} - {{- toYaml .Values.federatedETL.federator.extraVolumes | nindent 8 }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.federatedETL.federator.priority }} - {{- if .Values.federatedETL.federator.priority.enabled }} - {{- if .Values.federatedETL.federator.priority.name }} - priorityClassName: {{ .Values.federatedETL.federator.priority.name }} - {{- else }} - priorityClassName: {{ template "federator.fullname" . }}-priority - {{- end }} - {{- end }} - {{- end }} - {{- with .Values.federatedETL.federator.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.federatedETL.federator.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.federatedETL.federator.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/gcpstore-config-map-template.yaml b/helm/cost-analyzer/templates/gcpstore-config-map-template.yaml deleted file mode 100644 index 0c5da0df..00000000 --- a/helm/cost-analyzer/templates/gcpstore-config-map-template.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- if .Values.global.gcpstore.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: ubbagent-config -data: - config.yaml: | - # The identity section contains authentication information used - # by the agent. - identities: - - name: gcp - gcp: - # This parameter accepts a base64-encoded JSON service - # account key. The value comes from the reporting secret. - encodedServiceAccountKey: $AGENT_ENCODED_KEY - - # The metrics section defines the metric that will be reported. - # Metric names should match verbatim the identifiers created - # during pricing setup. - metrics: - - - name: commercial_ent_node_hr - type: int - endpoints: - - name: servicecontrol - - # The passthrough marker indicates that no aggregation should - # occur for this metric. Reports received are immediately sent - # to the reporting endpoint. We use passthrough for the - # instance_time metric since reports are generated - # automatically by a heartbeat source defined in a later - # section. - passthrough: {} - - # The endpoints section defines where metering data is ultimately - # sent. Currently supported endpoints include: - # * disk - some directory on the local filesystem - # * servicecontrol - Google Service Control - endpoints: - - name: servicecontrol - servicecontrol: - identity: gcp - # The service name is unique to your application and will be - # provided during onboarding. - serviceName: kubecost-ent.endpoints.kubecost-public.cloud.goog - consumerId: $AGENT_CONSUMER_ID # From the reporting secret. - - - # The sources section lists metric data sources run by the agent - # itself. The currently-supported source is 'heartbeat', which - # sends a defined value to a metric at a defined interval. In - # this example, the heartbeat sends a 60-second value through the - # "instance_time" metric every minute. - sources: - - name: commercial_ent_node_hr_heartbeat - heartbeat: - metric: commercial_ent_node_hr - intervalSeconds: 3600 - value: - int64Value: 1 -{{- end }} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/grafana-attached-disk-metrics-template.yaml b/helm/cost-analyzer/templates/grafana-attached-disk-metrics-template.yaml deleted file mode 100644 index dc6b36f4..00000000 --- a/helm/cost-analyzer/templates/grafana-attached-disk-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: 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 }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} -data: - attached-disks.json: |- -{{ .Files.Get "attached-disks.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/grafana-dashboard-cluster-metrics-template.yaml b/helm/cost-analyzer/templates/grafana-dashboard-cluster-metrics-template.yaml deleted file mode 100644 index 640b6bd3..00000000 --- a/helm/cost-analyzer/templates/grafana-dashboard-cluster-metrics-template.yaml +++ /dev/null @@ -1,29 +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 }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} -data: - cluster-metrics.json: |- -{{ .Files.Get "cluster-metrics.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} - - diff --git a/helm/cost-analyzer/templates/grafana-dashboard-cluster-utilization-template.yaml b/helm/cost-analyzer/templates/grafana-dashboard-cluster-utilization-template.yaml deleted file mode 100644 index 3b12e5f0..00000000 --- a/helm/cost-analyzer/templates/grafana-dashboard-cluster-utilization-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-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 }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} -data: - cluster-utilization.json: |- -{{ .Files.Get "cluster-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/grafana-dashboard-deployment-utilization-template.yaml b/helm/cost-analyzer/templates/grafana-dashboard-deployment-utilization-template.yaml deleted file mode 100644 index 644a8ea6..00000000 --- a/helm/cost-analyzer/templates/grafana-dashboard-deployment-utilization-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: 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 }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} -data: - deployment-utilization.json: |- -{{ .Files.Get "deployment-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/grafana-dashboard-kubernetes-resource-efficiency-template.yaml b/helm/cost-analyzer/templates/grafana-dashboard-kubernetes-resource-efficiency-template.yaml deleted file mode 100644 index 719fae54..00000000 --- a/helm/cost-analyzer/templates/grafana-dashboard-kubernetes-resource-efficiency-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: grafana-dashboard-kubernetes-resource-efficiency - {{- 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 }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} -data: - kubernetes-resource-efficiency.json: |- -{{ .Files.Get "kubernetes-resource-efficiency.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/grafana-dashboard-label-cost-utilization-template.yaml b/helm/cost-analyzer/templates/grafana-dashboard-label-cost-utilization-template.yaml deleted file mode 100644 index 6ba7163f..00000000 --- a/helm/cost-analyzer/templates/grafana-dashboard-label-cost-utilization-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: 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 }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} -data: - label-cost-utilization.json: |- -{{ .Files.Get "label-cost-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/grafana-dashboard-namespace-utilization-template.yaml b/helm/cost-analyzer/templates/grafana-dashboard-namespace-utilization-template.yaml deleted file mode 100644 index 33524b7a..00000000 --- a/helm/cost-analyzer/templates/grafana-dashboard-namespace-utilization-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: 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 }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} -data: - namespace-utilization.json: |- -{{ .Files.Get "namespace-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/grafana-dashboard-node-utilization-template.yaml b/helm/cost-analyzer/templates/grafana-dashboard-node-utilization-template.yaml deleted file mode 100644 index aafed64f..00000000 --- a/helm/cost-analyzer/templates/grafana-dashboard-node-utilization-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: 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 }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} -data: - node-utilization.json: |- -{{ .Files.Get "node-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/grafana-dashboard-pod-utilization-template.yaml b/helm/cost-analyzer/templates/grafana-dashboard-pod-utilization-template.yaml deleted file mode 100644 index 8058c4cc..00000000 --- a/helm/cost-analyzer/templates/grafana-dashboard-pod-utilization-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: 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 }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} -data: - pod-utilization.json: |- -{{ .Files.Get "pod-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/grafana-dashboard-prometheus-metrics-template.yaml b/helm/cost-analyzer/templates/grafana-dashboard-prometheus-metrics-template.yaml deleted file mode 100644 index bee726f2..00000000 --- a/helm/cost-analyzer/templates/grafana-dashboard-prometheus-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: 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 }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} -data: - prom-benchmark.json: |- -{{ .Files.Get "prom-benchmark.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/grafana-datasource-template.yaml b/helm/cost-analyzer/templates/grafana-datasource-template.yaml deleted file mode 100644 index d92a9502..00000000 --- a/helm/cost-analyzer/templates/grafana-datasource-template.yaml +++ /dev/null @@ -1,56 +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 - name: default-kubecost - type: prometheus -{{- if .Values.grafana.sidecar.datasources.defaultDatasourceEnabled }} - isDefault: true -{{- else }} - isDefault: false -{{- end }} -{{- if .Values.global.thanos }} -{{- if .Values.global.thanos.enabled }} -{{- 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 }} - - access: proxy - name: {{ default "Prometheus" .Values.grafana.sidecar.datasources.dataSourceName}} - isDefault: false - type: prometheus -{{- end }} -{{- if .Values.global.prometheus.enabled }} - url: http://{{ template "cost-analyzer.prometheus.server.name" . }}.{{ .Release.Namespace }} -{{- else }} - url: {{ .Values.global.prometheus.fqdn }} -{{- end }} -{{- end }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/grafana-networkcosts-metrics-template.yaml b/helm/cost-analyzer/templates/grafana-networkcosts-metrics-template.yaml deleted file mode 100644 index 828bfa96..00000000 --- a/helm/cost-analyzer/templates/grafana-networkcosts-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: grafana-dashboard-networkcosts-metrics - {{- 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 }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} -data: - networkCosts-metrics.json: |- -{{ .Files.Get "networkCosts-metrics.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/grafana-pod-utilization-multi-cluster-template.yaml b/helm/cost-analyzer/templates/grafana-pod-utilization-multi-cluster-template.yaml deleted file mode 100644 index 7559e9cc..00000000 --- a/helm/cost-analyzer/templates/grafana-pod-utilization-multi-cluster-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: grafana-dashboard-pod-utilization-multi-cluster - {{- 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 }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} -data: - pod-utilization-multi-cluster.json: |- -{{ .Files.Get "pod-utilization-multi-cluster.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/kubecost-admission-controller-service-template.yaml b/helm/cost-analyzer/templates/kubecost-admission-controller-service-template.yaml deleted file mode 100644 index 658dca3a..00000000 --- a/helm/cost-analyzer/templates/kubecost-admission-controller-service-template.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.kubecostAdmissionController -}} -{{- if .Values.kubecostAdmissionController.enabled -}} -apiVersion: v1 -kind: Service -metadata: - name: webhook-server - namespace: {{.Release.Namespace}} -spec: - selector: - {{ include "cost-analyzer.selectorLabels" . | nindent 4 }} - ports: - - port: 443 - targetPort: 8443 -{{- end -}} -{{- end -}} diff --git a/helm/cost-analyzer/templates/kubecost-admission-controller-template.yaml b/helm/cost-analyzer/templates/kubecost-admission-controller-template.yaml deleted file mode 100644 index be68bcea..00000000 --- a/helm/cost-analyzer/templates/kubecost-admission-controller-template.yaml +++ /dev/null @@ -1,30 +0,0 @@ -{{- if .Values.kubecostAdmissionController -}} -{{- if .Values.kubecostAdmissionController.enabled -}} -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - name: kubecost-deployment-validation -webhooks: - - name: "kubecost-deployment-validation.kubecost.svc" - failurePolicy: Ignore - rules: - - operations: [ "CREATE", "UPDATE" ] - apiGroups: [ "apps" ] - apiVersions: [ "v1" ] - resources: [ "deployments" ] - scope: "*" - clientConfig: - service: - namespace: {{.Release.Namespace}} - name: webhook-server - path: "/validate" - {{- if .Values.kubecostAdmissionController.caBundle }} - caBundle: {{ .Values.kubecostAdmissionController.caBundle }} - {{- else }} - caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCRENDQWV5Z0F3SUJBZ0lVR3E2YkdOaEowVjRsb0NiWHhUa0pocWkwUnB3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd0pqRWtNQ0lHQTFVRUF3d2JkMlZpYUc5dmF5MXpaWEoyWlhJdWEzVmlaV052YzNRdWMzWmpNQjRYRFRJegpNREl3T1RFNU1UVTFNbG9YRFRJME1EWXlNekU1TVRVMU1sb3dKakVrTUNJR0ExVUVBd3diZDJWaWFHOXZheTF6ClpYSjJaWEl1YTNWaVpXTnZjM1F1YzNaak1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXpvU2JBejBhZFJTdEN3eVRPSGd2S2VuQ29GbWE2OC9nYTFHZjVST2dXeGJhamhQRTZKbEtBcENwK1pzKwo2bHJzL2J3bkx5SDdoMUFJa1NmZ25EYlNadDJjdHRFSmhSd25vKy90WElMYk84WndRQTErYXpUQzVtSkluZVF3CktRMkErYy9CUnk3N3B0SnZIRStkTEllcWhRelV2M25nWUwvSDZaMUZPa20xUCtlR0FwSWxyVHVPV1ozUVhRYkMKemhOQXppRWNjL3o3RERBdlFBMlpIQ1I2OGl1V0ptd0RYZEdjWmEwenNVb1hDbGIvWXdiWFgvMlp2dklIbkdtawp5VTlZdEhxNVpscFZjT0V5MTVBWFVEOFZVUU1jVXQ5NkJvVThMMXJKbTZJK0E0YmFySEs5QjlxcjdzRmFaY2wvCnBncHZGd0NBaHZHYUM2VzA5UnM3T0NrdXh3SURBUUFCb3lvd0tEQW1CZ05WSFJFRUh6QWRnaHQzWldKb2IyOXIKTFhObGNuWmxjaTVyZFdKbFkyOXpkQzV6ZG1Nd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFDdVhNcUgzYmhsVApGKzlRUFplS2xiUTZlWSs0NlhMVGtEdlZzenAyZysweWhlMVNRRHZRUTVad1l6MnMwODNqb2loTXVzeFZ1TmFGCk1LdE9vbGY2bitsaUZFcEw4OU9XZ1VjdzJRdFdqVWUraU1zby91dWN0eGVPTzZLam9JcUVrUlg5YXh1cGxxVm0KakZRaGZtNlRYZ2pxWmttUVNsbHdLVkcxSFJZTkRveFpFa0JHK1l6RWF5QmdQdXl4bW5iTDdlck5IOVJQSVZtbAoxaWFnS1NVVG5vN0hJY3IwdHYzT3JEWDZRN3VJUGdWanBRSHMzNXBZSWlBYjVNR0RjWFZvY050SEZ0YnluREhzCi80WGhYMjFhOXdnSVF6dUF3ck0zQ0VDRnVocHJzWlZmQjBKQ1dBOG1aVEZneTVBL0tLUjJmTXRMRWRQS1ZsSXUKZjc1MjB3T3JzME09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K - {{- end }} - admissionReviewVersions: ["v1"] - sideEffects: None - timeoutSeconds: 5 -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/kubecost-agent-secret-template.yaml b/helm/cost-analyzer/templates/kubecost-agent-secret-template.yaml deleted file mode 100644 index cda3c605..00000000 --- a/helm/cost-analyzer/templates/kubecost-agent-secret-template.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.agentKey }} -apiVersion: v1 -kind: Secret -type: Opaque -metadata: - name: {{ .Values.agentKeySecretName }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - object-store.yaml: {{ .Values.agentKey }} -{{- end }} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/kubecost-agent-secretprovider-template.yaml b/helm/cost-analyzer/templates/kubecost-agent-secretprovider-template.yaml deleted file mode 100644 index 40ee87e3..00000000 --- a/helm/cost-analyzer/templates/kubecost-agent-secretprovider-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.agent }} -{{- if .Values.agentCsi.enabled }} -{{- if .Capabilities.APIVersions.Has "secrets-store.csi.x-k8s.io/v1" }} -apiVersion: secrets-store.csi.x-k8s.io/v1 -{{- else }} -apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 -{{- end }} -kind: SecretProviderClass -metadata: - name: {{ .Values.agentCsi.secretProvider.name }} - namespace: {{ .Release.Namespace }} - labels: {{ unset (include "cost-analyzer.commonLabels" . | fromYaml) "app" | toYaml | nindent 4 }} - app: {{ template "kubecost.kubeMetricsName" . }} -spec: - provider: {{ required "Specify a valid provider." .Values.agentCsi.secretProvider.provider }} - {{- if .Values.agentCsi.secretProvider.parameters }} - parameters: - {{- .Values.agentCsi.secretProvider.parameters | toYaml | nindent 4 }} - {{- end }} - {{- if .Values.agentCsi.secretProvider.secretObjects }} - secretObjects: - {{- .Values.agentCsi.secretProvider.secretObjects | toYaml | nindent 2 }} - {{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/kubecost-cluster-controller-template.yaml b/helm/cost-analyzer/templates/kubecost-cluster-controller-template.yaml deleted file mode 100644 index beabc38d..00000000 --- a/helm/cost-analyzer/templates/kubecost-cluster-controller-template.yaml +++ /dev/null @@ -1,392 +0,0 @@ -{{- if .Values.clusterController }} -{{- if .Values.clusterController.enabled }} -{{- $serviceName := include "cost-analyzer.serviceName" . -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "kubecost.clusterControllerName" . }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} ---- -# -# 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: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -rules: - - apiGroups: - - kubecost.com - 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 - verbs: - - get - - list - - watch - - update - - patch - - delete - - apiGroups: - - '' - resources: - - configmaps - - namespaces - - persistentvolumeclaims - - persistentvolumes - - endpoints - - events - - services - verbs: - - get - - list - - watch - - apiGroups: - - '' - resources: - - configmaps - resourceNames: - - 'cluster-controller-nsturndown-config' - verbs: - - get - - create - - update - - 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 - # Used for namespace turndown - # When cleaning a namespace, we need the ability to remove - # arbitrary resources (since we helm uninstall all releases in that NS first) - {{- if .Values.clusterController.namespaceTurndown.rbac.enabled }} - - apiGroups: ["*"] - resources: ["*"] - verbs: - - list - - get - - delete - {{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "kubecost.clusterControllerName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "kubecost.clusterControllerName" . }} -subjects: - - kind: ServiceAccount - name: {{ template "kubecost.clusterControllerName" . }} - namespace: {{ .Release.Namespace }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: cluster-controller-continuous-cluster-sizing - namespace: {{ .Release.Namespace }} - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: cluster-controller-nsturndown-config - namespace: {{ .Release.Namespace }} - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "kubecost.clusterControllerName" . }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - selector: - matchLabels: - app: {{ template "kubecost.clusterControllerName" . }} - template: - metadata: - labels: - app: {{ template "kubecost.clusterControllerName" . }} - spec: - {{- if .Values.clusterController.priorityClassName }} - priorityClassName: "{{ .Values.clusterController.priorityClassName }}" - {{- end }} - 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: CLUSTER_ID - value: {{ .Values.prometheus.server.global.external_labels.cluster_id }} - - name: TURNDOWN_NAMESPACE - value: {{ .Release.Namespace }} - - name: TURNDOWN_DEPLOYMENT - value: {{ template "kubecost.clusterControllerName" . }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/keys/service-key.json - - name: CC_LOG_LEVEL - value: {{ .Values.clusterController.logLevel | default "info" }} - - name: CC_KUBESCALER_COST_MODEL_PATH - value: http://{{ $serviceName }}.{{ .Release.Namespace }}:{{ .Values.service.targetPort | default 9090 }}/model - - name: CC_CCL_COST_MODEL_PATH - value: http://{{ $serviceName }}.{{ .Release.Namespace }}:{{ .Values.service.targetPort | default 9090 }}/model - {{- if .Values.clusterController.kubescaler }} - - name: CC_KUBESCALER_DEFAULT_RESIZE_ALL - value: {{ .Values.clusterController.kubescaler.defaultResizeAll | default "false" | quote }} - {{- end }} - 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" }} - # The secret is optional because not all of cluster controller's - # functionality requires this secret. Cluster controller will - # partially or fully initialize based on the presence of these keys - # and their validity. - optional: true ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kubecost.clusterControllerName" . }}-service - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -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/v1 -kind: CustomResourceDefinition -metadata: - name: turndownschedules.kubecost.com - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - group: kubecost.com - names: - kind: TurndownSchedule - singular: turndownschedule - plural: turndownschedules - shortNames: - - td - - tds - scope: Cluster - versions: - - name: v1alpha1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - repeat: - type: string - enum: [none, daily, weekly] - status: - type: object - properties: - state: - type: string - lastUpdated: - format: date-time - type: string - current: - type: string - scaleDownId: - type: string - nextScaleDownTime: - format: date-time - type: string - scaleDownMetadata: - additionalProperties: - type: string - type: object - scaleUpID: - type: string - nextScaleUpTime: - format: date-time - type: string - scaleUpMetadata: - additionalProperties: - type: string - type: object - 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/helm/cost-analyzer/templates/kubecost-cluster-manager-configmap-template.yaml b/helm/cost-analyzer/templates/kubecost-cluster-manager-configmap-template.yaml deleted file mode 100644 index b851fd4e..00000000 --- a/helm/cost-analyzer/templates/kubecost-cluster-manager-configmap-template.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.clusters }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: kubecost-clusters - namespace: {{ .Release.Namespace }} - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - default-clusters.yaml: | -{{- toYaml .Values.kubecostProductConfigs.clusters | nindent 4 }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/kubecost-metrics-deployment-template.yaml b/helm/cost-analyzer/templates/kubecost-metrics-deployment-template.yaml deleted file mode 100644 index 070c05a5..00000000 --- a/helm/cost-analyzer/templates/kubecost-metrics-deployment-template.yaml +++ /dev/null @@ -1,331 +0,0 @@ -{{- if .Values.kubecostMetrics }} -{{- if .Values.kubecostMetrics.exporter }} -{{- if or (or .Values.kubecostMetrics.exporter.enabled .Values.agent) .Values.cloudAgent }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "kubecost.kubeMetricsName" . }} - namespace: {{ .Release.Namespace }} - labels: - {{ unset (include "cost-analyzer.commonLabels" . | fromYaml) "app" | toYaml | nindent 4 }} - app: {{ template "kubecost.kubeMetricsName" . }} -{{- with .Values.kubecostMetrics.exporter.labels }} -{{ toYaml . | indent 4 }} -{{- end }} -spec: - replicas: {{ .Values.kubecostMetrics.exporter.replicas | default 1 }} - selector: - matchLabels: - app: {{ include "kubecost.kubeMetricsName" . }} - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - template: - metadata: - labels: - app: {{ template "kubecost.kubeMetricsName" . }} - {{- if .Values.global.additionalLabels }} - {{ toYaml .Values.global.additionalLabels | nindent 8 }} - {{- end }} -{{- with .Values.kubecostMetrics.exporter.labels }} -{{ toYaml . | indent 8 }} -{{- 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 }} - securityContext: - runAsUser: 1001 - runAsGroup: 1001 - fsGroup: 1001 - {{- end }} - restartPolicy: Always - serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} - volumes: - {{- if .Values.agent }} - - name: config-store - {{- if .Values.agentCsi.enabled }} - csi: - driver: secrets-store.csi.k8s.io - readOnly: true - volumeAttributes: - secretProviderClass: "{{ .Values.agentCsi.secretProvider.name }}" - {{- else }} - secret: - secretName: {{ .Values.agentKeySecretName }} - {{- end }} - {{- end }} - {{- if .Values.kubecostProductConfigs }} - {{- if .Values.kubecostProductConfigs.gcpSecretName }} - - name: gcp-key-secret - secret: - secretName: {{ .Values.kubecostProductConfigs.gcpSecretName }} - items: - - key: compute-viewer-kubecost-key.json - path: service-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.azureStorageSecretName }} - - name: azure-storage-config - secret: - secretName: {{ .Values.kubecostProductConfigs.azureStorageSecretName }} - items: - - key: azure-storage-config.json - path: azure-storage-config.json - {{- else if .Values.kubecostProductConfigs.azureStorageCreateSecret }} - - name: azure-storage-config - secret: - secretName: azure-storage-config - {{- end }} - {{- if .Values.kubecostProductConfigs.cloudIntegrationSecret }} - - name: cloud-integration - secret: - secretName: {{ .Values.kubecostProductConfigs.cloudIntegrationSecret }} - items: - - key: cloud-integration.json - path: cloud-integration.json - {{- 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 }} - 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 }} - command: ["sh", "-c", "/bin/chmod -R 777 /var/configs"] - volumeMounts: - - name: persistent-configs - mountPath: /var/configs - securityContext: - runAsUser: 0 -{{- end }} - containers: - {{- if .Values.kubecostModel }} - {{- if .Values.kubecostModel.fullImageName }} - - image: {{ .Values.kubecostModel.fullImageName }} - {{- else 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 }} - {{- if .Values.kubecostModel.imagePullPolicy }} - imagePullPolicy: {{ .Values.kubecostModel.imagePullPolicy }} - {{- else }} - imagePullPolicy: Always - {{- end }} - name: {{ template "kubecost.kubeMetricsName" . }} - ports: - - name: tcp-metrics - protocol: TCP - containerPort: {{ .Values.kubecostMetrics.exporter.port | default 9005 }} - resources: -{{ toYaml .Values.kubecostMetrics.exporter.resources | indent 12 }} - readinessProbe: - httpGet: - path: /healthz - port: {{ .Values.kubecostMetrics.exporter.port | default 9005 }} - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - volumeMounts: - - name: persistent-configs - mountPath: /var/configs - {{- if .Values.agent }} - - name: config-store - mountPath: /var/secrets - {{- end }} - {{- if .Values.kubecostProductConfigs }} - {{- if .Values.kubecostProductConfigs.gcpSecretName }} - - name: gcp-key-secret - mountPath: /var/secrets - {{- end }} - {{- if or .Values.kubecostProductConfigs.azureStorageSecretName .Values.kubecostProductConfigs.azureStorageCreateSecret }} - - name: azure-storage-config - mountPath: /var/azure-storage-config - {{- end }} - {{- if .Values.kubecostProductConfigs.cloudIntegrationSecret }} - - name: cloud-integration - mountPath: /var/configs/cloud-integration - {{- end }} - {{- if or .Values.kubecostProductConfigs.serviceKeySecretName .Values.kubecostProductConfigs.createServiceKeySecret }} - - name: service-key-secret - mountPath: /var/secrets - {{- end }} - {{- end }} - args: - {{- if .Values.cloudAgent }} - - cloud-agent - {{- else }} - - agent - {{- end }} - {{- if .Values.kubecostMetrics.exporter.extraArgs }} - {{ toYaml .Values.kubecostMetrics.exporter.extraArgs | nindent 12 }} - {{- end }} - env: - - name: PROMETHEUS_SERVER_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: prometheus-server-endpoint - {{- if .Values.cloudAgent }} - - name: CLOUD_AGENT_KEY - value: {{ .Values.cloudAgentKey }} - - name: CLOUD_REPORTING_SERVER - value: {{ .Values.cloudReportingServer }} - {{- end }} - - name: CLOUD_PROVIDER_API_KEY - value: "AIzaSyDXQPG_MHUEy9neR7stolq6l0ujXmjJlvk" # The GCP Pricing API requires a key. - {{- if .Values.kubecostProductConfigs }} - {{- if .Values.kubecostProductConfigs.gcpSecretName }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/configs/key.json - {{- end }} - {{- end }} - - name: CONFIG_PATH - value: /var/configs/ - - name: KUBECOST_METRICS_PORT - value: {{ (quote .Values.kubecostMetrics.exporter.port) | default (quote 9005) }} - {{- if .Values.agent }} - - name: KUBECOST_CONFIG_BUCKET - value: /var/secrets/object-store.yaml - - name: EXPORT_CLUSTER_INFO_ENABLED - value: {{ (quote .Values.kubecostMetrics.exporter.exportClusterInfo) | default (quote true) }} - - name: EXPORT_CLUSTER_CACHE_ENABLED - value: {{ (quote .Values.kubecostMetrics.exporter.exportClusterCache) | default (quote true) }} - {{- end }} - - name: EMIT_POD_ANNOTATIONS_METRIC - value: {{ (quote .Values.kubecostMetrics.emitPodAnnotations) | default (quote false) }} - - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC - value: {{ (quote .Values.kubecostMetrics.emitNamespaceAnnotations) | default (quote false) }} - - name: EMIT_KSM_V1_METRICS - value: {{ (quote .Values.kubecostMetrics.emitKsmV1Metrics) | default (quote true) }} - - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default - value: {{ (quote .Values.kubecostMetrics.emitKsmV1MetricsOnly) | default (quote false) }} - - name: MAX_QUERY_CONCURRENCY - value: {{ (quote .Values.kubecostModel.maxQueryConcurrency) | default (quote 5) }} - {{- 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.prometheus.insecureSkipVerify }} - - name: INSECURE_SKIP_VERIFY - value: {{ (quote .Values.global.prometheus.insecureSkipVerify) }} - {{- end }} - {{- if .Values.cloudAgentClusterId }} - - name: CLUSTER_ID - value: {{ .Values.cloudAgentClusterId }} - {{- else 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.kubecostModel.promClusterIDLabel }} - - name: PROM_CLUSTER_ID_LABEL - value: {{ .Values.kubecostModel.promClusterIDLabel }} - {{- end }} - - name: PV_ENABLED - value: {{ (quote .Values.persistentVolume.enabled) | default (quote true) }} - - name: RELEASE_NAME - value: {{ .Release.Name }} - - name: KUBECOST_NAMESPACE - value: {{ .Release.Namespace }} - - name: POD_NAME - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: metadata.name - - name: KUBECOST_TOKEN - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: kubecost-token - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.kubecostMetrics.exporter.priorityClassName }} - priorityClassName: {{ .Values.kubecostMetrics.exporter.priorityClassName }} - {{- end }} - {{- with .Values.kubecostMetrics.exporter.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.kubecostMetrics.exporter.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.kubecostMetrics.exporter.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/kubecost-metrics-service-monitor-template.yaml b/helm/cost-analyzer/templates/kubecost-metrics-service-monitor-template.yaml deleted file mode 100644 index f858b77a..00000000 --- a/helm/cost-analyzer/templates/kubecost-metrics-service-monitor-template.yaml +++ /dev/null @@ -1,41 +0,0 @@ -{{- if .Values.kubecostMetrics }} -{{- if .Values.kubecostMetrics.exporter }} -{{- if .Values.kubecostMetrics.exporter.enabled }} -{{- if .Values.kubecostMetrics.exporter.serviceMonitor }} -{{- if .Values.kubecostMetrics.exporter.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "kubecost.kubeMetricsName" . }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if .Values.kubecostMetrics.exporter.serviceMonitor.additionalLabels }} - {{ toYaml .Values.kubecostMetrics.exporter.serviceMonitor.additionalLabels | nindent 4 }} - {{- end }} -spec: - endpoints: - - port: tcp-metrics - honorLabels: true - interval: 1m - scrapeTimeout: 10s - path: /metrics - scheme: http - {{- with .Values.kubecostMetrics.exporter.serviceMonitor.metricRelabelings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.kubecostMetrics.exporter.serviceMonitor.relabelings }} - relabelings: {{ toYaml . | nindent 8 }} - {{- end }} - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - selector: - matchLabels: - app: {{ include "kubecost.kubeMetricsName" . }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} - diff --git a/helm/cost-analyzer/templates/kubecost-metrics-service-template.yaml b/helm/cost-analyzer/templates/kubecost-metrics-service-template.yaml deleted file mode 100644 index 80ef198f..00000000 --- a/helm/cost-analyzer/templates/kubecost-metrics-service-template.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{- if .Values.kubecostMetrics }} -{{- if .Values.kubecostMetrics.exporter }} -{{- if .Values.kubecostMetrics.exporter.enabled }} -{{- $prometheusScrape := ternary .Values.kubecostMetrics.exporter.prometheusScrape true (kindIs "bool" .Values.kubecostMetrics.exporter.prometheusScrape) }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kubecost.kubeMetricsName" . }} - namespace: {{ .Release.Namespace }} - labels: - {{ unset (include "cost-analyzer.commonLabels" . | fromYaml) "app" | toYaml | nindent 4 }} - app: {{ template "kubecost.kubeMetricsName" . }} -{{- if (or .Values.kubecostMetrics.exporter.service.annotations $prometheusScrape) }} - annotations: -{{- if .Values.kubecostMetrics.exporter.service.annotations }} -{{ toYaml .Values.kubecostMetrics.exporter.service.annotations | indent 4 }} -{{- end }} -{{- if $prometheusScrape }} - prometheus.io/scrape: "true" - prometheus.io/port: {{ (quote .Values.kubecostMetrics.exporter.port) | default (quote 9005) }} -{{- end }} -{{- end }} -spec: - ports: - - name: tcp-metrics - port: {{ .Values.kubecostMetrics.exporter.port | default 9005 }} - protocol: TCP - targetPort: {{ .Values.kubecostMetrics.exporter.port | default 9005 }} - selector: - app: {{ template "kubecost.kubeMetricsName" . }} - type: ClusterIP -{{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/kubecost-oidc-secret-template.yaml b/helm/cost-analyzer/templates/kubecost-oidc-secret-template.yaml deleted file mode 100644 index 28c79e51..00000000 --- a/helm/cost-analyzer/templates/kubecost-oidc-secret-template.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if .Values.oidc }} -{{- if .Values.oidc.secretName }} -{{- if .Values.oidc.clientSecret }} -apiVersion: v1 -kind: Secret -type: Opaque -metadata: - name: {{ .Values.oidc.secretName }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -stringData: - clientSecret: {{ .Values.oidc.clientSecret }} -{{- end -}} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/kubecost-priority-class-template.yaml b/helm/cost-analyzer/templates/kubecost-priority-class-template.yaml deleted file mode 100644 index 41c4fd7a..00000000 --- a/helm/cost-analyzer/templates/kubecost-priority-class-template.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.priority }} -{{- if .Values.priority.enabled }} -{{- if eq (len .Values.priority.name) 0 }} -apiVersion: {{ include "cost-analyzer.priorityClass.apiVersion" . }} -kind: PriorityClass -metadata: - name: {{ template "cost-analyzer.fullname" . }}-priority - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -value: {{ .Values.priority.value | default "1000000" }} -globalDefault: false -description: "Priority class for scheduling the cost-analyzer pod" -{{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/mimir-proxy-configmap-template.yaml b/helm/cost-analyzer/templates/mimir-proxy-configmap-template.yaml deleted file mode 100644 index 08b93ee8..00000000 --- a/helm/cost-analyzer/templates/mimir-proxy-configmap-template.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if .Values.global.mimirProxy }} -{{- if .Values.global.mimirProxy.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "cost-analyzer.fullname" . }}-mimir-proxy - namespace: {{ .Release.Namespace }} -data: - default.conf: | - server { - listen {{ .Values.global.mimirProxy.port }}; - location / { - proxy_pass {{ .Values.global.mimirProxy.mimirEndpoint }}; - proxy_set_header X-Scope-OrgID "{{ .Values.global.mimirProxy.orgIdentifier }}"; - {{- if .Values.global.mimirProxy.basicAuth }} - proxy_set_header Authorization "Basic {{ (printf "%s:%s" .Values.global.mimirProxy.basicAuth.username .Values.global.mimirProxy.basicAuth.password) | b64enc }}"; - {{- end }} - } - } -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/mimir-proxy-deployment-template.yaml b/helm/cost-analyzer/templates/mimir-proxy-deployment-template.yaml deleted file mode 100644 index 5319dc9d..00000000 --- a/helm/cost-analyzer/templates/mimir-proxy-deployment-template.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- if .Values.global.mimirProxy }} -{{- if .Values.global.mimirProxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "cost-analyzer.fullname" . }}-mimir-proxy - namespace: {{ .Release.Namespace }} - labels: - app: mimir-proxy -spec: - replicas: 1 - selector: - matchLabels: - app: mimir-proxy - template: - metadata: - labels: - app: mimir-proxy - spec: - containers: - - name: {{ .Values.global.mimirProxy.name }} - image: {{ .Values.global.mimirProxy.image }} - ports: - - containerPort: {{ .Values.global.mimirProxy.port }} - protocol: TCP - resources: {} - imagePullPolicy: IfNotPresent - volumeMounts: - - mountPath: /etc/nginx/conf.d - name: default-conf - readOnly: true - volumes: - - name: default-conf - configMap: - name: {{ template "cost-analyzer.fullname" . }}-mimir-proxy - items: - - key: default.conf - path: default.conf -{{- end }} -{{- end }} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/mimir-proxy-service-template.yaml b/helm/cost-analyzer/templates/mimir-proxy-service-template.yaml deleted file mode 100644 index 5e46b62f..00000000 --- a/helm/cost-analyzer/templates/mimir-proxy-service-template.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if .Values.global.mimirProxy }} -{{- if .Values.global.mimirProxy.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "cost-analyzer.fullname" . }}-mimir-proxy - namespace: {{ .Release.Namespace }} -spec: - ports: - - name: mimir-proxy - protocol: TCP - port: {{ .Values.global.mimirProxy.port }} - targetPort: {{ .Values.global.mimirProxy.port }} - selector: - app: mimir-proxy - type: ClusterIP -{{- end }} -{{- end }} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/network-costs-psp.template.yaml b/helm/cost-analyzer/templates/network-costs-psp.template.yaml deleted file mode 100644 index 1dac8de0..00000000 --- a/helm/cost-analyzer/templates/network-costs-psp.template.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- if .Values.networkCosts }} -{{- if .Values.networkCosts.enabled }} -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -{{- if .Values.networkCosts.podSecurityPolicy }} -{{- if .Values.networkCosts.podSecurityPolicy.enabled }} -apiVersion: {{ include "cost-analyzer.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: {{ template "cost-analyzer.fullname" . }}-network-costs - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 6 }} -spec: - privileged: true - hostNetwork: true - allowedHostPaths: - {{- if .Values.networkCosts.hostProc }} - - pathPrefix: {{ default "/proc" .Values.networkCosts.hostProc.hostPath }} - readOnly: false - {{- else }} - - pathPrefix: /proc - readOnly: false - {{- end }} - hostPorts: - - min: 1 - max: 65535 - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - volumes: - - '*' -{{- end }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/network-costs-role.template.yaml b/helm/cost-analyzer/templates/network-costs-role.template.yaml deleted file mode 100644 index 4d6840e4..00000000 --- a/helm/cost-analyzer/templates/network-costs-role.template.yaml +++ /dev/null @@ -1,25 +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: {{ template "cost-analyzer.fullname" . }}-network-costs - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - annotations: -{{- if .Values.networkCosts.podSecurityPolicy.annotations }} -{{ toYaml .Values.networkCosts.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "cost-analyzer.fullname" . }}-network-costs -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/network-costs-rolebinding.template.yaml b/helm/cost-analyzer/templates/network-costs-rolebinding.template.yaml deleted file mode 100644 index 890f6720..00000000 --- a/helm/cost-analyzer/templates/network-costs-rolebinding.template.yaml +++ /dev/null @@ -1,23 +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: {{ template "cost-analyzer.fullname" . }}-network-costs - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 6 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "cost-analyzer.fullname" . }}-network-costs -subjects: -- kind: ServiceAccount - name: {{ template "cost-analyzer.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/network-costs-servicemonitor-template.yaml b/helm/cost-analyzer/templates/network-costs-servicemonitor-template.yaml deleted file mode 100644 index 3f952bdc..00000000 --- a/helm/cost-analyzer/templates/network-costs-servicemonitor-template.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if .Values.serviceMonitor.networkCosts.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "cost-analyzer.networkCostsName" . }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if .Values.serviceMonitor.networkCosts.additionalLabels }} - {{ toYaml .Values.serviceMonitor.networkCosts.additionalLabels | nindent 4 }} - {{- end }} -spec: - endpoints: - - port: metrics - honorLabels: true - interval: 1m - scrapeTimeout: {{ .Values.serviceMonitor.networkCosts.scrapeTimeout }} - path: /metrics - scheme: http - {{- with .Values.serviceMonitor.networkCosts.metricRelabelings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.serviceMonitor.networkCosts.relabelings }} - relabelings: {{ toYaml . | nindent 8 }} - {{- end }} - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - selector: - matchLabels: - app: {{ include "cost-analyzer.networkCostsName" . }} -{{- end }} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/query-service-cluster-role-binding-template.yaml b/helm/cost-analyzer/templates/query-service-cluster-role-binding-template.yaml deleted file mode 100644 index 76110e15..00000000 --- a/helm/cost-analyzer/templates/query-service-cluster-role-binding-template.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{- if and (not .Values.agent) (not .Values.cloudAgent) (.Values.kubecostDeployment) (.Values.kubecostDeployment.queryServiceReplicas) }} -{{- if gt (.Values.kubecostDeployment.queryServiceReplicas | toString | atoi) 0 }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "query-service.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "query-service.commonLabels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "query-service.serviceAccountName" . }} -subjects: - - kind: ServiceAccount - name: {{ template "query-service.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "query-service.serviceAccountName" . }} - labels: - {{ include "query-service.commonLabels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "query-service.serviceAccountName" . }} -subjects: - - kind: ServiceAccount - name: {{ template "query-service.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/query-service-cluster-role-template.yaml b/helm/cost-analyzer/templates/query-service-cluster-role-template.yaml deleted file mode 100644 index 274e50d4..00000000 --- a/helm/cost-analyzer/templates/query-service-cluster-role-template.yaml +++ /dev/null @@ -1,109 +0,0 @@ -{{- if and (not .Values.agent) (not .Values.cloudAgent) (.Values.kubecostDeployment) (.Values.kubecostDeployment.queryServiceReplicas) }} -{{- if gt (.Values.kubecostDeployment.queryServiceReplicas | toString | atoi) 0 }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - namespace: {{ .Release.Namespace }} - name: {{ template "query-service.serviceAccountName" . }} - labels: - {{ include "query-service.commonLabels" . | nindent 4 }} -rules: -- apiGroups: - - '' - resources: - - "pods/log" - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "query-service.serviceAccountName" . }} - labels: - {{ include "query-service.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 -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/query-service-deployment-template.yaml b/helm/cost-analyzer/templates/query-service-deployment-template.yaml deleted file mode 100644 index 0beb5ad8..00000000 --- a/helm/cost-analyzer/templates/query-service-deployment-template.yaml +++ /dev/null @@ -1,187 +0,0 @@ -{{- if and (not .Values.agent) (not .Values.cloudAgent) (.Values.kubecostDeployment) (.Values.kubecostDeployment.queryServiceReplicas) }} -{{- if gt (.Values.kubecostDeployment.queryServiceReplicas | toString | atoi) 0 }} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ template "query-service.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "query-service.commonLabels" . | nindent 4 }} -spec: - replicas: {{ .Values.kubecostDeployment.queryServiceReplicas }} - serviceName: "query-service" - selector: - matchLabels: - app.kubernetes.io/name: query-service - app.kubernetes.io/instance: {{ .Release.Name }} - app: query-service - volumeClaimTemplates: - - metadata: - name: database-storage - spec: - accessModes: [ "ReadWriteOnce" ] - storageClassName: {{ .Values.kubecostDeployment.queryService.storageClass }} - resources: - requests: - storage: {{ .Values.kubecostDeployment.queryService.databaseVolumeSize }} - - metadata: - name: persistent-configs - spec: - accessModes: [ "ReadWriteOnce" ] - storageClassName: {{ .Values.kubecostDeployment.queryService.storageClass }} - resources: - requests: - storage: {{ .Values.kubecostDeployment.queryService.configVolumeSize }} - template: - metadata: - labels: - app.kubernetes.io/name: query-service - app.kubernetes.io/instance: {{ .Release.Name }} - app: query-service - spec: - restartPolicy: Always - {{- if .Values.kubecostDeployment.queryService.securityContext }} - securityContext: - {{- toYaml .Values.kubecostDeployment.queryService.securityContext | nindent 8 }} - {{- else if .Values.global.securityContext }} - securityContext: - {{- toYaml .Values.global.securityContext | nindent 8 }} - {{- end }} - serviceAccountName: {{ template "query-service.serviceAccountName" . }} - volumes: - {{- $etlBackupBucketSecret := "" }} - {{- if .Values.kubecostModel.queryServiceConfigSecret }} - {{- $etlBackupBucketSecret = .Values.kubecostModel.queryServiceConfigSecret }} - {{- else if .Values.kubecostModel.federatedStorageConfigSecret }} - {{- $etlBackupBucketSecret = .Values.kubecostModel.federatedStorageConfigSecret }} - {{- else if .Values.kubecostModel.etlBucketConfigSecret }} - {{- $etlBackupBucketSecret = .Values.kubecostModel.etlBucketConfigSecret }} - {{- else if and .Values.global.thanos.enabled (ne (typeOf .Values.kubecostModel.etlBucketConfigSecret) "string") }} - {{- $etlBackupBucketSecret = .Values.thanos.storeSecretName }} - {{- end }} - {{- if $etlBackupBucketSecret }} - - name: etl-bucket-config - secret: - defaultMode: 420 - secretName: {{ $etlBackupBucketSecret }} - {{- end }} - {{- if .Values.kubecostDeployment.queryService.extraVolumes }} - {{- toYaml .Values.kubecostDeployment.queryService.extraVolumes | nindent 8 }} - {{- end }} - initContainers: - - name: config-db-perms-fix - image: busybox - command: ["sh", "-c", "/bin/chmod -R 777 /var/configs && /bin/chmod -R 777 /var/db"] - volumeMounts: - - name: persistent-configs - mountPath: /var/configs - - name: database-storage - mountPath: /var/db - securityContext: - runAsUser: 0 - containers: - - name: query-service - {{- if .Values.kubecostModel }} - {{- if .Values.kubecostModel.openSourceOnly }} - image: quay.io/kubecost1/kubecost-cost-model:{{ .Values.imageVersion }} - {{- else if .Values.kubecostModel.fullImageName }} - image: {{ .Values.kubecostModel.fullImageName }} - {{- else 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 }} - readinessProbe: - httpGet: - path: /healthz - port: 9003 - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - imagePullPolicy: Always - securityContext: - {{- if .Values.kubecostDeployment.queryService.containerSecurityContext }} - {{- toYaml .Values.kubecostDeployment.queryService.containerSecurityContext | nindent 12 -}} - {{- else if .Values.global.containerSecurityContext }} - {{- toYaml .Values.global.containerSecurityContext | nindent 12 -}} - {{- end }} - args: ["query-service"] - ports: - - name: tcp-model - containerPort: 9003 - protocol: TCP - resources: - {{- toYaml .Values.kubecostDeployment.queryService.resources | nindent 12 }} - volumeMounts: - - name: persistent-configs - mountPath: /var/configs - - name: etl-bucket-config - mountPath: /var/configs/etl - - name: database-storage - mountPath: /var/db - {{- if .Values.kubecostDeployment.queryService.extraVolumeMounts }} - {{- toYaml .Values.kubecostDeployment.queryService.extraVolumeMounts | nindent 12 }} - {{- end }} - env: - - name: CONFIG_PATH - value: /var/configs/ - - name: DB_PATH - value: /var/db/ - - name: ETL_FILE_STORE_ENABLED - value: "true" - {{- if $etlBackupBucketSecret }} - - name: ETL_BUCKET_CONFIG - {{- if not .Values.kubecostModel.federatedStorageConfigSecret}} - value: "/var/configs/etl/object-store.yaml" - {{- else }} - value: "/var/configs/etl/federated-store.yaml" - - name: CLUSTER_ID - value: "combined" - - name: FEDERATED_STORE_CONFIG - value: "/var/configs/etl/federated-store.yaml" - - name: FEDERATED_CLUSTER - value: "true" - - name: FEDERATED_PRIMARY_CLUSTER - value: "true" - - name: FEDERATED_REDIRECT_BACKUP - value: "true" - {{- end }} - {{- end }} - - name: ETL_PATH_PREFIX - value: "/var/db" - - name: CLOUD_PROVIDER_API_KEY - value: "AIzaSyDXQPG_MHUEy9neR7stolq6l0ujXmjJlvk" # The GCP Pricing API key.This GCP api key is expected to be here and is limited to accessing google's billing API.' - {{- if .Values.kubecostDeployment.queryService.extraEnv }} - {{- toYaml .Values.kubecostDeployment.queryService.extraEnv | nindent 12 }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.kubecostDeployment.queryService.priority }} - {{- if .Values.kubecostDeployment.queryService.priority.enabled }} - {{- if .Values.kubecostDeployment.queryService.priority.name }} - priorityClassName: {{ .Values.kubecostDeployment.queryService.priority.name }} - {{- else }} - priorityClassName: {{ template "cost-analyzer.fullname" . }}-qsr-priority - {{- end }} - {{- end }} - {{- end }} - {{- with .Values.kubecostDeployment.queryService.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.kubecostDeployment.queryService.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.kubecostDeployment.queryService.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - -{{- end }} -{{- end }} \ No newline at end of file diff --git a/helm/cost-analyzer/templates/query-service-service-account-template.yaml b/helm/cost-analyzer/templates/query-service-service-account-template.yaml deleted file mode 100755 index b03ed683..00000000 --- a/helm/cost-analyzer/templates/query-service-service-account-template.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and (not .Values.agent) (not .Values.cloudAgent) (.Values.kubecostDeployment) (.Values.kubecostDeployment.queryServiceReplicas) }} -{{- if gt (.Values.kubecostDeployment.queryServiceReplicas | toString | atoi) 0 }} -{{- if .Values.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "query-service.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} - labels: - {{ include "query-service.commonLabels" . | nindent 4 }} -{{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/templates/query-service-service-template.yaml b/helm/cost-analyzer/templates/query-service-service-template.yaml deleted file mode 100755 index 8df51570..00000000 --- a/helm/cost-analyzer/templates/query-service-service-template.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if and (not .Values.agent) (not .Values.cloudAgent) (.Values.kubecostDeployment) (.Values.kubecostDeployment.queryServiceReplicas) }} -{{- if gt (.Values.kubecostDeployment.queryServiceReplicas | toString | atoi) 0 }} -kind: Service -apiVersion: v1 -metadata: - name: {{ template "query-service.serviceName" . }} - namespace: {{ .Release.Namespace }} - labels: -{{ include "query-service.commonLabels" . | nindent 4 }} -spec: - selector: -{{ include "query-service.selectorLabels" . | nindent 4 }} - type: "ClusterIP" - ports: - - name: tcp-query-service - port: 9003 - targetPort: 9003 -{{- end }} -{{- end }} diff --git a/helm/cost-analyzer/values-agent.yaml b/helm/cost-analyzer/values-agent.yaml deleted file mode 100644 index da097271..00000000 --- a/helm/cost-analyzer/values-agent.yaml +++ /dev/null @@ -1,119 +0,0 @@ -# Kubecost running as an Agent is designed for external hosting. The current setup deploys a -# kubecost-agent pod, low data retention prometheus server + thanos sidecar, and node-exporter. -networkCosts: - enabled: false - # config: - # services: - # amazon-web-services: true - # google-cloud-services: true - # azure-cloud-services: true - - -global: - thanos: - enabled: false - grafana: - enabled: false - proxy: false -# Agent enables specific features designed to enhance the metrics exporter deployment -# with enhancements designed for external hosting. -agent: true -# agentKeySecretName: kubecost-agent-object-store -agentCsi: - enabled: false - secretProvider: - name: kubecost-agent-object-store-secretprovider - provider: - parameters: {} - secretObjects: {} - - -# No Grafana configuration is required. -grafana: - sidecar: - dashboards: - enabled: false - datasources: - defaultDatasourceEnabled: false - -# Exporter Pod -kubecostMetrics: - exporter: - enabled: true - exportClusterInfo: true - exportClusterCache: true - -# Prometheus defaults to low retention (10h), disables KSM, and attaches a thanos-sidecar -# for exporting metrics. -prometheus: - nodeExporter: - enabled: false - kube-state-metrics: - enabled: false - disabled: true - extraScrapeConfigs: | - - job_name: kubecost-agent - honor_labels: true - scrape_interval: 1m - scrape_timeout: 60s - metrics_path: /metrics - scheme: http - dns_sd_configs: - - names: - - kubecost-agent-agent - type: 'A' - port: 9005 - - 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: - extraArgs: - storage.tsdb.min-block-duration: 2h - storage.tsdb.max-block-duration: 2h - storage.tsdb.retention: 10h - securityContext: - runAsNonRoot: true - runAsUser: 1001 - extraSecretMounts: - - name: object-store-volume - mountPath: /etc/thanos/config - readOnly: true - secretName: kubecost-agent-object-store - enableAdminApi: true - sidecarContainers: - - name: thanos-sidecar - image: thanosio/thanos:v0.29.0 - securityContext: - runAsNonRoot: true - runAsUser: 1001 - args: - - sidecar - - --log.level=debug - - --tsdb.path=/data/ - - --prometheus.url=http://127.0.0.1:9090 - - --objstore.config-file=/etc/thanos/config/object-store.yaml - 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/thanos/config diff --git a/helm/cost-analyzer/values-amp.yaml b/helm/cost-analyzer/values-amp.yaml deleted file mode 100644 index 4242ba30..00000000 --- a/helm/cost-analyzer/values-amp.yaml +++ /dev/null @@ -1,20 +0,0 @@ -global: - amp: - enabled: true - prometheusServerEndpoint: http://localhost:8005/workspaces/$ - remoteWriteService: https://aps-workspaces.us-west-2.amazonaws.com/workspaces/$/api/v1/remote_write - sigv4: - region: us-west-2 - -sigV4Proxy: - region: us-west-2 - host: aps-workspaces.us-west-2.amazonaws.com - -kubecostProductConfigs: - clusterName: AWS-cluster-one - -prometheus: - server: - global: - external_labels: - cluster_id: AWS-cluster-one \ No newline at end of file diff --git a/helm/cost-analyzer/values-cloud-agent.yaml b/helm/cost-analyzer/values-cloud-agent.yaml deleted file mode 100644 index 99b596c5..00000000 --- a/helm/cost-analyzer/values-cloud-agent.yaml +++ /dev/null @@ -1,54 +0,0 @@ -# Kubecost running as an Agent is designed for external hosting. The current setup deploys a -# kubecost-agent pod and prometheus server -global: - thanos: - enabled: false - grafana: - enabled: false - proxy: false - -# Cloud Agent enables specific features designed to enhance the metrics exporter deployment -# with enhancements designed for Kubecost Cloud -cloudAgent: true -cloudAgentKey: "" - -# No Grafana configuration is required. -grafana: - sidecar: - dashboards: - enabled: false - datasources: - defaultDatasourceEnabled: false - -# Exporter Pod -kubecostMetrics: - exporter: - enabled: true - exportClusterInfo: false - exportClusterCache: false - -# Disable cost-analyzer PSP -podSecurityPolicy: - enabled: false - -# Disable KSM and NodeExporter (?) -prometheus: - podSecurityPolicy: - enabled: false - nodeExporter: - enabled: false - kube-state-metrics: - enabled: false - disabled: true - extraScrapeConfigs: | - - job_name: kubecost-cloud-agent - honor_labels: true - scrape_interval: 1m - scrape_timeout: 60s - metrics_path: /metrics - scheme: http - dns_sd_configs: - - names: - - {{ .Release.Name }}-cloud-agent - type: 'A' - port: 9005 diff --git a/helm/cost-analyzer/values-custom-pricing.yaml b/helm/cost-analyzer/values-custom-pricing.yaml deleted file mode 100644 index 82a0c554..00000000 --- a/helm/cost-analyzer/values-custom-pricing.yaml +++ /dev/null @@ -1,17 +0,0 @@ -pricingCsv: - enabled: true - location: - URI: /var/kubecost-csv/custom-pricing.csv # local configMap or s3://bucket/path/custom-pricing.csv - # provider: "AWS" - # region: "us-east-1" - # URI: s3://kc-csv-test/pricing_schema.csv # a valid file URI - # csvAccessCredentials: pricing-schema-access-secret - -# when using configmap: kubectl create configmap -n kubecost csv-pricing --from-file custom-pricing.csv -extraVolumes: -- name: kubecost-csv - configMap: - name: csv-pricing -extraVolumeMounts: -- name: kubecost-csv - mountPath: /var/kubecost-csv diff --git a/helm/cost-analyzer/values-eks-cost-monitoring.yaml b/helm/cost-analyzer/values-eks-cost-monitoring.yaml deleted file mode 100644 index d68b9567..00000000 --- a/helm/cost-analyzer/values-eks-cost-monitoring.yaml +++ /dev/null @@ -1,183 +0,0 @@ -global: - grafana: - enabled: false - proxy: false - -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 - -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 - -# Enable this flag if you need to install with specific image tags -# imageVersion: prod-1.97.0 - -kubecostFrontend: - image: public.ecr.aws/kubecost/frontend - imagePullPolicy: Always - resources: - requests: - cpu: "10m" - memory: "55Mi" - #limits: - # cpu: "100m" - # memory: "256Mi" - -kubecostModel: - image: public.ecr.aws/kubecost/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" - -serviceAccount: - create: true # Set this to false if you're bringing your own service account. - annotations: {} - # name: kc-test - -# Define persistence volume for cost-analyzer -persistentVolume: - size: 32Gi - 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 - -ingress: - enabled: false - # className: nginx - 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 - -service: - type: ClusterIP - port: 9090 - targetPort: 9090 - # nodePort: - labels: {} - annotations: {} - -prometheus: - 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 - image: - repository: public.ecr.aws/kubecost/prometheus - tag: v2.35.0 - 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)" - - configmapReload: - prometheus: - ## If false, the configmap-reload container will not be deployed - ## - enabled: false - - ## configmap-reload container name - ## - name: configmap-reload - ## configmap-reload container image - ## - image: - repository: public.ecr.aws/bitnami/configmap-reload - tag: 0.7.1 - 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: {} - - kube-state-metrics: - disabled: false - nodeExporter: - enabled: false - - -reporting: - productAnalytics: false diff --git a/helm/cost-analyzer/values-thanos.yaml b/helm/cost-analyzer/values-thanos.yaml deleted file mode 100644 index b48c53e7..00000000 --- a/helm/cost-analyzer/values-thanos.yaml +++ /dev/null @@ -1,147 +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 - securityContext: - runAsNonRoot: true - runAsUser: 1001 - 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.29.0 - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - capabilities: - drop: - - ALL - 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: 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" - - name: GODEBUG - value: "madvdontneed=1" - 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" - - name: GODEBUG - value: "madvdontneed=1" - - # Thanos Query Frontend - queryFrontend: - enabled: true - compressResponses: true - # Downstream Tripper Configuration - downstreamTripper: - enabled: true - idleConnectionTimeout: 90s - responseHeaderTimeout: 2m - tlsHandshakeTimeout: 10s - expectContinueTimeout: 1s - maxIdleConnections: 200 - maxIdleConnectionsPerHost: 100 - maxConnectionsPerHost: 0 - # 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 - extraEnv: - - name: GOGC - value: "100" - - name: GODEBUG - value: "madvdontneed=1" - resources: - requests: - memory: "1.5Gi" - - # Thanos Sidecar Service Discovery - # Disabling removes the prometheus sidecar from querier store discovery. This ensures - # that all clusters read from the same data in remote store. - 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/helm/cost-analyzer/values-windows-node-affinity.yaml b/helm/cost-analyzer/values-windows-node-affinity.yaml deleted file mode 100644 index 0cb10473..00000000 --- a/helm/cost-analyzer/values-windows-node-affinity.yaml +++ /dev/null @@ -1,50 +0,0 @@ -kubecostMetrics: - exporter: - nodeSelector: - kubernetes.io/os: linux - -nodeSelector: - kubernetes.io/os: linux - -networkCosts: - nodeSelector: - kubernetes.io/os: linux - -prometheus: - server: - nodeSelector: - kubernetes.io/os: linux - kube-state-metrics: - nodeSelector: - kubernetes.io/os: linux - nodeExporter: - enabled: true - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/os - operator: In - values: - - linux -grafana: - nodeSelector: - kubernetes.io/os: linux - -thanos: - store: - nodeSelector: - kubernetes.io/os: linux - queryFrontend: - nodeSelector: - kubernetes.io/os: linux - query: - nodeSelector: - kubernetes.io/os: linux - compact: - nodeSelector: - kubernetes.io/os: linux - bucket: - nodeSelector: - kubernetes.io/os: linux \ No newline at end of file diff --git a/helm/cost-analyzer/values.yaml b/helm/cost-analyzer/values.yaml deleted file mode 100644 index c98071df..00000000 --- a/helm/cost-analyzer/values.yaml +++ /dev/null @@ -1,1183 +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 -- Warning: Before changing this setting, please read to understand this setting https://docs.kubecost.com/install-and-configure/install/custom-prom - fqdn: http://cost-analyzer-prometheus-server.default.svc #example address of a prometheus to connect to. Include protocol (http:// or https://) 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: mcdbsecret # kubectl create secret generic mcdbsecret -n kubecost --from-file=TOKEN - - # Durable storage option, product key required - thanos: - enabled: false - # queryService: http://kubecost-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 synchronization 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 -# fqdn: cost-analyzer-grafana.default.svc - - # Enable only when you are using GCP Marketplace ENT listing. Learn more at https://console.cloud.google.com/marketplace/product/kubecost-public/kubecost-ent - gcpstore: - enabled: false - - # Google Cloud Managed Service for Prometheus - gmp: - # Remember to set up these parameters when install the Kubecost Helm chart with `global.gmp.enabled=true` if you want to use GMP self-deployed collection (Recommended) to utilize Kubecost scrape configs. - # If enabling GMP, it is highly recommended to utilize Google's distribution of Prometheus. - # Learn more at https://cloud.google.com/stackdriver/docs/managed-prometheus/setup-unmanaged - # --set prometheus.server.image.repository="gke.gcr.io/prometheus-engine/prometheus" \ - # --set prometheus.server.image.tag="v2.35.0-gmp.2-gke.0" - enabled: false # If true, kubecost will be configured to use GMP Prometheus image and query from Google Cloud Managed Service for Prometheus. - prometheusServerEndpoint: http://localhost:8085/ # The prometheus service endpoint used by kubecost. The calls are forwarded through the GMP Prom proxy side car to the GMP database. - gmpProxy: - enabled: false - image: gke.gcr.io/prometheus-engine/frontend:v0.4.1-gke.0 # GMP Prometheus proxy image that serve as an endpoint to query metrics from GMP - imagePullPolicy: Always - name: gmp-proxy - port: 8085 - projectId: YOUR_PROJECT_ID # example GCP project ID - - # Amazon Managed Service for Prometheus - amp: - enabled: false # If true, kubecost will be configured to remote_write and query from Amazon Managed Service for Prometheus. - prometheusServerEndpoint: https://localhost:8085// # The prometheus service endpoint used by kubecost. The calls are forwarded through the SigV4Proxy side car to the AMP workspace. - remoteWriteService: https://aps-workspaces.us-west-2.amazonaws.com/workspaces//api/v1/remote_write # The remote_write endpoint for the AMP workspace. - sigv4: - region: us-west-2 - # access_key: ACCESS_KEY # AWS Access key - # secret_key: SECRET_KEY # AWS Secret key - # role_arn: ROLE_ARN # AWS role arn - # profile: PROFILE # AWS profile - - # Mimir Proxy to help Kubecost to query metrics from multi-tenant Grafana Mimir. - # Set `global.mimirProxy.enabled=true` and `global.prometheus.enabled=false` to enable Mimir Proxy. - # You also need to set `global.prometheus.fqdn=http://kubecost-cost-analyzer-mimir-proxy.kubecost.svc:8085/prometheus` - # or `global.prometheus.fqdn=http://{{ template "cost-analyzer.fullname" . }}-mimir-proxy.{{ .Release.Namespace }}.svc:8085/prometheus' - # Learn more at https://grafana.com/docs/mimir/latest/operators-guide/secure/authentication-and-authorization/#without-an-authenticating-reverse-proxy - mimirProxy: - enabled: false - name: mimir-proxy - image: nginxinc/nginx-unprivileged - port: 8085 - mimirEndpoint: $mimir_endpoint #Your Mimir query endpoint. If your Mimir query endpoint is http://example.com/prometheus, replace $mimir_endpoint with http://example.com/ - orgIdentifier: $your_tenant_ID #Your Grafana Mimir tenant ID - # basicAuth: - # username: user - # password: pwd - - notifications: - # Kubecost alerting configuration - # Ref: http://docs.kubecost.com/alerts - # alertConfigs: - # frontendUrl: http://localhost:9090 # optional, used for linkbacks - # globalSlackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Slack alerts - # globalMsTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Microsoft Teams alerts - # globalAlertEmails: - # - recipient@example.com - # - additionalRecipient@example.com - # globalEmailSubject: Custom Subject - # Alerts generated by kubecost, about cluster data - # 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 - # # optional, used for alert-specific Slack and Microsoft Teams alerts - # slackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX - # msTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX - - # Daily cluster budget alert on cluster `cluster-one` - # - type: budget - # threshold: 200.8 # optional, required for budget alerts - # window: daily # or 1d - # aggregation: cluster - # filter: cluster-one # does not accept csv - - # 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 - - # Spend Change Alert - # - type: spendChange # change relative to moving avg - # relativeThreshold: 0.20 # Proportional change relative to baseline. Must be greater than -1 (can be negative) - # window: 1d # accepts ‘d’, ‘h’ - # baselineWindow: 30d # previous window, offset by window - # aggregation: namespace - # filter: kubecost, default # accepts csv - - # Health Score Alert - # - type: health # Alerts when health score changes by a threshold - # window: 10m - # threshold: 5 # Send Alert if health scores changes by 5 or more - - # Kubecost Health Diagnostic - # - type: diagnostic # Alerts when kubecost is unable to compute costs - ie: Prometheus unreachable - # window: 10m - - 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 - - # Set saved Cost Allocation report(s) accessible from /reports - # Ref: http://docs.kubecost.com/saved-reports - savedReports: - enabled: false # If true, overwrites report parameters set through UI - reports: - - title: "Example Saved Report 0" - window: "today" - aggregateBy: "namespace" - chartDisplay: "category" - idle: "separate" - rate: "cumulative" - accumulate: false # daily resolution - filters: - - property: "cluster" - value: "cluster-one,cluster*" # supports wildcard filtering and multiple comma separated values - - property: "namespace" - value: "kubecost" - - title: "Example Saved Report 1" - window: "month" - aggregateBy: "controllerKind" - chartDisplay: "category" - idle: "share" - rate: "monthly" - accumulate: false - filters: - - property: "label" - value: "app:cost*,environment:kube*" - - property: "namespace" - value: "kubecost" - - title: "Example Saved Report 2" - window: "2020-11-11T00:00:00Z,2020-12-09T23:59:59Z" - aggregateBy: "service" - chartDisplay: "category" - idle: "hide" - rate: "daily" - accumulate: true # entire window resolution - filters: [] # if no filters, specify empty array - - # Set saved Asset report(s) accessible from /reports - # Ref: http://docs.kubecost.com/saved-reports - assetReports: - enabled: false # If true, overwrites report parameters set through UI - reports: - - title: "Example Asset Report 0" - window: "today" - aggregateBy: "type" - accumulate: false # daily resolution - filters: - - property: "cluster" - value: "cluster-one" - - # Set saved Advanced report(s) accessible from /reports - # Ref: http://docs.kubecost.com/saved-reports - advancedReports: - enabled: false # If true, overwrites report parameters set through UI - reports: - - title: "Example Advanced Report 0" - window: "7d" - aggregateBy: "namespace" - filters: - - property: "cluster" - value: "cluster-one" - cloudBreakdown: "service" - cloudJoin: "label:kubernetes_namespace" - - # Set saved Cloud Cost report(s) accessible from /reports - # Ref: http://docs.kubecost.com/saved-reports - cloudCostReports: - enabled: false # If true, overwrites report parameters set through UI - reports: - - title: "Cloud Cost Report 0" - window: "today" - aggregateBy: "service" - accumulate: false # daily resolution - # filters: - # - property: "service" - # value: "service1" # corresponds to a value to filter cloud cost aggregate by service data on. - - podAnnotations: {} - # iam.amazonaws.com/role: role-arn - additionalLabels: {} - - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - fsGroup: 65534 - runAsGroup: 65534 - runAsUser: 65534 - containerSecurityContext: - allowPrivilegeEscalation: false - privileged: false - readOnlyRootFilesystem: true - capabilities: - drop: - - ALL - -# generated at http://kubecost.com/install, used for alerts tracking and free trials -kubecostToken: # "" - -# Advanced pipeline for custom prices, enterprise key required -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 integration for user management and RBAC, enterprise key required -# Ref: https://github.com/kubecost/docs/blob/main/user-management.md -saml: - 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 - authTimeout: 1440 # number of minutes the JWT will be valid - redirectURL: "https://dev-elu2z98r.auth0.com/v2/logout" # callback URL redirected to after logout - # 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 - # nameIDFormat: "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" If your SAML provider requires a specific nameid format - # isGLUUProvider: false # An additional URL parameter must be appended for GLUU providers - # encryptionCertSecret: "kubecost-saml-cert" # k8s secret where the x509 certificate used to encrypt an Okta saml response is stored - # decryptionKeySecret: "kubecost-sank-decryption-key" # k8s secret where the private key associated with the encryptionCertSecret is stored - 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" - - name: editor - enabled: true # if editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor. - assertionName: "http://schemas.auth0.com/userType" - assertionValues: - - "editor" - -oidc: - enabled: false - clientID: "" # application/client client_id parameter obtained from provider, used to make requests to server - clientSecret: "" # application/client client_secret parameter obtained from provider, used to make requests to server - secretName: "kubecost-oidc-secret" # k8s secret where clientsecret will be stored - authURL: "https://my.auth.server/authorize" # endpoint for login to auth server - loginRedirectURL: "http://my.kubecost.url/model/oidc/authorize" # Kubecost url configured in provider for redirect after authentication - discoveryURL: "https://my.auth.server/.well-known/openid-configuration" # url for OIDC endpoint discovery -# hostedDomain: "example.com" # optional, blocks access to the auth domain specified in the hd claim of the provider ID token - rbac: - enabled: false - groups: - - name: admin - enabled: false # if admin is disabled, all authenticated users will be able to make configuration changes to the kubecost frontend - claimName: "roles" # Kubecost matches this string against the JWT's payload key containing RBAC info (this value is unique across identity providers) - claimValues: # Kubecost matches these strings with the roles created in your identity provider - - "admin" - - "superusers" - - name: readonly - enabled: false # if readonly is disabled, all authenticated users will default to readonly - claimName: "roles" - claimValues: - - "readonly" - - name: editor - enabled: false # if editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor. - claimName: "roles" - claimValues: - - "editor" - -# Adds an httpProxy as an environment variable. systemProxy.enabled must be `true`to have any effect. -# Ref: https://www.oreilly.com/library/view/security-with-go/9781788627917/5ea6a02b-3d96-44b1-ad3c-6ab60fcbbe4f.xhtml -systemProxy: - enabled: false - httpProxyUrl: "" - httpsProxyUrl: "" - noProxy: "" - -# imagePullSecrets: -# - name: "image-pull-secret" - -kubecostFrontend: - image: "gcr.io/kubecost1/frontend" - imagePullPolicy: Always - # extraEnv: - # - name: NGINX_ENTRYPOINT_WORKER_PROCESSES_AUTOTUNE - # value: "1" - # securityContext: - # readOnlyRootFilesystem: true - resources: - requests: - cpu: "10m" - memory: "55Mi" - # limits: - # cpu: "100m" - # memory: "256Mi" - livenessProbe: - enabled: true - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - ipv6: - enabled: true # disable if the cluster does not support ipv6 - # allow customizing nginx-conf server block - # extraServerConfig: |- - # proxy_busy_buffers_size 512k; - # proxy_buffers 4 512k; - # proxy_buffer_size 256k; - # large_client_header_buffers 4 64k; - -# api: -# fqdn: kubecost-api.kubecost.svc.cluster.local:9001 -# model: -# fqdn: kubecost-model.kubecost.svc.cluster.local:9003 - -# Kubecost Metrics deploys a separate pod which will emit kubernetes specific metrics required -# by the cost-model. This pod is designed to remain active and decoupled from the cost-model itself. -# However, disabling this service/pod deployment will flag the cost-model to emit the metrics instead. -kubecostMetrics: - # emitPodAnnotations: false - # emitNamespaceAnnotations: false - # emitKsmV1Metrics: true # emit all KSM metrics in KSM v1. - # emitKsmV1MetricsOnly: false # emit only the KSM metrics missing from KSM v2. Advanced users only. - - # Optional - # The metrics exporter is a separate deployment and service (for prometheus scrape auto-discovery) - # which emits metrics cost-model relies on. Enabling this deployment also removes the KSM dependency - # from the cost-model. If the deployment is not enabled, the metrics will continue to be emitted from - # the cost-model. - exporter: - enabled: false - port: 9005 - # Adds the default Prometheus scrape annotations to the metrics exporter service. - # Set to false and use service.annotations (below) to set custom scrape annotations. - prometheusScrape: true - resources: {} - # requests: - # cpu: "200m" - # memory: "55Mi" - ## 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)" - affinity: {} - - service: - annotations: {} - - # Service Monitor for Kubecost Metrics - serviceMonitor: # the kubecost included prometheus uses scrapeConfigs and does not support service monitors. The following options assume an existing prometheus that supports serviceMonitors. - enabled: false - additionalLabels: {} - metricRelabelings: [] - relabelings: [] - ## PriorityClassName - ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass - priorityClassName: "" - additionalLabels: {} - nodeSelector: {} - extraArgs: [] - -sigV4Proxy: - image: public.ecr.aws/aws-observability/aws-sigv4-proxy:latest - imagePullPolicy: Always - name: aps - port: 8005 - region: us-west-2 # The AWS region - host: aps-workspaces.us-west-2.amazonaws.com # The hostname for AMP service. - # role_arn: arn:aws:iam:::role/role-name # The AWS IAM role to assume. - extraEnv: # Pass extra env variables to sigV4Proxy - # - name: AWS_ACCESS_KEY_ID - # value: - # - name: AWS_SECRET_ACCESS_KEY - # value: - -kubecostModel: - image: "gcr.io/kubecost1/cost-model" - imagePullPolicy: Always - # extraEnv: - # - name: SOME_VARIABLE - # value: "some_value" - # securityContext: - # readOnlyRootFilesystem: true - # Enables the emission of the kubecost_cloud_credit_total and - # kubecost_cloud_expense_total metrics - outOfClusterPromMetricsEnabled: false - # Build local cost allocation cache - warmCache: false - # Build local savings cache - warmSavingsCache: true - # Run allocation ETL pipelines - etl: true - # Enable the ETL filestore backing storage - etlFileStoreEnabled: true - # The total number of days the ETL pipelines will build - # Set to 0 to disable daily ETL (not recommended) - etlDailyStoreDurationDays: 91 - # The total number of hours the ETL pipelines will build - # Set to 0 to disable hourly ETL (not recommended) - etlHourlyStoreDurationHours: 49 - # The total number of weeks the ETL pipelines will build - # Set to 0 to disable weekly ETL (not recommended) - # The default is 53 to ensure at least a year of coverage (371 days) - etlWeeklyStoreDurationWeeks: 53 - # For deploying kubecost in a cluster that does not self-monitor - etlReadOnlyMode: false - - ## Feature to view your out-of-cluster costs and their k8s utilization - ## Ref: https://docs.kubecost.com/using-kubecost/navigating-the-kubecost-ui/cloud-costs-explorer - cloudCost: - enabled: true - labelList: - IsIncludeList: false - # format labels as comma separated string (ex. "label1,label2,label3") - labels: "" - topNItems: 1000 - - allocation: - # Enables or disables adding node labels to allocation data (i.e. workloads). - # Defaults to "true" and starts with a sensible includeList for basics like - # topology (e.g. zone, region) and instance type labels. - # nodeLabels: - # enabled: true - # includeList: "node.kubernetes.io/instance-type,topology.kubernetes.io/region,topology.kubernetes.io/zone" - - # Enables or disables the ContainerStats pipeline, used for quantile-based - # queries like for request sizing recommendations. - # ContainerStats provides support for quantile-based request right-sizing - # recommendations. - # - # It is disabled by default to avoid problems in extremely high-scale Thanos - # environments. If you would like to try quantile-based request-sizing - # recommendations, enable this! If you are in a high-scale environment, - # please monitor Kubecost logs, Thanos query logs, and Thanos load closely. - # We hope to make major improvements at scale here soon! - # - # containerStatsEnabled: false - - # max number of concurrent Prometheus queries - maxQueryConcurrency: 5 - resources: - requests: - cpu: "200m" - memory: "55Mi" - #limits: - # cpu: "800m" - # memory: "256Mi" - livenessProbe: - enabled: false - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - extraArgs: [] - -# Basic Kubecost ingress, more examples available at https://github.com/kubecost/docs/blob/main/ingress-examples.md -ingress: - enabled: false - # className: nginx - labels: - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - 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 - pathType: ImplementationSpecific - 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 - name: "" # Provide name of existing priority class only. If left blank, upstream chart will create one from default template. - # value: 1000000 - -# If true, enable creation of NetworkPolicy resources. -networkPolicy: - enabled: false - denyEgress: true # create a network policy that denies egress from kubecost - sameNamespace: true # Set to true if cost analyzer and prometheus are on the same namespace -# namespace: kubecost # Namespace where prometheus is installed - - # Cost-analyzer specific vars using the new template - costAnalyzer: - enabled: false # If true, create a network policy for cost-analyzer - annotations: {} # annotations to be added to the network policy - additionalLabels: {} # additional labels to be added to the network policy - # Examples rules: - # ingressRules: - # - selectors: # allow ingress from self on all ports - # - podSelector: - # matchLabels: - # app.kubernetes.io/name: cost-analyzer - # - selectors: # allow egress access to prometheus - # - namespaceSelector: - # matchLabels: - # name: prometheus - # podSelector: - # matchLabels: - # app: prometheus - # ports: - # - protocol: TCP - # port: 9090 - # egressRules: - # - selectors: # restrict egress to inside cluster - # - namespaceSelector: {} - -podSecurityPolicy: - enabled: false - -## @param extraVolumes A list of volumes to be added to the pod -## -extraVolumes: [] -## @param extraVolumeMounts A list of volume mounts to be added to the pod -## -extraVolumeMounts: [] - -# Define persistence volume for cost-analyzer, more information at https://github.com/kubecost/docs/blob/main/storage.md -persistentVolume: - size: 32Gi - 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 - labels: {} - annotations: {} - -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 - ## PriorityClassName - ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass - priorityClassName: "" - persistentVolume: - size: 200Gi - auth: - password: admin # change me - -prometheus: - podSecurityPolicy: - enabled: false - extraScrapeConfigs: | - - job_name: kubecost - honor_labels: true - scrape_interval: 1m - scrape_timeout: 60s - 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: 60s - 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 - # node-export must be disabled if there is an existing daemonset: https://guide.kubecost.com/hc/en-us/articles/4407601830679-Troubleshoot-Install#a-name-node-exporter-a-issue-failedscheduling-kubecost-prometheus-node-exporter - nodeExporter: - enabled: true - # kubecost emits pre-2.0 KSM metrics, KSM is enabled by default here for backwards compatibility, but can be disabled to save resources without concern to kubecost metrics - kubeStateMetrics: - enabled: true - kube-state-metrics: - disabled: false - 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{resource="memory", unit="byte"}|container_memory_working_set_bytes|kube_pod_container_resource_requests{resource="cpu", unit="core"}|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!=""}[5m])) - record: cluster:cpu_usage:rate5m - - expr: rate(container_cpu_usage_seconds_total{container!=""}[5m]) - record: cluster:cpu_usage_nosum:rate5m - - expr: avg(irate(container_cpu_usage_seconds_total{container!="POD", container!=""}[5m])) by (container,pod,namespace) - record: kubecost_container_cpu_usage_irate - - expr: sum(container_memory_working_set_bytes{container!="POD",container!=""}) by (container,pod,namespace) - record: kubecost_container_memory_working_set_bytes - - expr: sum(container_memory_working_set_bytes{container!="POD",container!=""}) - 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" - -## Module for measuring network costs -## Ref: https://github.com/kubecost/docs/blob/main/network-allocation.md -networkCosts: - enabled: false - podSecurityPolicy: - enabled: false - image: gcr.io/kubecost1/kubecost-network-costs:v0.16.7 - imagePullPolicy: Always - updateStrategy: - type: RollingUpdate - # For existing Prometheus Installs, annotates the Service which generates Endpoints for each of the network-costs pods. - # The Service is annotated with prometheus.io/scrape: "true" to automatically get picked up by the prometheus config. - # NOTE: Setting this option to true and leaving the above extraScrapeConfig "job_name: kubecost-networking" configured will cause the - # NOTE: pods to be scraped twice. - prometheusScrape: false - # 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 - # this daemonset can use significant resources on large clusters: https://guide.kubecost.com/hc/en-us/articles/4407595973527-Network-Traffic-Cost-Allocation - resources: - limits: # remove the limits by setting cpu: null - cpu: 500m # can be less, will depend on cluster size - # memory: it is not recommended to set a memory limit - requests: - cpu: 50m - memory: 20Mi - extraArgs: [] - 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 Addresses in "IANA IPv4 Special-Purpose Address Registry" - - "127.0.0.0/8" - # IPv4 Link Local Address Space - - "169.254.0.0/16" - # Private Address Ranges in RFC-1918 - - "10.0.0.0/8" # Remove this entry if using Multi-AZ Kubernetes - - "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: [] - - # Internet contains a list of address/range that will be - # classified as internet traffic. This is synonymous with traffic - # that cannot be classified within the cluster. - # NOTE: Internet classification filters are executed _after_ - # NOTE: direct-classification, but before in-zone, in-region, - # NOTE: and cross-region. - internet: [] - - # 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" - services: - # google-cloud-services: when set to true, enables labeling traffic metrics with google cloud - # service endpoints - google-cloud-services: false - # amazon-web-services: when set to true, enables labeling traffic metrics with amazon web service - # endpoints. - amazon-web-services: false - # azure-cloud-services: when set to true, enables labeling traffic metrics with azure cloud service - # endpoints - azure-cloud-services: false - # user defined services provide a way to define custom service endpoints which will label traffic metrics - # falling within the defined address range. - #services: - # - service: "test-service-1" - # ips: - # - "19.1.1.2" - # - service: "test-service-2" - # ips: - # - "15.128.15.2" - # - "20.0.0.0/8" - - ## 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)" - - affinity: {} - - service: - annotations: {} - labels: {} - - ## 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: {} - additionalLabels: {} - nodeSelector: {} - annotations: {} - healthCheckProbes: {} - # readinessProbe: - # tcpSocket: - # port: 3001 - # initialDelaySeconds: 5 - # periodSeconds: 10 - # failureThreshold: 5 - # livenessProbe: - # tcpSocket: - # port: 3001 - # initialDelaySeconds: 5 - # periodSeconds: 10 - # failureThreshold: 5 - additionalSecurityContext: {} - # readOnlyRootFilesystem: true - -## Kubecost Deployment Configuration -## Used for HA mode in Business & Enterprise tier -## -kubecostDeployment: - replicas: 1 - leaderFollower: - enabled: false - # deploymentStrategy: - # rollingUpdate: - # maxSurge: 1 - # maxUnavailable: 1 - # type: RollingUpdate - labels: {} - annotations: {} - - ## QueryServiceReplicas - ## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/query-service-replicas - ## - queryServiceReplicas: 0 - queryService: - securityContext: - fsGroup: 65534 - runAsGroup: 65534 - runAsUser: 65534 - runAsNonRoot: false - seccompProfile: - type: RuntimeDefault - containerSecurityContext: - allowPrivilegeEscalation: true - readOnlyRootFilesystem: false - capabilities: - drop: - - ALL - resources: - requests: - ## You can use the Kubecost savings report for 'Right-size your - ## container requests' to determine the recommended resource requests - ## once the pod has run for 24 hours. - cpu: 1000m - memory: 500Mi - ## default storage class - storageClass: "" - databaseVolumeSize: 100Gi - configVolumeSize: 1Gi - -# Kubecost Cluster Controller for Right Sizing and Cluster Turndown -clusterController: - enabled: false - image: gcr.io/kubecost1/cluster-controller:v0.11.0 - imagePullPolicy: Always - ## PriorityClassName - ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass - priorityClassName: "" - kubescaler: - # If true, will cause all (supported) workloads to be have their requests - # automatically right-sized on a regular basis. - defaultResizeAll: false -# fqdn: kubecost-cluster-controller.kubecost.svc.cluster.local:9731 - namespaceTurndown: - rbac: - enabled: true - -reporting: - # Kubecost bug report feature: Logs access/collection limited to .Release.Namespace - # Ref: http://docs.kubecost.com/bug-report - logCollection: true - # Basic frontend analytics - productAnalytics: true - - # Report Javascript errors - errorReporting: true - valuesReporting: true - # googleAnalyticsTag allows you to embed your Google Global Site Tag to track usage of Kubecost. - # googleAnalyticsTag is only included in our Enterprise offering. - # googleAnalyticsTag: G-XXXXXXXXX - -serviceMonitor: # the kubecost included prometheus uses scrapeConfigs and does not support service monitors. The following options assume an existing prometheus that supports serviceMonitors. - enabled: false - additionalLabels: {} - metricRelabelings: [] - relabelings: [] - networkCosts: - enabled: false - scrapeTimeout: 10s - additionalLabels: {} - metricRelabelings: [] - relabelings: [] - -prometheusRule: - enabled: false - additionalLabels: {} - -supportNFS: false -# initChownDataImage ensures all Kubecost filepath permissions on PV or local storage are set up correctly. -initChownDataImage: "busybox" # Supports a fully qualified Docker image, e.g. 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 - rbac: - # Manage the Grafana Pod Security Policy - pspEnabled: false - # datasources: - # datasources.yaml: - # apiVersion: 1 - # datasources: - # - name: prometheus-kubecost - # type: prometheus - # url: http://kubecost-prometheus-server.kubecost.svc.cluster.local - # access: proxy - # isDefault: false - # jsonData: - # httpMethod: POST - # prometheusType: Prometheus - # prometheusVersion: 2.35.0 - # timeInterval: 1m - sidecar: - dashboards: - enabled: true - # label that the configmaps with dashboards are marked with - label: grafana_dashboard - # set sidecar ERROR_THROTTLE_SLEEP env var from default 5s to 0s -> fixes https://github.com/kubecost/cost-analyzer-helm-chart/issues/877 - annotations: {} - error_throttle_sleep: 0 - datasources: - # dataSourceFilename: foo.yml # If you need to change the name of the datasource file - enabled: false - error_throttle_sleep: 0 -# 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: - serve_from_sub_path: true - 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 -awsstore: - useAwsStore: false - createServiceAccount: false - ## PriorityClassName - ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass - priorityClassName: "" - -federatedETL: - federatedCluster: false # whether this cluster should push data to the Federated store - primaryCluster: false # whether this cluster should load data from the combined section of the Federated store - useExistingS3Config: false # will attempt to use existing object-store.yaml configs for S3 backup/Thanos as config for the Federated store - redirectS3Backup: false # changes the dir of S3 backup to the Federated combined store, for using Thanos-federated data in the Federated ETL. Note S3 backup should be enabled separately for this. - useMultiClusterDB: false # set to true if you have a single federated PromQL DB with metrics from all monitored clusters but want to use federation for performance - federator: - enabled: false # enables the federator to run inside the costmodel container, federating the data in the Federated store - clusters: [] # optional. Whitelist of clusters by cluster id. If not set, the federator will attempt to federated all clusters pushing to the federated storage. - # primaryClusterID: "cluster_id" # optional. Used when reconciliation is expected to occur on the Primary. - # federationCutoffDate: "2022-10-18T00:00:00.000Z" # an RFC 3339-formatted string. All ETL files with windows that fall before this time are not processed by the Federator. If this is not set, the Federator will process all files regardless of date. - resources: {} # you can use the Kubecost savings report for 'Right-size your container requests' to determine the recommended resource requests once the pod has run for 24 hours. - # requests: - # cpu: 100m - # memory: 500Mi - -kubecostAdmissionController: - enabled: false - -# Enables or disables the Cost Event Audit pipeline, which tracks recent changes at cluster level -# and provides an estimated cost impact via the Kubecost Predict API. -# -# It is disabled by default to avoid problems in high-scale environments. -costEventsAudit: - enabled: false - - -#readonly: false # disable updates to kubecost from the frontend UI and via POST request - -# 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/main/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/main/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. Use quotes if setting "0.00" for any item. -# 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" -# athenaWorkgroup: "primary" # The default workgroup in AWS is 'primary' -# 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 or annotations 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/tags 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" -# owner_external_label: "kubernetes_label_owner" -# 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: "" # clusterName is the default context name in settings. -# clusterAccountID: "" # Manually set Account property for assets -# currencyCode: "USD" # official support for USD, AUD, BRL, CAD, CHF, CNY, DKK, EUR, GBP, INR, JPY, NOK, PLN, SEK -# 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 -# azureOfferDurableID: "MS-AZR-0003p" -# 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" -# sharedOverhead: "" # value representing a fixed external cost per month to be distributed among aggregations. -# shareTenancyCosts: true # enable or disable sharing costs such as cluster management fees (defaults to "true" on Settings page) -# metricsConfigs: # configuration for metrics emitted by Kubecost -# disabledMetrics: [] # list of metrics that Kubecost will not emit. Note that disabling metrics can lead to unexpected behavior in the cost-model. -# 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" }. If the secretname is specified, a configmap with the key will not be created -# mountPath: "/some/custom/path/productkey.json" # (use instead of secretname) declare the path at which the product key file is mounted (eg. by a secrets provisioner). The file must be of format { "key": "kc-b1325234" } -# cloudIntegrationSecret: "cloud-integration" -# ingestPodUID: false # Enables using UIDs to uniquely ID pods. This requires either Kubecost's replicated KSM metrics, or KSM v2.1.0+. This may impact performance, and changes the default cost-model allocation behavior. -# regionOverrides: "region1,region2,region3" # list of regions which will override default costmodel provider regions - -#kubecostAdmissionController: -# enabled: true -# secretName: webhook-server-tls -# caBundle: ${CA_BUNDLE} - -# -- Array of extra K8s manifests to deploy -## Note: Supports use of custom Helm templates -extraObjects: [] -# Cloud Billing Integration: -# - apiVersion: v1 -# kind: Secret -# metadata: -# name: cloud-integration -# namespace: kubecost -# type: Opaque -# data: -# cloud-integration.json: BASE64_SECRET -# Istio: -# - apiVersion: networking.istio.io/v1alpha3 -# kind: VirtualService -# metadata: -# name: my-virtualservice -# spec: -# hosts: -# - kubecost.myorg.com -# gateways: -# - my-gateway -# http: -# - route: -# - destination: -# host: kubecost.kubecost.svc.cluster.local -# port: -# number: 80 - - diff --git a/helm/thanos/Chart.lock b/helm/thanos/Chart.lock deleted file mode 100644 index 2d1b9610..00000000 --- a/helm/thanos/Chart.lock +++ /dev/null @@ -1,9 +0,0 @@ -dependencies: -- name: minio - repository: oci://registry-1.docker.io/bitnamicharts - version: 12.8.0 -- name: common - repository: oci://registry-1.docker.io/bitnamicharts - version: 2.9.0 -digest: sha256:77b4b171df7f02024eb21bd521b17963400097e3a6d2619989e3622cb9e44ee4 -generated: "2023-08-24T17:26:59.971986+09:00" diff --git a/helm/thanos/charts/common-2.9.0.tgz b/helm/thanos/charts/common-2.9.0.tgz deleted file mode 100644 index 30215995c42d687ee31a74ea9bb6707236a73788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12942 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 -- -- - -## License - -Copyright © 2023 VMware, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/helm/thanos/charts/common/templates/_affinities.tpl b/helm/thanos/charts/common/templates/_affinities.tpl deleted file mode 100644 index 0e571028..00000000 --- a/helm/thanos/charts/common/templates/_affinities.tpl +++ /dev/null @@ -1,111 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Return a soft nodeAffinity definition -{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.soft" -}} -preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} - weight: 1 -{{- end -}} - -{{/* -Return a hard nodeAffinity definition -{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.hard" -}} -requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} -{{- end -}} - -{{/* -Return a nodeAffinity definition -{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.nodes.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.nodes.hard" . -}} - {{- end -}} -{{- end -}} - -{{/* -Return a topologyKey definition -{{ include "common.affinities.topologyKey" (dict "topologyKey" "BAR") -}} -*/}} -{{- define "common.affinities.topologyKey" -}} -{{ .topologyKey | default "kubernetes.io/hostname" -}} -{{- end -}} - -{{/* -Return a soft podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "topologyKey" "BAR" "context" $) -}} -*/}} -{{- define "common.affinities.pods.soft" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} - weight: 1 -{{- end -}} - -{{/* -Return a hard podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "topologyKey" "BAR" "context" $) -}} -*/}} -{{- define "common.affinities.pods.hard" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} -{{- end -}} - -{{/* -Return a podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.pods" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.pods.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.pods.hard" . -}} - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/_capabilities.tpl b/helm/thanos/charts/common/templates/_capabilities.tpl deleted file mode 100644 index c6d115fe..00000000 --- a/helm/thanos/charts/common/templates/_capabilities.tpl +++ /dev/null @@ -1,185 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the target Kubernetes version -*/}} -{{- define "common.capabilities.kubeVersion" -}} -{{- if .Values.global }} - {{- if .Values.global.kubeVersion }} - {{- .Values.global.kubeVersion -}} - {{- else }} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} - {{- end -}} -{{- else }} -{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for poddisruptionbudget. -*/}} -{{- define "common.capabilities.policy.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "policy/v1beta1" -}} -{{- else -}} -{{- print "policy/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "common.capabilities.networkPolicy.apiVersion" -}} -{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for cronjob. -*/}} -{{- define "common.capabilities.cronjob.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "batch/v1beta1" -}} -{{- else -}} -{{- print "batch/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for daemonset. -*/}} -{{- define "common.capabilities.daemonset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "common.capabilities.deployment.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for statefulset. -*/}} -{{- define "common.capabilities.statefulset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apps/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "common.capabilities.ingress.apiVersion" -}} -{{- if .Values.ingress -}} -{{- if .Values.ingress.apiVersion -}} -{{- .Values.ingress.apiVersion -}} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for RBAC resources. -*/}} -{{- define "common.capabilities.rbac.apiVersion" -}} -{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "rbac.authorization.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "rbac.authorization.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for CRDs. -*/}} -{{- define "common.capabilities.crd.apiVersion" -}} -{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiextensions.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiextensions.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for APIService. -*/}} -{{- define "common.capabilities.apiService.apiVersion" -}} -{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiregistration.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiregistration.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Horizontal Pod Autoscaler. -*/}} -{{- define "common.capabilities.hpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Vertical Pod Autoscaler. -*/}} -{{- define "common.capabilities.vpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the used Helm version is 3.3+. -A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. -This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. -**To be removed when the catalog's minimun Helm version is 3.3** -*/}} -{{- define "common.capabilities.supportsHelmVersion" -}} -{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/_errors.tpl b/helm/thanos/charts/common/templates/_errors.tpl deleted file mode 100644 index 07ded6f6..00000000 --- a/helm/thanos/charts/common/templates/_errors.tpl +++ /dev/null @@ -1,28 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Through error when upgrading using empty passwords values that must not be empty. - -Usage: -{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} -{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} -{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} - -Required password params: - - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. - - context - Context - Required. Parent context. -*/}} -{{- define "common.errors.upgrade.passwords.empty" -}} - {{- $validationErrors := join "" .validationErrors -}} - {{- if and $validationErrors .context.Release.IsUpgrade -}} - {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} - {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} - {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} - {{- $errorString = print $errorString "\n%s" -}} - {{- printf $errorString $validationErrors | fail -}} - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/_images.tpl b/helm/thanos/charts/common/templates/_images.tpl deleted file mode 100644 index 2181f322..00000000 --- a/helm/thanos/charts/common/templates/_images.tpl +++ /dev/null @@ -1,85 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper image name -{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" .Values.global ) }} -*/}} -{{- define "common.images.image" -}} -{{- $registryName := .imageRoot.registry -}} -{{- $repositoryName := .imageRoot.repository -}} -{{- $separator := ":" -}} -{{- $termination := .imageRoot.tag | toString -}} -{{- if .global }} - {{- if .global.imageRegistry }} - {{- $registryName = .global.imageRegistry -}} - {{- end -}} -{{- end -}} -{{- if .imageRoot.digest }} - {{- $separator = "@" -}} - {{- $termination = .imageRoot.digest | toString -}} -{{- end -}} -{{- if $registryName }} - {{- printf "%s/%s%s%s" $registryName $repositoryName $separator $termination -}} -{{- else -}} - {{- printf "%s%s%s" $repositoryName $separator $termination -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) -{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} -*/}} -{{- define "common.images.pullSecrets" -}} - {{- $pullSecrets := list }} - - {{- if .global }} - {{- range .global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets | uniq }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names evaluating values as templates -{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} -*/}} -{{- define "common.images.renderPullSecrets" -}} - {{- $pullSecrets := list }} - {{- $context := .context }} - - {{- if $context.Values.global }} - {{- range $context.Values.global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets | uniq }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/_ingress.tpl b/helm/thanos/charts/common/templates/_ingress.tpl deleted file mode 100644 index efa5b85c..00000000 --- a/helm/thanos/charts/common/templates/_ingress.tpl +++ /dev/null @@ -1,73 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Generate backend entry that is compatible with all Kubernetes API versions. - -Usage: -{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} - -Params: - - serviceName - String. Name of an existing service backend - - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.ingress.backend" -}} -{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} -{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} -serviceName: {{ .serviceName }} -servicePort: {{ .servicePort }} -{{- else -}} -service: - name: {{ .serviceName }} - port: - {{- if typeIs "string" .servicePort }} - name: {{ .servicePort }} - {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} - number: {{ .servicePort | int }} - {{- end }} -{{- end -}} -{{- end -}} - -{{/* -Print "true" if the API pathType field is supported -Usage: -{{ include "common.ingress.supportsPathType" . }} -*/}} -{{- define "common.ingress.supportsPathType" -}} -{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the ingressClassname field is supported -Usage: -{{ include "common.ingress.supportsIngressClassname" . }} -*/}} -{{- define "common.ingress.supportsIngressClassname" -}} -{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if cert-manager required annotations for TLS signed -certificates are set in the Ingress annotations -Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations -Usage: -{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} -*/}} -{{- define "common.ingress.certManagerRequest" -}} -{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") (hasKey .annotations "kubernetes.io/tls-acme") }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/_labels.tpl b/helm/thanos/charts/common/templates/_labels.tpl deleted file mode 100644 index a1d7a95b..00000000 --- a/helm/thanos/charts/common/templates/_labels.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Kubernetes standard labels -*/}} -{{- define "common.labels.standard" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -helm.sh/chart: {{ include "common.names.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector -*/}} -{{- define "common.labels.matchLabels" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/_names.tpl b/helm/thanos/charts/common/templates/_names.tpl deleted file mode 100644 index a222924f..00000000 --- a/helm/thanos/charts/common/templates/_names.tpl +++ /dev/null @@ -1,71 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "common.names.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "common.names.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | 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 "common.names.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 default fully qualified dependency 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. -Usage: -{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} -*/}} -{{- define "common.names.dependency.fullname" -}} -{{- if .chartValues.fullnameOverride -}} -{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .chartName .chartValues.nameOverride -}} -{{- if contains $name .context.Release.Name -}} -{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts. -*/}} -{{- define "common.names.namespace" -}} -{{- default .Release.Namespace .Values.namespaceOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a fully qualified app name adding the installation's namespace. -*/}} -{{- define "common.names.fullname.namespace" -}} -{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/_secrets.tpl b/helm/thanos/charts/common/templates/_secrets.tpl deleted file mode 100644 index a193c46b..00000000 --- a/helm/thanos/charts/common/templates/_secrets.tpl +++ /dev/null @@ -1,172 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Generate secret name. - -Usage: -{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret - - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.secrets.name" -}} -{{- $name := (include "common.names.fullname" .context) -}} - -{{- if .defaultNameSuffix -}} -{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- with .existingSecret -}} -{{- if not (typeIs "string" .) -}} -{{- with .name -}} -{{- $name = . -}} -{{- end -}} -{{- else -}} -{{- $name = . -}} -{{- end -}} -{{- end -}} - -{{- printf "%s" $name -}} -{{- end -}} - -{{/* -Generate secret key. - -Usage: -{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret - - key - String - Required. Name of the key in the secret. -*/}} -{{- define "common.secrets.key" -}} -{{- $key := .key -}} - -{{- if .existingSecret -}} - {{- if not (typeIs "string" .existingSecret) -}} - {{- if .existingSecret.keyMapping -}} - {{- $key = index .existingSecret.keyMapping $.key -}} - {{- end -}} - {{- end }} -{{- end -}} - -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Generate secret password or retrieve one if already created. - -Usage: -{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - length - int - Optional - Length of the generated random password. - - strong - Boolean - Optional - Whether to add symbols to the generated random password. - - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. - - context - Context - Required - Parent context. - - failOnNew - Boolean - Optional - Default to true. If set to false, skip errors adding new keys to existing secrets. -The order in which this function returns a secret password: - 1. Already existing 'Secret' resource - (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) - 2. Password provided via the values.yaml - (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) - 3. Randomly generated secret password - (A new random secret password with the length specified in the 'length' parameter will be generated and returned) - -*/}} -{{- define "common.secrets.passwords.manage" -}} - -{{- $password := "" }} -{{- $subchart := "" }} -{{- $failOnNew := default true .failOnNew }} -{{- $chartName := default "" .chartName }} -{{- $passwordLength := default 10 .length }} -{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} -{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} -{{- $secretData := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret).data }} -{{- if $secretData }} - {{- if hasKey $secretData .key }} - {{- $password = index $secretData .key | quote }} - {{- else if $failOnNew }} - {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} - {{- end -}} -{{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString | b64enc | quote }} -{{- else }} - - {{- if .context.Values.enabled }} - {{- $subchart = $chartName }} - {{- end -}} - - {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} - {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} - {{- $passwordValidationErrors := list $requiredPasswordError -}} - {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} - - {{- if .strong }} - {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} - {{- $password = randAscii $passwordLength }} - {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} - {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} - {{- else }} - {{- $password = randAlphaNum $passwordLength | b64enc | quote }} - {{- end }} -{{- end -}} -{{- printf "%s" $password -}} -{{- end -}} - -{{/* -Reuses the value from an existing secret, otherwise sets its value to a default value. - -Usage: -{{ include "common.secrets.lookup" (dict "secret" "secret-name" "key" "keyName" "defaultValue" .Values.myValue "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - defaultValue - String - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - context - Context - Required - Parent context. - -*/}} -{{- define "common.secrets.lookup" -}} -{{- $value := "" -}} -{{- $secretData := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret).data -}} -{{- if and $secretData (hasKey $secretData .key) -}} - {{- $value = index $secretData .key -}} -{{- else if .defaultValue -}} - {{- $value = .defaultValue | toString | b64enc -}} -{{- end -}} -{{- if $value -}} -{{- printf "%s" $value -}} -{{- end -}} -{{- end -}} - -{{/* -Returns whether a previous generated secret already exists - -Usage: -{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.exists" -}} -{{- $secret := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret) }} -{{- if $secret }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/_storage.tpl b/helm/thanos/charts/common/templates/_storage.tpl deleted file mode 100644 index 16405a0f..00000000 --- a/helm/thanos/charts/common/templates/_storage.tpl +++ /dev/null @@ -1,28 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper Storage Class -{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} -*/}} -{{- define "common.storage.class" -}} - -{{- $storageClass := .persistence.storageClass -}} -{{- if .global -}} - {{- if .global.storageClass -}} - {{- $storageClass = .global.storageClass -}} - {{- end -}} -{{- end -}} - -{{- if $storageClass -}} - {{- if (eq "-" $storageClass) -}} - {{- printf "storageClassName: \"\"" -}} - {{- else }} - {{- printf "storageClassName: %s" $storageClass -}} - {{- end -}} -{{- end -}} - -{{- end -}} diff --git a/helm/thanos/charts/common/templates/_tplvalues.tpl b/helm/thanos/charts/common/templates/_tplvalues.tpl deleted file mode 100644 index dc15f7fd..00000000 --- a/helm/thanos/charts/common/templates/_tplvalues.tpl +++ /dev/null @@ -1,27 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Renders a value that contains template perhaps with scope if the scope is present. -Usage: -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ ) }} -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ "scope" $app ) }} -*/}} -{{- define "common.tplvalues.render" -}} -{{- if .scope }} - {{- if typeIs "string" .value }} - {{- tpl (cat "{{- with $.RelativeScope -}}" .value "{{- end }}") (merge (dict "RelativeScope" .scope) .context) }} - {{- else }} - {{- tpl (cat "{{- with $.RelativeScope -}}" (.value | toYaml) "{{- end }}") (merge (dict "RelativeScope" .scope) .context) }} - {{- end }} -{{- else }} - {{- if typeIs "string" .value }} - {{- tpl .value .context }} - {{- else }} - {{- tpl (.value | toYaml) .context }} - {{- end }} -{{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/_utils.tpl b/helm/thanos/charts/common/templates/_utils.tpl deleted file mode 100644 index c87040cd..00000000 --- a/helm/thanos/charts/common/templates/_utils.tpl +++ /dev/null @@ -1,67 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Print instructions to get a secret value. -Usage: -{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} -*/}} -{{- define "common.utils.secret.getvalue" -}} -{{- $varname := include "common.utils.fieldToEnvVar" . -}} -export {{ $varname }}=$(kubectl get secret --namespace {{ include "common.names.namespace" .context | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) -{{- end -}} - -{{/* -Build env var name given a field -Usage: -{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} -*/}} -{{- define "common.utils.fieldToEnvVar" -}} - {{- $fieldNameSplit := splitList "-" .field -}} - {{- $upperCaseFieldNameSplit := list -}} - - {{- range $fieldNameSplit -}} - {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} - {{- end -}} - - {{ join "_" $upperCaseFieldNameSplit }} -{{- end -}} - -{{/* -Gets a value from .Values given -Usage: -{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} -*/}} -{{- define "common.utils.getValueFromKey" -}} -{{- $splitKey := splitList "." .key -}} -{{- $value := "" -}} -{{- $latestObj := $.context.Values -}} -{{- range $splitKey -}} - {{- if not $latestObj -}} - {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} - {{- end -}} - {{- $value = ( index $latestObj . ) -}} - {{- $latestObj = $value -}} -{{- end -}} -{{- printf "%v" (default "" $value) -}} -{{- end -}} - -{{/* -Returns first .Values key with a defined value or first of the list if all non-defined -Usage: -{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} -*/}} -{{- define "common.utils.getKeyFromList" -}} -{{- $key := first .keys -}} -{{- $reverseKeys := reverse .keys }} -{{- range $reverseKeys }} - {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} - {{- if $value -}} - {{- $key = . }} - {{- end -}} -{{- end -}} -{{- printf "%s" $key -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/_warnings.tpl b/helm/thanos/charts/common/templates/_warnings.tpl deleted file mode 100644 index 66dffc1f..00000000 --- a/helm/thanos/charts/common/templates/_warnings.tpl +++ /dev/null @@ -1,19 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Warning about using rolling tag. -Usage: -{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} -*/}} -{{- define "common.warnings.rollingTag" -}} - -{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} -WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. -+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ -{{- end }} - -{{- end -}} diff --git a/helm/thanos/charts/common/templates/validations/_cassandra.tpl b/helm/thanos/charts/common/templates/validations/_cassandra.tpl deleted file mode 100644 index eda9aada..00000000 --- a/helm/thanos/charts/common/templates/validations/_cassandra.tpl +++ /dev/null @@ -1,77 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Cassandra required passwords are not empty. - -Usage: -{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.cassandra.passwords" -}} - {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} - {{- $enabled := include "common.cassandra.values.enabled" . -}} - {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} - {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.dbUser.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled cassandra. - -Usage: -{{ include "common.cassandra.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.cassandra.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.cassandra.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key dbUser - -Usage: -{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.key.dbUser" -}} - {{- if .subchart -}} - cassandra.dbUser - {{- else -}} - dbUser - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/validations/_mariadb.tpl b/helm/thanos/charts/common/templates/validations/_mariadb.tpl deleted file mode 100644 index 17d83a2f..00000000 --- a/helm/thanos/charts/common/templates/validations/_mariadb.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MariaDB required passwords are not empty. - -Usage: -{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mariadb.passwords" -}} - {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mariadb.values.enabled" . -}} - {{- $architecture := include "common.mariadb.values.architecture" . -}} - {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mariadb. - -Usage: -{{ include "common.mariadb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mariadb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mariadb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.key.auth" -}} - {{- if .subchart -}} - mariadb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/validations/_mongodb.tpl b/helm/thanos/charts/common/templates/validations/_mongodb.tpl deleted file mode 100644 index bbb445b8..00000000 --- a/helm/thanos/charts/common/templates/validations/_mongodb.tpl +++ /dev/null @@ -1,113 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MongoDB® required passwords are not empty. - -Usage: -{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mongodb.passwords" -}} - {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mongodb.values.enabled" . -}} - {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} - {{- $architecture := include "common.mongodb.values.architecture" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} - {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} - - {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} - {{- if and $valueUsername $valueDatabase -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replicaset") -}} - {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mongodb. - -Usage: -{{ include "common.mongodb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mongodb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mongodb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.key.auth" -}} - {{- if .subchart -}} - mongodb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/validations/_mysql.tpl b/helm/thanos/charts/common/templates/validations/_mysql.tpl deleted file mode 100644 index ca3953f8..00000000 --- a/helm/thanos/charts/common/templates/validations/_mysql.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MySQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mysql.passwords" -}} - {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mysql.values.enabled" . -}} - {{- $architecture := include "common.mysql.values.architecture" . -}} - {{- $authPrefix := include "common.mysql.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mysql. - -Usage: -{{ include "common.mysql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mysql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mysql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.key.auth" -}} - {{- if .subchart -}} - mysql.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/validations/_postgresql.tpl b/helm/thanos/charts/common/templates/validations/_postgresql.tpl deleted file mode 100644 index 8c9aa570..00000000 --- a/helm/thanos/charts/common/templates/validations/_postgresql.tpl +++ /dev/null @@ -1,134 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate PostgreSQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.postgresql.passwords" -}} - {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} - {{- $enabled := include "common.postgresql.values.enabled" . -}} - {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} - {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} - - {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} - {{- if (eq $enabledReplication "true") -}} - {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to decide whether evaluate global values. - -Usage: -{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} -Params: - - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" -*/}} -{{- define "common.postgresql.values.use.global" -}} - {{- if .context.Values.global -}} - {{- if .context.Values.global.postgresql -}} - {{- index .context.Values.global.postgresql .key | quote -}} - {{- end -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.existingSecret" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} - - {{- if .subchart -}} - {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} - {{- else -}} - {{- default (.context.Values.existingSecret | quote) $globalValue -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled postgresql. - -Usage: -{{ include "common.postgresql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key postgressPassword. - -Usage: -{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.postgressPassword" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} - - {{- if not $globalValue -}} - {{- if .subchart -}} - postgresql.postgresqlPassword - {{- else -}} - postgresqlPassword - {{- end -}} - {{- else -}} - global.postgresql.postgresqlPassword - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled.replication. - -Usage: -{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.enabled.replication" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.replication.enabled -}} - {{- else -}} - {{- printf "%v" .context.Values.replication.enabled -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key replication.password. - -Usage: -{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.replicationPassword" -}} - {{- if .subchart -}} - postgresql.replication.password - {{- else -}} - replication.password - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/validations/_redis.tpl b/helm/thanos/charts/common/templates/validations/_redis.tpl deleted file mode 100644 index fc0d208d..00000000 --- a/helm/thanos/charts/common/templates/validations/_redis.tpl +++ /dev/null @@ -1,81 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Redis® required passwords are not empty. - -Usage: -{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.redis.passwords" -}} - {{- $enabled := include "common.redis.values.enabled" . -}} - {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} - {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} - - {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} - {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} - - {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} - {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} - {{- if eq $useAuth "true" -}} - {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled redis. - -Usage: -{{ include "common.redis.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.redis.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.redis.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right prefix path for the values - -Usage: -{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.redis.values.keys.prefix" -}} - {{- if .subchart -}}redis.{{- else -}}{{- end -}} -{{- end -}} - -{{/* -Checks whether the redis chart's includes the standarizations (version >= 14) - -Usage: -{{ include "common.redis.values.standarized.version" (dict "context" $) }} -*/}} -{{- define "common.redis.values.standarized.version" -}} - - {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} - {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} - - {{- if $standarizedAuthValues -}} - {{- true -}} - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/templates/validations/_validations.tpl b/helm/thanos/charts/common/templates/validations/_validations.tpl deleted file mode 100644 index 31ceda87..00000000 --- a/helm/thanos/charts/common/templates/validations/_validations.tpl +++ /dev/null @@ -1,51 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate values must not be empty. - -Usage: -{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} -{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" -*/}} -{{- define "common.validations.values.multiple.empty" -}} - {{- range .required -}} - {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} - {{- end -}} -{{- end -}} - -{{/* -Validate a value must not be empty. - -Usage: -{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" - - subchart - String - Optional - Name of the subchart that the validated password is part of. -*/}} -{{- define "common.validations.values.single.empty" -}} - {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} - {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} - - {{- if not $value -}} - {{- $varname := "my-value" -}} - {{- $getCurrentValue := "" -}} - {{- if and .secret .field -}} - {{- $varname = include "common.utils.fieldToEnvVar" . -}} - {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} - {{- end -}} - {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/common/values.yaml b/helm/thanos/charts/common/values.yaml deleted file mode 100644 index 9abe0e15..00000000 --- a/helm/thanos/charts/common/values.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright VMware, Inc. -# SPDX-License-Identifier: APACHE-2.0 - -## bitnami/common -## It is required by CI/CD tools and processes. -## @skip exampleValue -## -exampleValue: common-chart diff --git a/helm/thanos/charts/minio-12.8.0.tgz b/helm/thanos/charts/minio-12.8.0.tgz deleted file mode 100644 index 225d5f0f5b5679fb4e9bf2c19e5ec8d3675f3636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46987 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%0DtxE?K{7$uk#mbYqv3+(=J#!S?lAr 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 V8PGcb0s;aIHiEjrhVX}k_#c~L^Wp#i diff --git a/helm/thanos/charts/minio/.helmignore b/helm/thanos/charts/minio/.helmignore deleted file mode 100644 index f0c13194..00000000 --- a/helm/thanos/charts/minio/.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/helm/thanos/charts/minio/Chart.lock b/helm/thanos/charts/minio/Chart.lock deleted file mode 100644 index 44dc0db2..00000000 --- a/helm/thanos/charts/minio/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: oci://registry-1.docker.io/bitnamicharts - version: 2.6.0 -digest: sha256:6ce7c85dcb43ad1fc5ff600850f28820ddc2f1a7c8cb25c5ff542fe1f852165a -generated: "2023-07-07T13:49:43.972268964Z" diff --git a/helm/thanos/charts/minio/Chart.yaml b/helm/thanos/charts/minio/Chart.yaml deleted file mode 100644 index c1944d1f..00000000 --- a/helm/thanos/charts/minio/Chart.yaml +++ /dev/null @@ -1,29 +0,0 @@ -annotations: - category: Infrastructure - licenses: Apache-2.0 -apiVersion: v2 -appVersion: 2023.7.18 -dependencies: -- name: common - repository: oci://registry-1.docker.io/bitnamicharts - tags: - - bitnami-common - version: 2.x.x -description: MinIO(R) is an object storage server, compatible with Amazon S3 cloud - storage service, mainly used for storing unstructured data (such as photos, videos, - log files, etc.). -home: https://bitnami.com -icon: https://bitnami.com/assets/stacks/minio/img/minio-stack-220x234.png -keywords: -- minio -- storage -- object-storage -- s3 -- cluster -maintainers: -- name: VMware, Inc. - url: https://github.com/bitnami/charts -name: minio -sources: -- https://github.com/bitnami/charts/tree/main/bitnami/minio -version: 12.6.10 diff --git a/helm/thanos/charts/minio/README.md b/helm/thanos/charts/minio/README.md deleted file mode 100644 index 7852222b..00000000 --- a/helm/thanos/charts/minio/README.md +++ /dev/null @@ -1,527 +0,0 @@ - - -# Bitnami Object Storage based on MinIO(R) - -MinIO(R) is an object storage server, compatible with Amazon S3 cloud storage service, mainly used for storing unstructured data (such as photos, videos, log files, etc.). - -[Overview of Bitnami Object Storage based on MinIO®](https://min.io/) - -Disclaimer: All software products, projects and company names are trademark(TM) or registered(R) trademarks of their respective holders, and use of them does not imply any affiliation or endorsement. This software is licensed to you subject to one or more open source licenses and VMware provides the software on an AS-IS basis. MinIO(R) is a registered trademark of the MinIO Inc. in the US and other countries. Bitnami is not affiliated, associated, authorized, endorsed by, or in any way officially connected with MinIO Inc. MinIO(R) is licensed under GNU AGPL v3.0. - -## TL;DR - -```console -helm install my-release oci://registry-1.docker.io/bitnamicharts/minio -``` - -## Introduction - -This chart bootstraps a [MinIO®](https://github.com/bitnami/containers/tree/main/bitnami/minio) deployment on a [Kubernetes](https://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - -Looking to use Bitnami Object Storage based on MinIOreg; in production? Try [VMware Application Catalog](https://bitnami.com/enterprise), the enterprise edition of Bitnami Application Catalog. - -## Prerequisites - -- Kubernetes 1.19+ -- Helm 3.2.0+ -- PV provisioner support in the underlying infrastructure - -## Installing the Chart - -To install the chart with the release name `my-release`: - -```console -helm install my-release oci://registry-1.docker.io/bitnamicharts/minio -``` - -These commands deploy MinIO® on the Kubernetes cluster in the default configuration. The [Parameters](#parameters) 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. - -## Parameters - -### Global parameters - -| Name | Description | Value | -| ------------------------- | ----------------------------------------------- | ----- | -| `global.imageRegistry` | Global Docker image registry | `""` | -| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]` | -| `global.storageClass` | Global StorageClass for Persistent Volume(s) | `""` | - -### Common parameters - -| Name | Description | Value | -| ------------------- | -------------------------------------------------------------------------------------------- | --------------- | -| `nameOverride` | String to partially override common.names.fullname template (will maintain the release name) | `""` | -| `fullnameOverride` | String to fully override common.names.fullname template | `""` | -| `commonLabels` | Labels to add to all deployed objects | `{}` | -| `commonAnnotations` | Annotations to add to all deployed objects | `{}` | -| `kubeVersion` | Force target Kubernetes version (using Helm capabilities if not set) | `""` | -| `clusterDomain` | Default Kubernetes cluster domain | `cluster.local` | -| `extraDeploy` | Array of extra objects to deploy with the release | `[]` | - -### MinIO® parameters - -| Name | Description | Value | -| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | -| `image.registry` | MinIO® image registry | `docker.io` | -| `image.repository` | MinIO® image repository | `bitnami/minio` | -| `image.tag` | MinIO® image tag (immutable tags are recommended) | `2023.7.18-debian-11-r0` | -| `image.digest` | MinIO® image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | -| `image.pullPolicy` | Image pull policy | `IfNotPresent` | -| `image.pullSecrets` | Specify docker-registry secret names as an array | `[]` | -| `image.debug` | Specify if debug logs should be enabled | `false` | -| `clientImage.registry` | MinIO® Client image registry | `docker.io` | -| `clientImage.repository` | MinIO® Client image repository | `bitnami/minio-client` | -| `clientImage.tag` | MinIO® Client image tag (immutable tags are recommended) | `2023.7.18-debian-11-r0` | -| `clientImage.digest` | MinIO® Client image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | -| `mode` | MinIO® server mode (`standalone` or `distributed`) | `standalone` | -| `auth.rootUser` | MinIO® root username | `admin` | -| `auth.rootPassword` | Password for MinIO® root user | `""` | -| `auth.existingSecret` | Use existing secret for credentials details (`auth.rootUser` and `auth.rootPassword` will be ignored and picked up from this secret). The secret has to contain the keys `root-user` and `root-password`) | `""` | -| `auth.forcePassword` | Force users to specify required passwords | `false` | -| `auth.useCredentialsFiles` | Mount credentials as a files instead of using an environment variable | `false` | -| `auth.forceNewKeys` | Force root credentials (user and password) to be reconfigured every time they change in the secrets | `false` | -| `defaultBuckets` | Comma, semi-colon or space separated list of buckets to create at initialization (only in standalone mode) | `""` | -| `disableWebUI` | Disable MinIO® Web UI | `false` | -| `tls.enabled` | Enable tls in front of the container | `false` | -| `tls.autoGenerated` | Generate automatically self-signed TLS certificates | `false` | -| `tls.existingSecret` | Name of an existing secret holding the certificate information | `""` | -| `tls.mountPath` | The mount path where the secret will be located | `""` | -| `extraEnvVars` | Extra environment variables to be set on MinIO® container | `[]` | -| `extraEnvVarsCM` | ConfigMap with extra environment variables | `""` | -| `extraEnvVarsSecret` | Secret with extra environment variables | `""` | -| `command` | Default container command (useful when using custom images). Use array form | `[]` | -| `args` | Default container args (useful when using custom images). Use array form | `[]` | - -### MinIO® deployment/statefulset parameters - -| Name | Description | Value | -| ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | -| `schedulerName` | Specifies the schedulerName, if it's nil uses kube-scheduler | `""` | -| `terminationGracePeriodSeconds` | In seconds, time the given to the MinIO pod needs to terminate gracefully | `""` | -| `deployment.updateStrategy.type` | Deployment strategy type | `Recreate` | -| `statefulset.updateStrategy.type` | StatefulSet strategy type | `RollingUpdate` | -| `statefulset.podManagementPolicy` | StatefulSet controller supports relax its ordering guarantees while preserving its uniqueness and identity guarantees. There are two valid pod management policies: OrderedReady and Parallel | `Parallel` | -| `statefulset.replicaCount` | Number of pods per zone (only for MinIO® distributed mode). Should be even and `>= 4` | `4` | -| `statefulset.zones` | Number of zones (only for MinIO® distributed mode) | `1` | -| `statefulset.drivesPerNode` | Number of drives attached to every node (only for MinIO® distributed mode) | `1` | -| `provisioning.enabled` | Enable MinIO® provisioning Job | `false` | -| `provisioning.schedulerName` | Name of the k8s scheduler (other than default) for MinIO® provisioning | `""` | -| `provisioning.podAnnotations` | Provisioning Pod annotations. | `{}` | -| `provisioning.command` | Default provisioning container command (useful when using custom images). Use array form | `[]` | -| `provisioning.args` | Default provisioning container args (useful when using custom images). Use array form | `[]` | -| `provisioning.extraCommands` | Optionally specify extra list of additional commands for MinIO® provisioning pod | `[]` | -| `provisioning.extraVolumes` | Optionally specify extra list of additional volumes for MinIO® provisioning pod | `[]` | -| `provisioning.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for MinIO® provisioning container | `[]` | -| `provisioning.resources.limits` | The resources limits for the container | `{}` | -| `provisioning.resources.requests` | The requested resources for the container | `{}` | -| `provisioning.policies` | MinIO® policies provisioning | `[]` | -| `provisioning.users` | MinIO® users provisioning. Can be used in addition to provisioning.usersExistingSecrets. | `[]` | -| `provisioning.usersExistingSecrets` | Array if existing secrets containing MinIO® users to be provisioned. Can be used in addition to provisioning.users. | `[]` | -| `provisioning.groups` | MinIO® groups provisioning | `[]` | -| `provisioning.buckets` | MinIO® buckets, versioning, lifecycle, quota and tags provisioning | `[]` | -| `provisioning.config` | MinIO® config provisioning | `[]` | -| `provisioning.podSecurityContext.enabled` | Enable pod Security Context | `true` | -| `provisioning.podSecurityContext.fsGroup` | Group ID for the container | `1001` | -| `provisioning.containerSecurityContext.enabled` | Enable container Security Context | `true` | -| `provisioning.containerSecurityContext.runAsUser` | User ID for the container | `1001` | -| `provisioning.containerSecurityContext.runAsNonRoot` | Avoid running as root User | `true` | -| `hostAliases` | MinIO® pod host aliases | `[]` | -| `containerPorts.api` | MinIO® container port to open for MinIO® API | `9000` | -| `containerPorts.console` | MinIO® container port to open for MinIO® Console | `9001` | -| `podSecurityContext.enabled` | Enable pod Security Context | `true` | -| `podSecurityContext.fsGroup` | Group ID for the container | `1001` | -| `containerSecurityContext.enabled` | Enable container Security Context | `true` | -| `containerSecurityContext.runAsUser` | User ID for the container | `1001` | -| `containerSecurityContext.runAsNonRoot` | Avoid running as root User | `true` | -| `podLabels` | Extra labels for MinIO® pods | `{}` | -| `podAnnotations` | Annotations for MinIO® pods | `{}` | -| `podAffinityPreset` | Pod affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard` | `""` | -| `podAntiAffinityPreset` | Pod anti-affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard` | `soft` | -| `nodeAffinityPreset.type` | Node affinity preset type. Ignored if `affinity` is set. Allowed values: `soft` or `hard` | `""` | -| `nodeAffinityPreset.key` | Node label key to match. Ignored if `affinity` is set. | `""` | -| `nodeAffinityPreset.values` | Node label values to match. Ignored if `affinity` is set. | `[]` | -| `affinity` | Affinity for pod assignment. Evaluated as a template. | `{}` | -| `nodeSelector` | Node labels for pod assignment. Evaluated as a template. | `{}` | -| `tolerations` | Tolerations for pod assignment. Evaluated as a template. | `[]` | -| `topologySpreadConstraints` | Topology Spread Constraints for MinIO® pods assignment spread across your cluster among failure-domains | `[]` | -| `priorityClassName` | MinIO® pods' priorityClassName | `""` | -| `resources.limits` | The resources limits for the MinIO® container | `{}` | -| `resources.requests` | The requested resources for the MinIO® container | `{}` | -| `livenessProbe.enabled` | Enable livenessProbe | `true` | -| `livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `5` | -| `livenessProbe.periodSeconds` | Period seconds for livenessProbe | `5` | -| `livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | -| `livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `5` | -| `livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | -| `readinessProbe.enabled` | Enable readinessProbe | `true` | -| `readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `5` | -| `readinessProbe.periodSeconds` | Period seconds for readinessProbe | `5` | -| `readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `1` | -| `readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `5` | -| `readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | -| `startupProbe.enabled` | Enable startupProbe | `false` | -| `startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `0` | -| `startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | -| `startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `5` | -| `startupProbe.failureThreshold` | Failure threshold for startupProbe | `60` | -| `startupProbe.successThreshold` | Success threshold for startupProbe | `1` | -| `customLivenessProbe` | Override default liveness probe | `{}` | -| `customReadinessProbe` | Override default readiness probe | `{}` | -| `customStartupProbe` | Override default startup probe | `{}` | -| `lifecycleHooks` | for the MinIO® container(s) to automate configuration before or after startup | `{}` | -| `extraVolumes` | Optionally specify extra list of additional volumes for MinIO® pods | `[]` | -| `extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for MinIO® container(s) | `[]` | -| `initContainers` | Add additional init containers to the MinIO® pods | `[]` | -| `sidecars` | Add additional sidecar containers to the MinIO® pods | `[]` | - -### Traffic exposure parameters - -| Name | Description | Value | -| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | -| `service.type` | MinIO® service type | `ClusterIP` | -| `service.ports.api` | MinIO® API service port | `9000` | -| `service.ports.console` | MinIO® Console service port | `9001` | -| `service.nodePorts.api` | Specify the MinIO® API nodePort value for the LoadBalancer and NodePort service types | `""` | -| `service.nodePorts.console` | Specify the MinIO® Console nodePort value for the LoadBalancer and NodePort service types | `""` | -| `service.clusterIP` | Service Cluster IP | `""` | -| `service.loadBalancerIP` | loadBalancerIP if service type is `LoadBalancer` (optional, cloud specific) | `""` | -| `service.loadBalancerSourceRanges` | Addresses that are allowed when service is LoadBalancer | `[]` | -| `service.externalTrafficPolicy` | Enable client source IP preservation | `Cluster` | -| `service.extraPorts` | Extra ports to expose in the service (normally used with the `sidecar` value) | `[]` | -| `service.annotations` | Annotations for MinIO® service | `{}` | -| `service.headless.annotations` | Annotations for the headless service. | `{}` | -| `ingress.enabled` | Enable ingress controller resource for MinIO Console | `false` | -| `ingress.apiVersion` | Force Ingress API version (automatically detected if not set) | `""` | -| `ingress.ingressClassName` | IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+) | `""` | -| `ingress.hostname` | Default host for the ingress resource | `minio.local` | -| `ingress.path` | The Path to MinIO®. You may need to set this to '/*' in order to use this with ALB ingress controllers. | `/` | -| `ingress.pathType` | Ingress path type | `ImplementationSpecific` | -| `ingress.servicePort` | Service port to be used | `minio-console` | -| `ingress.annotations` | Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations. | `{}` | -| `ingress.tls` | Enable TLS configuration for the hostname defined at `ingress.hostname` parameter | `false` | -| `ingress.selfSigned` | Create a TLS secret for this ingress record using self-signed certificates generated by Helm | `false` | -| `ingress.extraHosts` | The list of additional hostnames to be covered with this ingress record. | `[]` | -| `ingress.extraPaths` | Any additional paths that may need to be added to the ingress under the main host | `[]` | -| `ingress.extraTls` | The tls configuration for additional hostnames to be covered with this ingress record. | `[]` | -| `ingress.secrets` | If you're providing your own certificates, please use this to add the certificates as secrets | `[]` | -| `ingress.extraRules` | Additional rules to be covered with this ingress record | `[]` | -| `apiIngress.enabled` | Enable ingress controller resource for MinIO API | `false` | -| `apiIngress.apiVersion` | Force Ingress API version (automatically detected if not set) | `""` | -| `apiIngress.ingressClassName` | IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+) | `""` | -| `apiIngress.hostname` | Default host for the ingress resource | `minio.local` | -| `apiIngress.path` | The Path to MinIO®. You may need to set this to '/*' in order to use this with ALB ingress controllers. | `/` | -| `apiIngress.pathType` | Ingress path type | `ImplementationSpecific` | -| `apiIngress.servicePort` | Service port to be used | `minio-api` | -| `apiIngress.annotations` | Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations. | `{}` | -| `apiIngress.tls` | Enable TLS configuration for the hostname defined at `apiIngress.hostname` parameter | `false` | -| `apiIngress.selfSigned` | Create a TLS secret for this ingress record using self-signed certificates generated by Helm | `false` | -| `apiIngress.extraHosts` | The list of additional hostnames to be covered with this ingress record. | `[]` | -| `apiIngress.extraPaths` | Any additional paths that may need to be added to the ingress under the main host | `[]` | -| `apiIngress.extraTls` | The tls configuration for additional hostnames to be covered with this ingress record. | `[]` | -| `apiIngress.secrets` | If you're providing your own certificates, please use this to add the certificates as secrets | `[]` | -| `apiIngress.extraRules` | Additional rules to be covered with this ingress record | `[]` | -| `networkPolicy.enabled` | Enable the default NetworkPolicy policy | `false` | -| `networkPolicy.allowExternal` | Don't require client label for connections | `true` | -| `networkPolicy.extraFromClauses` | Allows to add extra 'from' clauses to the NetworkPolicy | `[]` | - -### Persistence parameters - -| Name | Description | Value | -| --------------------------- | -------------------------------------------------------------------- | ------------------- | -| `persistence.enabled` | Enable MinIO® data persistence using PVC. If false, use emptyDir | `true` | -| `persistence.storageClass` | PVC Storage Class for MinIO® data volume | `""` | -| `persistence.mountPath` | Data volume mount path | `/data` | -| `persistence.accessModes` | PVC Access Modes for MinIO® data volume | `["ReadWriteOnce"]` | -| `persistence.size` | PVC Storage Request for MinIO® data volume | `8Gi` | -| `persistence.annotations` | Annotations for the PVC | `{}` | -| `persistence.existingClaim` | Name of an existing PVC to use (only in `standalone` mode) | `""` | - -### Volume Permissions parameters - -| Name | Description | Value | -| ------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------- | ------------------ | -| `volumePermissions.enabled` | Enable init container that changes the owner and group of the persistent volume(s) mountpoint to `runAsUser:fsGroup` | `false` | -| `volumePermissions.image.registry` | Init container volume-permissions image registry | `docker.io` | -| `volumePermissions.image.repository` | Init container volume-permissions image repository | `bitnami/os-shell` | -| `volumePermissions.image.tag` | Init container volume-permissions image tag (immutable tags are recommended) | `11-debian-11-r11` | -| `volumePermissions.image.digest` | Init container volume-permissions image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | -| `volumePermissions.image.pullPolicy` | Init container volume-permissions image pull policy | `IfNotPresent` | -| `volumePermissions.image.pullSecrets` | Specify docker-registry secret names as an array | `[]` | -| `volumePermissions.resources.limits` | Init container volume-permissions resource limits | `{}` | -| `volumePermissions.resources.requests` | Init container volume-permissions resource requests | `{}` | -| `volumePermissions.containerSecurityContext.runAsUser` | User ID for the init container | `0` | - -### RBAC parameters - -| Name | Description | Value | -| --------------------------------------------- | ----------------------------------------------------------- | ------ | -| `serviceAccount.create` | Enable the creation of a ServiceAccount for MinIO® pods | `true` | -| `serviceAccount.name` | Name of the created ServiceAccount | `""` | -| `serviceAccount.automountServiceAccountToken` | Enable/disable auto mounting of the service account token | `true` | -| `serviceAccount.annotations` | Custom annotations for MinIO® ServiceAccount | `{}` | - -### Other parameters - -| Name | Description | Value | -| -------------------- | --------------------------------------------------------------------------------- | ------- | -| `pdb.create` | Enable/disable a Pod Disruption Budget creation | `false` | -| `pdb.minAvailable` | Minimum number/percentage of pods that must still be available after the eviction | `1` | -| `pdb.maxUnavailable` | Maximum number/percentage of pods that may be made unavailable after the eviction | `""` | - -### Metrics parameters - -| Name | Description | Value | -| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | --------------------------- | -| `metrics.prometheusAuthType` | Authentication mode for Prometheus (`jwt` or `public`) | `public` | -| `metrics.serviceMonitor.enabled` | If the operator is installed in your cluster, set to true to create a Service Monitor Entry | `false` | -| `metrics.serviceMonitor.namespace` | Namespace which Prometheus is running in | `""` | -| `metrics.serviceMonitor.labels` | Extra labels for the ServiceMonitor | `{}` | -| `metrics.serviceMonitor.jobLabel` | The name of the label on the target service to use as the job name in Prometheus | `""` | -| `metrics.serviceMonitor.path` | HTTP path to scrape for metrics | `/minio/v2/metrics/cluster` | -| `metrics.serviceMonitor.interval` | Interval at which metrics should be scraped | `30s` | -| `metrics.serviceMonitor.scrapeTimeout` | Specify the timeout after which the scrape is ended | `""` | -| `metrics.serviceMonitor.metricRelabelings` | MetricRelabelConfigs to apply to samples before ingestion | `[]` | -| `metrics.serviceMonitor.relabelings` | Metrics relabelings to add to the scrape endpoint, applied before scraping | `[]` | -| `metrics.serviceMonitor.honorLabels` | Specify honorLabels parameter to add the scrape endpoint | `false` | -| `metrics.serviceMonitor.selector` | Prometheus instance selector labels | `{}` | -| `metrics.serviceMonitor.apiVersion` | ApiVersion for the serviceMonitor Resource (defaults to "monitoring.coreos.com/v1") | `""` | -| `metrics.prometheusRule.enabled` | Create a Prometheus Operator PrometheusRule (also requires `metrics.enabled` to be `true` and `metrics.prometheusRule.rules`) | `false` | -| `metrics.prometheusRule.namespace` | Namespace for the PrometheusRule Resource (defaults to the Release Namespace) | `""` | -| `metrics.prometheusRule.additionalLabels` | Additional labels that can be used so PrometheusRule will be discovered by Prometheus | `{}` | -| `metrics.prometheusRule.rules` | Prometheus Rule definitions | `[]` | - -Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, - -```console -helm install my-release \ - --set auth.rootUser=minio-admin \ - --set auth.rootPassword=minio-secret-password \ - oci://registry-1.docker.io/bitnamicharts/minio -``` - -The above command sets the MinIO® Server root user and password to `minio-admin` and `minio-secret-password`, respectively. - -Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example, - -```console -helm install my-release -f values.yaml oci://registry-1.docker.io/bitnamicharts/minio -``` - -> **Tip**: You can use the default [values.yaml](values.yaml) - -## Configuration and installation details - -### [Rolling VS Immutable tags](https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/) - -It is strongly recommended to use immutable tags in a production environment. This ensures your deployment does not change automatically if the same tag is updated with a different image. - -Bitnami will release a new chart updating its containers if a new version of the main container, significant changes, or critical vulnerabilities exist. - -### Distributed mode - -By default, this chart provisions a MinIO® server in standalone mode. You can start MinIO® server in [distributed mode](https://docs.minio.io/docs/distributed-minio-quickstart-guide) with the following parameter: `mode=distributed` - -This chart bootstrap MinIO® server in distributed mode with 4 nodes by default. You can change the number of nodes using the `statefulset.replicaCount` parameter. For instance, you can deploy the chart with 8 nodes using the following parameters: - -```console -mode=distributed -statefulset.replicaCount=8 -``` - -You can also bootstrap MinIO® server in distributed mode in several zones, and using multiple drives per node. For instance, you can deploy the chart with 2 nodes per zone on 2 zones, using 2 drives per node: - -```console -mode=distributed -statefulset.replicaCount=2 -statefulset.zones=2 -statefulset.drivesPerNode=2 -``` - -> Note: The total number of drives should be greater than 4 to guarantee erasure coding. Please set a combination of nodes, and drives per node that match this condition. - -### Prometheus exporter - -MinIO® exports Prometheus metrics at `/minio/v2/metrics/cluster`. To allow Prometheus collecting your MinIO® metrics, modify the `values.yaml` adding the corresponding annotations: - -```diff -- podAnnotations: {} -+ podAnnotations: -+ prometheus.io/scrape: "true" -+ prometheus.io/path: "/minio/v2/metrics/cluster" -+ prometheus.io/port: "9000" -``` - -> Find more information about MinIO® metrics at - -## Persistence - -The [Bitnami Object Storage based on MinIO(®)](https://github.com/bitnami/containers/tree/main/bitnami/minio) image stores data at the `/data` path of the container. - -The chart mounts a [Persistent Volume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) at this location. The volume is created using dynamic volume provisioning. - -### Adjust permissions of persistent volume mountpoint - -As the image run as non-root by default, it is necessary to adjust the ownership of the persistent volume so that the container can write data into it. - -By default, the chart is configured to use Kubernetes Security Context to automatically change the ownership of the volume. However, this feature does not work in all Kubernetes distributions. -As an alternative, this chart supports using an initContainer to change the ownership of the volume before mounting it in the final destination. - -You can enable this initContainer by setting `volumePermissions.enabled` to `true`. - -### Ingress - -This chart provides support for Ingress resources. If you have an ingress controller installed on your cluster, such as [nginx-ingress-controller](https://github.com/bitnami/charts/tree/main/bitnami/nginx-ingress-controller) or [contour](https://github.com/bitnami/charts/tree/main/bitnami/contour) you can utilize the ingress controller to serve your application. - -To enable Ingress integration, set `ingress.enabled` to `true`. The `ingress.hostname` property can be used to set the host name. The `ingress.tls` parameter can be used to add the TLS configuration for this host. It is also possible to have more than one host, with a separate TLS configuration for each host. [Learn more about configuring and using Ingress](https://docs.bitnami.com/kubernetes/infrastructure/minio/configuration/configure-ingress/). - -### TLS secrets - -The chart also facilitates the creation of TLS secrets for use with the Ingress controller, with different options for certificate management. [Learn more about TLS secrets](https://docs.bitnami.com/kubernetes/infrastructure/minio/administration/enable-tls-ingress/). - -### Adding extra environment variables - -In case you want to add extra environment variables (useful for advanced operations like custom init scripts), you can use the `extraEnvVars` property. - -```yaml -extraEnvVars: - - name: MINIO_LOG_LEVEL - value: DEBUG -``` - -Alternatively, you can use a ConfigMap or a Secret with the environment variables. To do so, use the `extraEnvVarsCM` or the `extraEnvVarsSecret` values. - -### Sidecars and Init Containers - -If you have a need for additional containers to run within the same pod as the MinIO® app (e.g. an additional metrics or logging exporter), you can do so via the `sidecars` config parameter. Simply define your container according to the Kubernetes container spec. - -```yaml -sidecars: - - name: your-image-name - image: your-image - imagePullPolicy: Always - ports: - - name: portname - containerPort: 1234 -``` - -Similarly, you can add extra init containers using the `initContainers` parameter. - -```yaml -initContainers: - - name: your-image-name - image: your-image - imagePullPolicy: Always - ports: - - name: portname - containerPort: 1234 -``` - -### Setting Pod's affinity - -This chart allows you to set your custom affinity using the `affinity` parameter. Find more information about Pod's affinity in the [kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity). - -As an alternative, you can use of the preset configurations for pod affinity, pod anti-affinity, and node affinity available at the [bitnami/common](https://github.com/bitnami/charts/tree/main/bitnami/common#affinities) chart. To do so, set the `podAffinityPreset`, `podAntiAffinityPreset`, or `nodeAffinityPreset` parameters. - -### Deploying extra resources - -There are cases where you may want to deploy extra objects, such a ConfigMap containing your app's configuration or some extra deployment with a micro service used by your app. For covering this case, the chart allows adding the full specification of other objects using the `extraDeploy` parameter. - -## Troubleshooting - -Find more information about how to deal with common errors related to Bitnami's Helm charts in [this troubleshooting guide](https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues). - -## Upgrading - -### To 12.0.0 - -This version updates MinIO® to major version 2023. All gateway features have been removed from Minio since upstream completely dropped this feature. The related options have been removed in version 12.1.0. - -### To 11.0.0 - -This version deprecates the usage of `MINIO_ACCESS_KEY` and `MINIO_SECRET_KEY` environment variables in MINIO® container in favor of `MINIO_ROOT_USER` and `MINIO_ROOT_PASSWORD`. - -If you were already using the new variables, no issues are expected during upgrade. - -### To 9.0.0 - -This version updates MinIO® authentication parameters so they're aligned with the [current terminology](https://docs.min.io/minio/baremetal/security/minio-identity-management/user-management.html#minio-users-root). As a result the following parameters have been affected: - -- `accessKey.password` has been renamed to `auth.rootUser`. -- `secretKey.password` has been renamed to `auth.rootPassword`. -- `accessKey.forcePassword` and `secretKey.forcePassword` have been unified into `auth.forcePassword`. -- `existingSecret`, `useCredentialsFile` and `forceNewKeys` have been renamed to `auth.existingSecret`, `auth.useCredentialsFiles` and `forceNewKeys`, respectively. - -### To 8.0.0 - -This version updates MinIO® after some major changes, affecting its Web UI. MinIO® has replaced its MinIO® Browser with the MinIO® Console, and Web UI has been moved to a separated port. As a result the following variables have been affected: - -- `service.port` has been slit into `service.ports.api` (default: 9000) and `service.ports.console` (default: 9001). -- `containerPort` has been slit into `containerPorts.api` (default: 9000) and `containerPort.console` (default: 9001). -- `service.nodePort`has been slit into `service.nodePorts.api` and `service.nodePorts.console`. -- Service port `minio` has been replaced with `minio-api` and `minio-console` with target ports minio-api and minio-console respectively. -- Liveness, readiness and startup probes now use port `minio-console` instead of `minio`. - -Please note that Web UI, previously running on port 9000 will now use port 9001 leaving port 9000 for the MinIO® Server API. - -### To 7.0.0 - -This version introduces pod and container securityContext support. The previous configuration of `securityContext` has moved to `podSecurityContext` and `containerSecurityContext`. Apart from this case, no issues are expected to appear when upgrading. - -### To 5.0.0 - -This version standardizes the way of defining Ingress rules. When configuring a single hostname for the Ingress rule, set the `ingress.hostname` value. When defining more than one, set the `ingress.extraHosts` array. Apart from this case, no issues are expected to appear when upgrading. - -### To 4.1.0 - -This version introduces `bitnami/common`, a [library chart](https://helm.sh/docs/topics/library_charts/#helm) as a dependency. More documentation about this new utility could be found [here](https://github.com/bitnami/charts/tree/main/bitnami/common#bitnami-common-library-chart). Please, make sure that you have updated the chart dependencies before executing any upgrade. - -### To 4.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -#### What changes were introduced in this major version? - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -#### Considerations when upgrading to this version - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -#### Useful links - -- -- -- - -## License - -Copyright © 2023 VMware, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. \ No newline at end of file diff --git a/helm/thanos/charts/minio/charts/common/.helmignore b/helm/thanos/charts/minio/charts/common/.helmignore deleted file mode 100644 index 50af0317..00000000 --- a/helm/thanos/charts/minio/charts/common/.helmignore +++ /dev/null @@ -1,22 +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 -.vscode/ diff --git a/helm/thanos/charts/minio/charts/common/Chart.yaml b/helm/thanos/charts/minio/charts/common/Chart.yaml deleted file mode 100644 index 191699db..00000000 --- a/helm/thanos/charts/minio/charts/common/Chart.yaml +++ /dev/null @@ -1,23 +0,0 @@ -annotations: - category: Infrastructure - licenses: Apache-2.0 -apiVersion: v2 -appVersion: 2.6.0 -description: A Library Helm Chart for grouping common logic between bitnami charts. - This chart is not deployable by itself. -home: https://bitnami.com -icon: https://bitnami.com/downloads/logos/bitnami-mark.png -keywords: -- common -- helper -- template -- function -- bitnami -maintainers: -- name: VMware, Inc. - url: https://github.com/bitnami/charts -name: common -sources: -- https://github.com/bitnami/charts -type: library -version: 2.6.0 diff --git a/helm/thanos/charts/minio/charts/common/README.md b/helm/thanos/charts/minio/charts/common/README.md deleted file mode 100644 index b48bb7a2..00000000 --- a/helm/thanos/charts/minio/charts/common/README.md +++ /dev/null @@ -1,235 +0,0 @@ -# Bitnami Common Library Chart - -A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between Bitnami charts. - -## TL;DR - -```yaml -dependencies: - - name: common - version: 1.x.x - repository: oci://registry-1.docker.io/bitnamicharts -``` - -```console -helm dependency update -``` - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }} -data: - myvalue: "Hello World" -``` - -## Introduction - -This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - -Looking to use our applications in production? Try [VMware Application Catalog](https://bitnami.com/enterprise), the enterprise edition of Bitnami Application Catalog. - -## Prerequisites - -- Kubernetes 1.19+ -- Helm 3.2.0+ - -## Parameters - -## Special input schemas - -### ImageRoot - -```yaml -registry: - type: string - description: Docker registry where the image is located - example: docker.io - -repository: - type: string - description: Repository and image name - example: bitnami/nginx - -tag: - type: string - description: image tag - example: 1.16.1-debian-10-r63 - -pullPolicy: - type: string - description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - -pullSecrets: - type: array - items: - type: string - description: Optionally specify an array of imagePullSecrets (evaluated as templates). - -debug: - type: boolean - description: Set to true if you would like to see extra information on logs - example: false - -## An instance would be: -# registry: docker.io -# repository: bitnami/nginx -# tag: 1.16.1-debian-10-r63 -# pullPolicy: IfNotPresent -# debug: false -``` - -### Persistence - -```yaml -enabled: - type: boolean - description: Whether enable persistence. - example: true - -storageClass: - type: string - description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. - example: "-" - -accessMode: - type: string - description: Access mode for the Persistent Volume Storage. - example: ReadWriteOnce - -size: - type: string - description: Size the Persistent Volume Storage. - example: 8Gi - -path: - type: string - description: Path to be persisted. - example: /bitnami - -## An instance would be: -# enabled: true -# storageClass: "-" -# accessMode: ReadWriteOnce -# size: 8Gi -# path: /bitnami -``` - -### ExistingSecret - -```yaml -name: - type: string - description: Name of the existing secret. - example: mySecret -keyMapping: - description: Mapping between the expected key name and the name of the key in the existing secret. - type: object - -## An instance would be: -# name: mySecret -# keyMapping: -# password: myPasswordKey -``` - -#### Example of use - -When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. - -```yaml -# templates/secret.yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - labels: - app: {{ include "common.names.fullname" . }} -type: Opaque -data: - password: {{ .Values.password | b64enc | quote }} - -# templates/dpl.yaml ---- -... - env: - - name: PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} - key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} -... - -# values.yaml ---- -name: mySecret -keyMapping: - password: myPasswordKey -``` - -### ValidateValue - -#### NOTES.txt - -```console -{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} - -{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} -``` - -If we force those values to be empty we will see some alerts - -```console -helm install test mychart --set path.to.value00="",path.to.value01="" - 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: - - export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) - - 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: - - export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) -``` - -## Upgrading - -### To 1.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -#### What changes were introduced in this major version? - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -#### Considerations when upgrading to this version - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -#### Useful links - -- -- -- - -## License - -Copyright © 2023 VMware, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/helm/thanos/charts/minio/charts/common/templates/_affinities.tpl b/helm/thanos/charts/minio/charts/common/templates/_affinities.tpl deleted file mode 100644 index 0e571028..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/_affinities.tpl +++ /dev/null @@ -1,111 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Return a soft nodeAffinity definition -{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.soft" -}} -preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} - weight: 1 -{{- end -}} - -{{/* -Return a hard nodeAffinity definition -{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.hard" -}} -requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} -{{- end -}} - -{{/* -Return a nodeAffinity definition -{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.nodes.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.nodes.hard" . -}} - {{- end -}} -{{- end -}} - -{{/* -Return a topologyKey definition -{{ include "common.affinities.topologyKey" (dict "topologyKey" "BAR") -}} -*/}} -{{- define "common.affinities.topologyKey" -}} -{{ .topologyKey | default "kubernetes.io/hostname" -}} -{{- end -}} - -{{/* -Return a soft podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "topologyKey" "BAR" "context" $) -}} -*/}} -{{- define "common.affinities.pods.soft" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} - weight: 1 -{{- end -}} - -{{/* -Return a hard podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "topologyKey" "BAR" "context" $) -}} -*/}} -{{- define "common.affinities.pods.hard" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} -{{- end -}} - -{{/* -Return a podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.pods" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.pods.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.pods.hard" . -}} - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/_capabilities.tpl b/helm/thanos/charts/minio/charts/common/templates/_capabilities.tpl deleted file mode 100644 index c6d115fe..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/_capabilities.tpl +++ /dev/null @@ -1,185 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the target Kubernetes version -*/}} -{{- define "common.capabilities.kubeVersion" -}} -{{- if .Values.global }} - {{- if .Values.global.kubeVersion }} - {{- .Values.global.kubeVersion -}} - {{- else }} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} - {{- end -}} -{{- else }} -{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for poddisruptionbudget. -*/}} -{{- define "common.capabilities.policy.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "policy/v1beta1" -}} -{{- else -}} -{{- print "policy/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "common.capabilities.networkPolicy.apiVersion" -}} -{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for cronjob. -*/}} -{{- define "common.capabilities.cronjob.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "batch/v1beta1" -}} -{{- else -}} -{{- print "batch/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for daemonset. -*/}} -{{- define "common.capabilities.daemonset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "common.capabilities.deployment.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for statefulset. -*/}} -{{- define "common.capabilities.statefulset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apps/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "common.capabilities.ingress.apiVersion" -}} -{{- if .Values.ingress -}} -{{- if .Values.ingress.apiVersion -}} -{{- .Values.ingress.apiVersion -}} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for RBAC resources. -*/}} -{{- define "common.capabilities.rbac.apiVersion" -}} -{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "rbac.authorization.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "rbac.authorization.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for CRDs. -*/}} -{{- define "common.capabilities.crd.apiVersion" -}} -{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiextensions.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiextensions.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for APIService. -*/}} -{{- define "common.capabilities.apiService.apiVersion" -}} -{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiregistration.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiregistration.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Horizontal Pod Autoscaler. -*/}} -{{- define "common.capabilities.hpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Vertical Pod Autoscaler. -*/}} -{{- define "common.capabilities.vpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the used Helm version is 3.3+. -A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. -This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. -**To be removed when the catalog's minimun Helm version is 3.3** -*/}} -{{- define "common.capabilities.supportsHelmVersion" -}} -{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/_errors.tpl b/helm/thanos/charts/minio/charts/common/templates/_errors.tpl deleted file mode 100644 index 07ded6f6..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/_errors.tpl +++ /dev/null @@ -1,28 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Through error when upgrading using empty passwords values that must not be empty. - -Usage: -{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} -{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} -{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} - -Required password params: - - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. - - context - Context - Required. Parent context. -*/}} -{{- define "common.errors.upgrade.passwords.empty" -}} - {{- $validationErrors := join "" .validationErrors -}} - {{- if and $validationErrors .context.Release.IsUpgrade -}} - {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} - {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} - {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} - {{- $errorString = print $errorString "\n%s" -}} - {{- printf $errorString $validationErrors | fail -}} - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/_images.tpl b/helm/thanos/charts/minio/charts/common/templates/_images.tpl deleted file mode 100644 index 2181f322..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/_images.tpl +++ /dev/null @@ -1,85 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper image name -{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" .Values.global ) }} -*/}} -{{- define "common.images.image" -}} -{{- $registryName := .imageRoot.registry -}} -{{- $repositoryName := .imageRoot.repository -}} -{{- $separator := ":" -}} -{{- $termination := .imageRoot.tag | toString -}} -{{- if .global }} - {{- if .global.imageRegistry }} - {{- $registryName = .global.imageRegistry -}} - {{- end -}} -{{- end -}} -{{- if .imageRoot.digest }} - {{- $separator = "@" -}} - {{- $termination = .imageRoot.digest | toString -}} -{{- end -}} -{{- if $registryName }} - {{- printf "%s/%s%s%s" $registryName $repositoryName $separator $termination -}} -{{- else -}} - {{- printf "%s%s%s" $repositoryName $separator $termination -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) -{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} -*/}} -{{- define "common.images.pullSecrets" -}} - {{- $pullSecrets := list }} - - {{- if .global }} - {{- range .global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets | uniq }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names evaluating values as templates -{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} -*/}} -{{- define "common.images.renderPullSecrets" -}} - {{- $pullSecrets := list }} - {{- $context := .context }} - - {{- if $context.Values.global }} - {{- range $context.Values.global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets | uniq }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/_ingress.tpl b/helm/thanos/charts/minio/charts/common/templates/_ingress.tpl deleted file mode 100644 index efa5b85c..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/_ingress.tpl +++ /dev/null @@ -1,73 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Generate backend entry that is compatible with all Kubernetes API versions. - -Usage: -{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} - -Params: - - serviceName - String. Name of an existing service backend - - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.ingress.backend" -}} -{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} -{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} -serviceName: {{ .serviceName }} -servicePort: {{ .servicePort }} -{{- else -}} -service: - name: {{ .serviceName }} - port: - {{- if typeIs "string" .servicePort }} - name: {{ .servicePort }} - {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} - number: {{ .servicePort | int }} - {{- end }} -{{- end -}} -{{- end -}} - -{{/* -Print "true" if the API pathType field is supported -Usage: -{{ include "common.ingress.supportsPathType" . }} -*/}} -{{- define "common.ingress.supportsPathType" -}} -{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the ingressClassname field is supported -Usage: -{{ include "common.ingress.supportsIngressClassname" . }} -*/}} -{{- define "common.ingress.supportsIngressClassname" -}} -{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if cert-manager required annotations for TLS signed -certificates are set in the Ingress annotations -Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations -Usage: -{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} -*/}} -{{- define "common.ingress.certManagerRequest" -}} -{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") (hasKey .annotations "kubernetes.io/tls-acme") }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/_labels.tpl b/helm/thanos/charts/minio/charts/common/templates/_labels.tpl deleted file mode 100644 index a1d7a95b..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/_labels.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Kubernetes standard labels -*/}} -{{- define "common.labels.standard" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -helm.sh/chart: {{ include "common.names.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector -*/}} -{{- define "common.labels.matchLabels" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/_names.tpl b/helm/thanos/charts/minio/charts/common/templates/_names.tpl deleted file mode 100644 index a222924f..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/_names.tpl +++ /dev/null @@ -1,71 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "common.names.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "common.names.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | 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 "common.names.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 default fully qualified dependency 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. -Usage: -{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} -*/}} -{{- define "common.names.dependency.fullname" -}} -{{- if .chartValues.fullnameOverride -}} -{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .chartName .chartValues.nameOverride -}} -{{- if contains $name .context.Release.Name -}} -{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts. -*/}} -{{- define "common.names.namespace" -}} -{{- default .Release.Namespace .Values.namespaceOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a fully qualified app name adding the installation's namespace. -*/}} -{{- define "common.names.fullname.namespace" -}} -{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/_secrets.tpl b/helm/thanos/charts/minio/charts/common/templates/_secrets.tpl deleted file mode 100644 index a193c46b..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/_secrets.tpl +++ /dev/null @@ -1,172 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Generate secret name. - -Usage: -{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret - - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.secrets.name" -}} -{{- $name := (include "common.names.fullname" .context) -}} - -{{- if .defaultNameSuffix -}} -{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- with .existingSecret -}} -{{- if not (typeIs "string" .) -}} -{{- with .name -}} -{{- $name = . -}} -{{- end -}} -{{- else -}} -{{- $name = . -}} -{{- end -}} -{{- end -}} - -{{- printf "%s" $name -}} -{{- end -}} - -{{/* -Generate secret key. - -Usage: -{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret - - key - String - Required. Name of the key in the secret. -*/}} -{{- define "common.secrets.key" -}} -{{- $key := .key -}} - -{{- if .existingSecret -}} - {{- if not (typeIs "string" .existingSecret) -}} - {{- if .existingSecret.keyMapping -}} - {{- $key = index .existingSecret.keyMapping $.key -}} - {{- end -}} - {{- end }} -{{- end -}} - -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Generate secret password or retrieve one if already created. - -Usage: -{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - length - int - Optional - Length of the generated random password. - - strong - Boolean - Optional - Whether to add symbols to the generated random password. - - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. - - context - Context - Required - Parent context. - - failOnNew - Boolean - Optional - Default to true. If set to false, skip errors adding new keys to existing secrets. -The order in which this function returns a secret password: - 1. Already existing 'Secret' resource - (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) - 2. Password provided via the values.yaml - (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) - 3. Randomly generated secret password - (A new random secret password with the length specified in the 'length' parameter will be generated and returned) - -*/}} -{{- define "common.secrets.passwords.manage" -}} - -{{- $password := "" }} -{{- $subchart := "" }} -{{- $failOnNew := default true .failOnNew }} -{{- $chartName := default "" .chartName }} -{{- $passwordLength := default 10 .length }} -{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} -{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} -{{- $secretData := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret).data }} -{{- if $secretData }} - {{- if hasKey $secretData .key }} - {{- $password = index $secretData .key | quote }} - {{- else if $failOnNew }} - {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} - {{- end -}} -{{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString | b64enc | quote }} -{{- else }} - - {{- if .context.Values.enabled }} - {{- $subchart = $chartName }} - {{- end -}} - - {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} - {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} - {{- $passwordValidationErrors := list $requiredPasswordError -}} - {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} - - {{- if .strong }} - {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} - {{- $password = randAscii $passwordLength }} - {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} - {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} - {{- else }} - {{- $password = randAlphaNum $passwordLength | b64enc | quote }} - {{- end }} -{{- end -}} -{{- printf "%s" $password -}} -{{- end -}} - -{{/* -Reuses the value from an existing secret, otherwise sets its value to a default value. - -Usage: -{{ include "common.secrets.lookup" (dict "secret" "secret-name" "key" "keyName" "defaultValue" .Values.myValue "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - defaultValue - String - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - context - Context - Required - Parent context. - -*/}} -{{- define "common.secrets.lookup" -}} -{{- $value := "" -}} -{{- $secretData := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret).data -}} -{{- if and $secretData (hasKey $secretData .key) -}} - {{- $value = index $secretData .key -}} -{{- else if .defaultValue -}} - {{- $value = .defaultValue | toString | b64enc -}} -{{- end -}} -{{- if $value -}} -{{- printf "%s" $value -}} -{{- end -}} -{{- end -}} - -{{/* -Returns whether a previous generated secret already exists - -Usage: -{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.exists" -}} -{{- $secret := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret) }} -{{- if $secret }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/_storage.tpl b/helm/thanos/charts/minio/charts/common/templates/_storage.tpl deleted file mode 100644 index 16405a0f..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/_storage.tpl +++ /dev/null @@ -1,28 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper Storage Class -{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} -*/}} -{{- define "common.storage.class" -}} - -{{- $storageClass := .persistence.storageClass -}} -{{- if .global -}} - {{- if .global.storageClass -}} - {{- $storageClass = .global.storageClass -}} - {{- end -}} -{{- end -}} - -{{- if $storageClass -}} - {{- if (eq "-" $storageClass) -}} - {{- printf "storageClassName: \"\"" -}} - {{- else }} - {{- printf "storageClassName: %s" $storageClass -}} - {{- end -}} -{{- end -}} - -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/_tplvalues.tpl b/helm/thanos/charts/minio/charts/common/templates/_tplvalues.tpl deleted file mode 100644 index dc15f7fd..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/_tplvalues.tpl +++ /dev/null @@ -1,27 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Renders a value that contains template perhaps with scope if the scope is present. -Usage: -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ ) }} -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ "scope" $app ) }} -*/}} -{{- define "common.tplvalues.render" -}} -{{- if .scope }} - {{- if typeIs "string" .value }} - {{- tpl (cat "{{- with $.RelativeScope -}}" .value "{{- end }}") (merge (dict "RelativeScope" .scope) .context) }} - {{- else }} - {{- tpl (cat "{{- with $.RelativeScope -}}" (.value | toYaml) "{{- end }}") (merge (dict "RelativeScope" .scope) .context) }} - {{- end }} -{{- else }} - {{- if typeIs "string" .value }} - {{- tpl .value .context }} - {{- else }} - {{- tpl (.value | toYaml) .context }} - {{- end }} -{{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/_utils.tpl b/helm/thanos/charts/minio/charts/common/templates/_utils.tpl deleted file mode 100644 index c87040cd..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/_utils.tpl +++ /dev/null @@ -1,67 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Print instructions to get a secret value. -Usage: -{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} -*/}} -{{- define "common.utils.secret.getvalue" -}} -{{- $varname := include "common.utils.fieldToEnvVar" . -}} -export {{ $varname }}=$(kubectl get secret --namespace {{ include "common.names.namespace" .context | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) -{{- end -}} - -{{/* -Build env var name given a field -Usage: -{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} -*/}} -{{- define "common.utils.fieldToEnvVar" -}} - {{- $fieldNameSplit := splitList "-" .field -}} - {{- $upperCaseFieldNameSplit := list -}} - - {{- range $fieldNameSplit -}} - {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} - {{- end -}} - - {{ join "_" $upperCaseFieldNameSplit }} -{{- end -}} - -{{/* -Gets a value from .Values given -Usage: -{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} -*/}} -{{- define "common.utils.getValueFromKey" -}} -{{- $splitKey := splitList "." .key -}} -{{- $value := "" -}} -{{- $latestObj := $.context.Values -}} -{{- range $splitKey -}} - {{- if not $latestObj -}} - {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} - {{- end -}} - {{- $value = ( index $latestObj . ) -}} - {{- $latestObj = $value -}} -{{- end -}} -{{- printf "%v" (default "" $value) -}} -{{- end -}} - -{{/* -Returns first .Values key with a defined value or first of the list if all non-defined -Usage: -{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} -*/}} -{{- define "common.utils.getKeyFromList" -}} -{{- $key := first .keys -}} -{{- $reverseKeys := reverse .keys }} -{{- range $reverseKeys }} - {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} - {{- if $value -}} - {{- $key = . }} - {{- end -}} -{{- end -}} -{{- printf "%s" $key -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/_warnings.tpl b/helm/thanos/charts/minio/charts/common/templates/_warnings.tpl deleted file mode 100644 index 66dffc1f..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/_warnings.tpl +++ /dev/null @@ -1,19 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Warning about using rolling tag. -Usage: -{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} -*/}} -{{- define "common.warnings.rollingTag" -}} - -{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} -WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. -+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ -{{- end }} - -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/validations/_cassandra.tpl b/helm/thanos/charts/minio/charts/common/templates/validations/_cassandra.tpl deleted file mode 100644 index eda9aada..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/validations/_cassandra.tpl +++ /dev/null @@ -1,77 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Cassandra required passwords are not empty. - -Usage: -{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.cassandra.passwords" -}} - {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} - {{- $enabled := include "common.cassandra.values.enabled" . -}} - {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} - {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.dbUser.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled cassandra. - -Usage: -{{ include "common.cassandra.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.cassandra.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.cassandra.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key dbUser - -Usage: -{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.key.dbUser" -}} - {{- if .subchart -}} - cassandra.dbUser - {{- else -}} - dbUser - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/validations/_mariadb.tpl b/helm/thanos/charts/minio/charts/common/templates/validations/_mariadb.tpl deleted file mode 100644 index 17d83a2f..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/validations/_mariadb.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MariaDB required passwords are not empty. - -Usage: -{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mariadb.passwords" -}} - {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mariadb.values.enabled" . -}} - {{- $architecture := include "common.mariadb.values.architecture" . -}} - {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mariadb. - -Usage: -{{ include "common.mariadb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mariadb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mariadb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.key.auth" -}} - {{- if .subchart -}} - mariadb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/validations/_mongodb.tpl b/helm/thanos/charts/minio/charts/common/templates/validations/_mongodb.tpl deleted file mode 100644 index bbb445b8..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/validations/_mongodb.tpl +++ /dev/null @@ -1,113 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MongoDB® required passwords are not empty. - -Usage: -{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mongodb.passwords" -}} - {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mongodb.values.enabled" . -}} - {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} - {{- $architecture := include "common.mongodb.values.architecture" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} - {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} - - {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} - {{- if and $valueUsername $valueDatabase -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replicaset") -}} - {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mongodb. - -Usage: -{{ include "common.mongodb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mongodb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mongodb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.key.auth" -}} - {{- if .subchart -}} - mongodb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/validations/_mysql.tpl b/helm/thanos/charts/minio/charts/common/templates/validations/_mysql.tpl deleted file mode 100644 index ca3953f8..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/validations/_mysql.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MySQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mysql.passwords" -}} - {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mysql.values.enabled" . -}} - {{- $architecture := include "common.mysql.values.architecture" . -}} - {{- $authPrefix := include "common.mysql.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mysql. - -Usage: -{{ include "common.mysql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mysql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mysql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.key.auth" -}} - {{- if .subchart -}} - mysql.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/validations/_postgresql.tpl b/helm/thanos/charts/minio/charts/common/templates/validations/_postgresql.tpl deleted file mode 100644 index 8c9aa570..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/validations/_postgresql.tpl +++ /dev/null @@ -1,134 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate PostgreSQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.postgresql.passwords" -}} - {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} - {{- $enabled := include "common.postgresql.values.enabled" . -}} - {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} - {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} - - {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} - {{- if (eq $enabledReplication "true") -}} - {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to decide whether evaluate global values. - -Usage: -{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} -Params: - - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" -*/}} -{{- define "common.postgresql.values.use.global" -}} - {{- if .context.Values.global -}} - {{- if .context.Values.global.postgresql -}} - {{- index .context.Values.global.postgresql .key | quote -}} - {{- end -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.existingSecret" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} - - {{- if .subchart -}} - {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} - {{- else -}} - {{- default (.context.Values.existingSecret | quote) $globalValue -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled postgresql. - -Usage: -{{ include "common.postgresql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key postgressPassword. - -Usage: -{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.postgressPassword" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} - - {{- if not $globalValue -}} - {{- if .subchart -}} - postgresql.postgresqlPassword - {{- else -}} - postgresqlPassword - {{- end -}} - {{- else -}} - global.postgresql.postgresqlPassword - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled.replication. - -Usage: -{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.enabled.replication" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.replication.enabled -}} - {{- else -}} - {{- printf "%v" .context.Values.replication.enabled -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key replication.password. - -Usage: -{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.replicationPassword" -}} - {{- if .subchart -}} - postgresql.replication.password - {{- else -}} - replication.password - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/validations/_redis.tpl b/helm/thanos/charts/minio/charts/common/templates/validations/_redis.tpl deleted file mode 100644 index fc0d208d..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/validations/_redis.tpl +++ /dev/null @@ -1,81 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Redis® required passwords are not empty. - -Usage: -{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.redis.passwords" -}} - {{- $enabled := include "common.redis.values.enabled" . -}} - {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} - {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} - - {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} - {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} - - {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} - {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} - {{- if eq $useAuth "true" -}} - {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled redis. - -Usage: -{{ include "common.redis.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.redis.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.redis.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right prefix path for the values - -Usage: -{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.redis.values.keys.prefix" -}} - {{- if .subchart -}}redis.{{- else -}}{{- end -}} -{{- end -}} - -{{/* -Checks whether the redis chart's includes the standarizations (version >= 14) - -Usage: -{{ include "common.redis.values.standarized.version" (dict "context" $) }} -*/}} -{{- define "common.redis.values.standarized.version" -}} - - {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} - {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} - - {{- if $standarizedAuthValues -}} - {{- true -}} - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/templates/validations/_validations.tpl b/helm/thanos/charts/minio/charts/common/templates/validations/_validations.tpl deleted file mode 100644 index 31ceda87..00000000 --- a/helm/thanos/charts/minio/charts/common/templates/validations/_validations.tpl +++ /dev/null @@ -1,51 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate values must not be empty. - -Usage: -{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} -{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" -*/}} -{{- define "common.validations.values.multiple.empty" -}} - {{- range .required -}} - {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} - {{- end -}} -{{- end -}} - -{{/* -Validate a value must not be empty. - -Usage: -{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" - - subchart - String - Optional - Name of the subchart that the validated password is part of. -*/}} -{{- define "common.validations.values.single.empty" -}} - {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} - {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} - - {{- if not $value -}} - {{- $varname := "my-value" -}} - {{- $getCurrentValue := "" -}} - {{- if and .secret .field -}} - {{- $varname = include "common.utils.fieldToEnvVar" . -}} - {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} - {{- end -}} - {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} - {{- end -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/charts/common/values.yaml b/helm/thanos/charts/minio/charts/common/values.yaml deleted file mode 100644 index 9abe0e15..00000000 --- a/helm/thanos/charts/minio/charts/common/values.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright VMware, Inc. -# SPDX-License-Identifier: APACHE-2.0 - -## bitnami/common -## It is required by CI/CD tools and processes. -## @skip exampleValue -## -exampleValue: common-chart diff --git a/helm/thanos/charts/minio/templates/NOTES.txt b/helm/thanos/charts/minio/templates/NOTES.txt deleted file mode 100644 index 4ed938a8..00000000 --- a/helm/thanos/charts/minio/templates/NOTES.txt +++ /dev/null @@ -1,76 +0,0 @@ -CHART NAME: {{ .Chart.Name }} -CHART VERSION: {{ .Chart.Version }} -APP VERSION: {{ .Chart.AppVersion }} - -** Please be patient while the chart is being deployed ** - -MinIO® can be accessed via port {{ .Values.service.port }} on the following DNS name from within your cluster: - - {{ include "common.names.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }} - -To get your credentials run: - - export ROOT_USER=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "minio.secretName" . }} -o jsonpath="{.data.root-user}" | base64 -d) - export ROOT_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "minio.secretName" . }} -o jsonpath="{.data.root-password}" | base64 -d) - -To connect to your MinIO® server using a client: - -- Run a MinIO® Client pod and append the desired command (e.g. 'admin info'): - - kubectl run --namespace {{ .Release.Namespace }} {{ include "common.names.fullname" . }}-client \ - --rm --tty -i --restart='Never' \ - --env MINIO_SERVER_ROOT_USER=$ROOT_USER \ - --env MINIO_SERVER_ROOT_PASSWORD=$ROOT_PASSWORD \ - --env MINIO_SERVER_HOST={{ include "common.names.fullname" . }} \ - {{- if and (.Values.networkPolicy.enabled) (not .Values.networkPolicy.allowExternal) }} - --labels="{{ include "common.names.fullname" . }}-client=true" \ - {{- end }} - --image {{ template "minio.clientImage" . }} -- admin info minio - -{{- if and (.Values.networkPolicy.enabled) (not .Values.networkPolicy.allowExternal) }} - - NOTE: Since NetworkPolicy is enabled, only pods with label - "{{ template "common.names.fullname" . }}-client=true" will be able to connect to MinIO®. - -{{- end }} -{{- if (not .Values.disableWebUI) }} - -To access the MinIO® web UI: - -- Get the MinIO® URL: - -{{- if .Values.ingress.enabled }} - - You should be able to access your new MinIO® web UI through - - {{ if .Values.ingress.tls }}https{{ else }}http{{ end }}://{{ .Values.ingress.hostname }}/minio/ -{{- else if contains "LoadBalancer" .Values.service.type }} - - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - Watch the status with: 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ include "common.names.fullname" . }}' - - {{- $port:=.Values.service.ports.console | toString }} - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "common.names.fullname" . }} --template "{{ "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" }}") - echo "MinIO® web URL: http://$SERVICE_IP{{- if ne $port "80" }}:{{ .Values.service.ports.console }}{{ end }}/minio" - -{{- else if contains "ClusterIP" .Values.service.type }} - - echo "MinIO® web URL: http://127.0.0.1:{{ .Values.containerPorts.console }}/minio" - kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ include "common.names.fullname" . }} {{ .Values.containerPorts.console }}:{{ .Values.service.ports.console }} - -{{- else if contains "NodePort" .Values.service.type }} - - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.names.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo "MinIO® web URL: http://$NODE_IP:$NODE_PORT/minio" - -{{- end }} -{{- else }} - - WARN: MinIO® Web UI is disabled. -{{- end }} - -{{- include "common.warnings.rollingTag" .Values.image }} -{{- include "common.warnings.rollingTag" .Values.clientImage }} -{{- include "common.warnings.rollingTag" .Values.volumePermissions.image }} -{{- include "minio.validateValues" . }} diff --git a/helm/thanos/charts/minio/templates/_helpers.tpl b/helm/thanos/charts/minio/templates/_helpers.tpl deleted file mode 100644 index 29b84f0e..00000000 --- a/helm/thanos/charts/minio/templates/_helpers.tpl +++ /dev/null @@ -1,243 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the proper MinIO® image name -*/}} -{{- define "minio.image" -}} -{{ include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) }} - -{{- end -}} - -{{/* -Return the proper MinIO® Client image name -*/}} -{{- define "minio.clientImage" -}} -{{ include "common.images.image" (dict "imageRoot" .Values.clientImage "global" .Values.global) }} -{{- end -}} - -{{/* -Return the proper image name (for the init container volume-permissions image) -*/}} -{{- define "minio.volumePermissions.image" -}} -{{ include "common.images.image" (dict "imageRoot" .Values.volumePermissions.image "global" .Values.global) }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names -*/}} -{{- define "minio.imagePullSecrets" -}} -{{- include "common.images.pullSecrets" (dict "images" (list .Values.image .Values.clientImage .Values.volumePermissions.image) "global" .Values.global) -}} -{{- end -}} - -{{/* -Returns the available value for certain key in an existing secret (if it exists), -otherwise it generates a random value. -*/}} -{{- define "getValueFromSecret" }} -{{- $len := (default 16 .Length) | int -}} -{{- $obj := (lookup "v1" "Secret" .Namespace .Name).data -}} -{{- if $obj }} -{{- index $obj .Key | b64dec -}} -{{- else -}} -{{- randAlphaNum $len -}} -{{- end -}} -{{- end }} - -{{/* -Get the user to use to access MinIO® -*/}} -{{- define "minio.secret.userValue" -}} -{{- if .Values.auth.rootUser }} - {{- .Values.auth.rootUser -}} -{{- else if (not .Values.auth.forcePassword) }} - {{- include "getValueFromSecret" (dict "Namespace" .Release.Namespace "Name" (include "common.names.fullname" .) "Length" 10 "Key" "root-user") -}} -{{- else -}} - {{ required "A root username is required!" .Values.auth.rootUser }} -{{- end -}} -{{- end -}} - -{{/* -Get the password to use to access MinIO® -*/}} -{{- define "minio.secret.passwordValue" -}} -{{- if .Values.auth.rootPassword }} - {{- .Values.auth.rootPassword -}} -{{- else if (not .Values.auth.forcePassword) }} - {{- include "getValueFromSecret" (dict "Namespace" .Release.Namespace "Name" (include "common.names.fullname" .) "Length" 10 "Key" "root-password") -}} -{{- else -}} - {{ required "A root password is required!" .Values.auth.rootPassword }} -{{- end -}} -{{- end -}} - -{{/* -Get the credentials secret. -*/}} -{{- define "minio.secretName" -}} -{{- if .Values.auth.existingSecret -}} - {{- printf "%s" (tpl .Values.auth.existingSecret $) -}} -{{- else -}} - {{- printf "%s" (include "common.names.fullname" .) -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if a secret object should be created -*/}} -{{- define "minio.createSecret" -}} -{{- if .Values.auth.existingSecret -}} -{{- else -}} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if a PVC object should be created (only in standalone mode) -*/}} -{{- define "minio.createPVC" -}} -{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) (eq .Values.mode "standalone") }} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Return the PVC name (only in standalone mode) -*/}} -{{- define "minio.claimName" -}} -{{- if and .Values.persistence.existingClaim }} - {{- printf "%s" (tpl .Values.persistence.existingClaim $) -}} -{{- else -}} - {{- printf "%s" (include "common.names.fullname" .) -}} -{{- end -}} -{{- end -}} - -{{/* -Returns the proper service account name depending if an explicit service account name is set -in the values file. If the name is not set it will default to either common.names.fullname if serviceAccount.create -is true or default otherwise. -*/}} -{{- define "minio.serviceAccountName" -}} - {{- if .Values.serviceAccount.create -}} - {{ default (include "common.names.fullname" .) .Values.serviceAccount.name }} - {{- else -}} - {{ default "default" .Values.serviceAccount.name }} - {{- end -}} -{{- end -}} - -{{/* -Compile all warnings into a single message, and call fail. -*/}} -{{- define "minio.validateValues" -}} -{{- $messages := list -}} -{{- $messages := append $messages (include "minio.validateValues.mode" .) -}} -{{- $messages := append $messages (include "minio.validateValues.totalDrives" .) -}} -{{- $messages := append $messages (include "minio.validateValues.tls" .) -}} -{{- $messages := without $messages "" -}} -{{- $message := join "\n" $messages -}} - -{{- if $message -}} -{{- printf "\nVALUES VALIDATION:\n%s" $message | fail -}} -{{- end -}} -{{- end -}} - -{{/* -Validate values of MinIO® - must provide a valid mode ("distributed" or "standalone") -*/}} -{{- define "minio.validateValues.mode" -}} -{{- $allowedValues := list "distributed" "standalone" }} -{{- if not (has .Values.mode $allowedValues) -}} -minio: mode - Invalid mode selected. Valid values are "distributed" and - "standalone". Please set a valid mode (--set mode="xxxx") -{{- end -}} -{{- end -}} - -{{/* -Validate values of MinIO® - total number of drives should be greater than 4 -*/}} -{{- define "minio.validateValues.totalDrives" -}} -{{- $replicaCount := int .Values.statefulset.replicaCount }} -{{- $drivesPerNode := int .Values.statefulset.drivesPerNode }} -{{- $totalDrives := mul $replicaCount $drivesPerNode }} -{{- if and (eq .Values.mode "distributed") (lt $totalDrives 4) -}} -minio: total drives - The total number of drives should be greater than 4 to guarantee erasure coding! - Please set a combination of nodes, and drives per node that match this condition. - For instance (--set statefulset.replicaCount=2 --set statefulset.drivesPerNode=2) -{{- end -}} -{{- end -}} - -{{/* -Validate values of MinIO® - TLS secret must provided if TLS is enabled -*/}} -{{- define "minio.validateValues.tls" -}} -{{- if and .Values.tls.enabled (not .Values.tls.existingSecret) (not .Values.tls.autoGenerated) }} -minio: tls.existingSecret, tls.autoGenerated - In order to enable TLS, you also need to provide - an existing secret containing the TLS certificates or - enable auto-generated certificates. -{{- end -}} -{{- end -}} - -{{/* -Return the secret containing MinIO TLS certificates -*/}} -{{- define "minio.tlsSecretName" -}} -{{- if .Values.tls.existingSecret -}} - {{- printf "%s" (tpl .Values.tls.existingSecret $) -}} -{{- else -}} - {{- printf "%s-crt" (include "common.names.fullname" .) -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if a TLS secret object should be created -*/}} -{{- define "minio.createTlsSecret" -}} -{{- if and .Values.tls.enabled .Values.tls.autoGenerated (not .Values.tls.existingSecret) }} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Provisioning job labels (exclude matchLabels from standard labels) -*/}} -{{- define "minio.labels.provisioning" -}} -{{- $provisioningLabels := (include "common.labels.standard" . | fromYaml ) -}} -{{- range (include "common.labels.matchLabels" . | fromYaml | keys ) -}} -{{- $_ := unset $provisioningLabels . -}} -{{- end -}} -{{- print ($provisioningLabels | toYaml) -}} -{{- end -}} - -{{/* -Return the ingress anotation -*/}} -{{- define "minio.ingress.annotations" -}} -{{ .Values.ingress.annotations | toYaml }} -{{- end -}} - -{{/* -Return the api ingress anotation -*/}} -{{- define "minio.apiIngress.annotations" -}} -{{ .Values.apiIngress.annotations | toYaml }} -{{- end -}} - -{{/* -Return the ingress hostname -*/}} -{{- define "minio.ingress.hostname" -}} -{{- tpl .Values.ingress.hostname $ -}} -{{- end -}} - -{{/* -Return the api ingress hostname -*/}} -{{- define "minio.apiIngress.hostname" -}} -{{- tpl .Values.apiIngress.hostname $ -}} -{{- end -}} diff --git a/helm/thanos/charts/minio/templates/api-ingress.yaml b/helm/thanos/charts/minio/templates/api-ingress.yaml deleted file mode 100644 index 8e1449e5..00000000 --- a/helm/thanos/charts/minio/templates/api-ingress.yaml +++ /dev/null @@ -1,66 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.apiIngress.enabled -}} -apiVersion: {{ include "common.capabilities.ingress.apiVersion" . }} -kind: Ingress -metadata: - name: {{ include "common.names.fullname" . }}-api - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - annotations: - {{- $annotations := fromYaml (include "minio.apiIngress.annotations" .) -}} - {{- if $annotations }} - {{- include "common.tplvalues.render" (dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- if and .Values.apiIngress.ingressClassName (include "common.ingress.supportsIngressClassname" .) }} - ingressClassName: {{ .Values.apiIngress.ingressClassName | quote }} - {{- end }} - rules: - {{- if (include "minio.apiIngress.hostname" .) }} - - host: {{ include "minio.apiIngress.hostname" . }} - http: - paths: - {{- if .Values.apiIngress.extraPaths }} - {{- toYaml .Values.apiIngress.extraPaths | nindent 10 }} - {{- end }} - - path: {{ .Values.apiIngress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} - pathType: {{ .Values.apiIngress.pathType }} - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" (include "common.names.fullname" .) "servicePort" "minio-api" "context" $) | nindent 14 }} - {{- end }} - {{- range .Values.apiIngress.extraHosts }} - - host: {{ .name | quote }} - http: - paths: - - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} - pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" (include "common.names.fullname" $) "servicePort" "minio-api" "context" $) | nindent 14 }} - {{- end }} - {{- if .Values.apiIngress.extraRules }} - {{- include "common.tplvalues.render" (dict "value" .Values.apiIngress.extraRules "context" $) | nindent 4 }} - {{- end }} - {{- if or (and .Values.apiIngress.tls (or (include "common.ingress.certManagerRequest" ( dict "annotations" $annotations )) .Values.apiIngress.selfSigned)) .Values.apiIngress.extraTls }} - tls: - {{- if and .Values.apiIngress.tls (or (include "common.ingress.certManagerRequest" ( dict "annotations" $annotations )) .Values.apiIngress.selfSigned) }} - - hosts: - - {{ include "minio.apiIngress.hostname" . }} - secretName: {{ printf "%s-tls" (include "minio.apiIngress.hostname" .) }} - {{- end }} - {{- if .Values.apiIngress.extraTls }} - {{- include "common.tplvalues.render" ( dict "value" .Values.apiIngress.extraTls "context" $ ) | nindent 4 }} - {{- end }} - {{- end }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/distributed/headless-svc.yaml b/helm/thanos/charts/minio/templates/distributed/headless-svc.yaml deleted file mode 100644 index 9fd8db9d..00000000 --- a/helm/thanos/charts/minio/templates/distributed/headless-svc.yaml +++ /dev/null @@ -1,37 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if (eq .Values.mode "distributed") }} -apiVersion: v1 -kind: Service -metadata: - name: {{ printf "%s-headless" (include "common.names.fullname" .) | trunc 63 }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if or .Values.commonAnnotations .Values.service.headless.annotations }} - annotations: - {{- if .Values.service.headless.annotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.service.headless.annotations "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} - {{- end }} -spec: - type: ClusterIP - clusterIP: None - ports: - - name: minio-api - port: {{ .Values.service.ports.api }} - targetPort: minio-api - - name: minio-console - port: {{ .Values.service.ports.console }} - targetPort: minio-console - publishNotReadyAddresses: true - selector: {{- include "common.labels.matchLabels" . | nindent 4 }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/distributed/pdb.yaml b/helm/thanos/charts/minio/templates/distributed/pdb.yaml deleted file mode 100644 index dc3e1995..00000000 --- a/helm/thanos/charts/minio/templates/distributed/pdb.yaml +++ /dev/null @@ -1,28 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.pdb.create (eq .Values.mode "distributed") }} -apiVersion: {{ include "common.capabilities.policy.apiVersion" . }} -kind: PodDisruptionBudget -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- if .Values.pdb.minAvailable }} - minAvailable: {{ .Values.pdb.minAvailable }} - {{- end }} - {{- if .Values.pdb.maxUnavailable }} - maxUnavailable: {{ .Values.pdb.maxUnavailable }} - {{- end }} - selector: - matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/distributed/statefulset.yaml b/helm/thanos/charts/minio/templates/distributed/statefulset.yaml deleted file mode 100644 index ea3a74f0..00000000 --- a/helm/thanos/charts/minio/templates/distributed/statefulset.yaml +++ /dev/null @@ -1,346 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if (eq .Values.mode "distributed") }} -{{- $fullname := include "common.names.fullname" . }} -{{- $headlessService := printf "%s-headless" (include "common.names.fullname" .) | trunc 63 }} -{{- $releaseNamespace := .Release.Namespace }} -{{- $clusterDomain := .Values.clusterDomain }} -{{- $apiPort := toString .Values.containerPorts.api }} -{{- $replicaCount := int .Values.statefulset.replicaCount }} -{{- $zoneCount := int .Values.statefulset.zones }} -{{- $drivesPerNode := int .Values.statefulset.drivesPerNode }} -{{- $mountPath := .Values.persistence.mountPath }} -apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }} -kind: StatefulSet -metadata: - name: {{ $fullname }} - namespace: {{ $releaseNamespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - selector: - matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }} - serviceName: {{ $headlessService }} - replicas: {{ mul $zoneCount $replicaCount }} - podManagementPolicy: {{ .Values.statefulset.podManagementPolicy }} - {{- if .Values.statefulset.updateStrategy }} - updateStrategy: {{- toYaml .Values.statefulset.updateStrategy | nindent 4 }} - {{- end }} - template: - metadata: - labels: {{- include "common.labels.standard" . | nindent 8 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 8 }} - {{- end }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if or .Values.podAnnotations (include "minio.createSecret" .) }} - annotations: - {{- if (include "minio.createSecret" .) }} - checksum/credentials-secret: {{ include (print $.Template.BasePath "/secrets.yaml") . | sha256sum }} - {{- end }} - {{- if .Values.podAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - {{- end }} - spec: - {{- include "minio.imagePullSecrets" . | nindent 6 }} - {{- if .Values.schedulerName }} - schedulerName: {{ .Values.schedulerName }} - {{- end }} - serviceAccountName: {{ template "minio.serviceAccountName" . }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- else }} - affinity: - podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAffinityPreset "context" $) | nindent 10 }} - podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAntiAffinityPreset "context" $) | nindent 10 }} - nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.nodeAffinityPreset.type "key" .Values.nodeAffinityPreset.key "values" .Values.nodeAffinityPreset.values) | nindent 10 }} - {{- end }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.hostAliases }} - hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.hostAliases "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.topologySpreadConstraints }} - topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.topologySpreadConstraints "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.priorityClassName }} - priorityClassName: {{ .Values.priorityClassName | quote }} - {{- end }} - {{- if .Values.podSecurityContext.enabled }} - securityContext: {{- omit .Values.podSecurityContext "enabled" | toYaml | nindent 8 }} - {{- end }} - {{- if .Values.terminationGracePeriodSeconds }} - terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }} - {{- end }} - {{- if or .Values.initContainers (and .Values.volumePermissions.enabled .Values.persistence.enabled) }} - initContainers: - {{- if .Values.initContainers }} - {{- include "common.tplvalues.render" (dict "value" .Values.initContainers "context" $) | nindent 8 }} - {{- end }} - {{- if and .Values.volumePermissions.enabled .Values.persistence.enabled }} - - name: volume-permissions - image: {{ template "minio.volumePermissions.image" . }} - imagePullPolicy: {{ default "" .Values.volumePermissions.image.pullPolicy | quote }} - command: - - /bin/bash - - -ec - - | - {{- if and .Values.persistence.enabled (gt $drivesPerNode 1) }} - chown -R {{ .Values.containerSecurityContext.runAsUser }}:{{ .Values.podSecurityContext.fsGroup }} {{ range $diskId := until $drivesPerNode }}{{ $mountPath }}-{{ $diskId }} {{ end }} - {{- else }} - chown -R {{ .Values.containerSecurityContext.runAsUser }}:{{ .Values.podSecurityContext.fsGroup }} {{ $mountPath }} - {{- end }} - securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }} - {{- if .Values.volumePermissions.resources }} - resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }} - {{- end }} - volumeMounts: - {{- if and .Values.persistence.enabled (gt $drivesPerNode 1) }} - {{- range $diskId := until $drivesPerNode }} - - name: data-{{ $diskId }} - mountPath: {{ $mountPath }}-{{ $diskId }} - {{- end }} - {{- else }} - - name: data - mountPath: {{ $mountPath }} - {{- end }} - {{- end }} - {{- end }} - containers: - - name: minio - image: {{ include "minio.image" . }} - imagePullPolicy: {{ .Values.image.pullPolicy | quote }} - {{- if .Values.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.command "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.args }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.args "context" $) | nindent 12 }} - {{- end }} - env: - - name: BITNAMI_DEBUG - value: {{ ternary "true" "false" .Values.image.debug | quote }} - - name: MINIO_DISTRIBUTED_MODE_ENABLED - value: "yes" - - name: MINIO_DISTRIBUTED_NODES - {{- $clusters := list }} - {{- range $i := until $zoneCount }} - {{- $factor := mul $i $replicaCount }} - {{- $endIndex := sub (add $factor $replicaCount) 1 }} - {{- $beginIndex := mul $i $replicaCount }} - {{- $bucket := ternary (printf "%s-{0...%d}" $mountPath (sub $drivesPerNode 1)) $mountPath (gt $drivesPerNode 1) }} - {{- $clusters = append $clusters (printf "%s-{%d...%d}.%s.%s.svc.%s:%s%s" $fullname $beginIndex $endIndex $headlessService $releaseNamespace $clusterDomain $apiPort $bucket) }} - {{- end }} - value: {{ join "," $clusters | quote }} - - name: MINIO_SCHEME - value: {{ ternary "https" "http" .Values.tls.enabled | quote }} - - name: MINIO_FORCE_NEW_KEYS - value: {{ ternary "yes" "no" .Values.auth.forceNewKeys | quote }} - {{- if .Values.auth.useCredentialsFiles }} - - name: MINIO_ROOT_USER_FILE - value: "/opt/bitnami/minio/secrets/root-user" - {{- else }} - - name: MINIO_ROOT_USER - valueFrom: - secretKeyRef: - name: {{ include "minio.secretName" . }} - key: root-user - {{- end }} - {{- if .Values.auth.useCredentialsFiles }} - - name: MINIO_ROOT_PASSWORD_FILE - value: "/opt/bitnami/minio/secrets/root-password" - {{- else }} - - name: MINIO_ROOT_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "minio.secretName" . }} - key: root-password - {{- end }} - - name: MINIO_SKIP_CLIENT - value: {{ ternary "yes" "no" (empty .Values.defaultBuckets) | quote }} - {{- if .Values.defaultBuckets }} - - name: MINIO_DEFAULT_BUCKETS - value: {{ .Values.defaultBuckets }} - {{- end }} - - name: MINIO_BROWSER - value: {{ ternary "off" "on" .Values.disableWebUI | quote }} - - name: MINIO_PROMETHEUS_AUTH_TYPE - value: {{ .Values.metrics.prometheusAuthType | quote }} - {{- if .Values.tls.mountPath }} - - name: MINIO_CERTS_DIR - value: {{ .Values.tls.mountPath | quote }} - - name: MINIO_CONSOLE_PORT_NUMBER - value: {{ .Values.containerPorts.console | quote }} - {{- end }} - {{- if .Values.extraEnvVars }} - {{- include "common.tplvalues.render" (dict "value" .Values.extraEnvVars "context" $) | nindent 12 }} - {{- end }} - envFrom: - {{- if .Values.extraEnvVarsCM }} - - configMapRef: - name: {{ include "common.tplvalues.render" (dict "value" .Values.extraEnvVarsCM "context" $) }} - {{- end }} - {{- if .Values.extraEnvVarsSecret }} - - secretRef: - name: {{ include "common.tplvalues.render" (dict "value" .Values.extraEnvVarsSecret "context" $) }} - {{- end }} - ports: - - name: minio-api - containerPort: {{ .Values.containerPorts.api }} - protocol: TCP - - name: minio-console - containerPort: {{ .Values.containerPorts.console }} - protocol: TCP - {{- if .Values.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.livenessProbe.enabled }} - livenessProbe: - httpGet: - path: /minio/health/live - port: minio-api - scheme: {{ ternary "HTTPS" "HTTP" .Values.tls.enabled | quote }} - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - {{- end }} - {{- if .Values.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.readinessProbe.enabled }} - readinessProbe: - tcpSocket: - port: minio-api - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - {{- end }} - {{- if .Values.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.startupProbe.enabled }} - startupProbe: - tcpSocket: - port: minio-api - initialDelaySeconds: {{ .Values.startupProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.startupProbe.periodSeconds }} - timeoutSeconds: {{ .Values.startupProbe.timeoutSeconds }} - successThreshold: {{ .Values.startupProbe.successThreshold }} - failureThreshold: {{ .Values.startupProbe.failureThreshold }} - {{- end }} - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 12 }} - {{- end }} - {{- if .Values.lifecycleHooks }} - lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.lifecycleHooks "context" $) | nindent 12 }} - {{- end }} - volumeMounts: - {{- if .Values.auth.useCredentialsFiles }} - - name: minio-credentials - mountPath: /opt/bitnami/minio/secrets/ - {{- end }} - {{- if .Values.tls.enabled }} - - name: minio-certs - mountPath: {{ default "/certs" .Values.tls.mountPath }} - {{- end }} - {{- if gt $drivesPerNode 1 }} - {{- range $diskId := until $drivesPerNode }} - - name: data-{{ $diskId }} - mountPath: {{ $mountPath }}-{{ $diskId }} - {{- end }} - {{- else }} - - name: data - mountPath: {{ $mountPath }} - {{- end }} - {{- if .Values.extraVolumeMounts }} - {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumeMounts "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.sidecars }} - {{- include "common.tplvalues.render" (dict "value" .Values.sidecars "context" $) | nindent 8 }} - {{- end }} - volumes: - {{- if .Values.auth.useCredentialsFiles }} - - name: minio-credentials - secret: - secretName: {{ include "minio.secretName" . }} - {{- end }} - {{- if .Values.tls.enabled }} - - name: minio-certs - secret: - secretName: {{ include "minio.tlsSecretName" . }} - items: - - key: tls.crt - path: public.crt - - key: tls.key - path: private.key - - key: ca.crt - path: CAs/public.crt - {{- end }} - {{- if .Values.extraVolumes }} - {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumes "context" $) | nindent 8 }} - {{- end }} - {{- if and (not .Values.persistence.enabled) (gt $drivesPerNode 1) }} - {{- range $diskId := until $drivesPerNode }} - - name: data-{{ $diskId }} - emptyDir: {} - {{- end }} - {{- else if not .Values.persistence.enabled }} - - name: data - emptyDir: {} - {{- else }} - volumeClaimTemplates: - {{- if gt $drivesPerNode 1 }} - {{- range $diskId := until $drivesPerNode }} - - metadata: - name: data-{{ $diskId }} - labels: {{- include "common.labels.matchLabels" $ | nindent 10 }} - {{- if $.Values.persistence.annotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $.Values.persistence.annotations "context" $) | nindent 10 }} - {{- end }} - spec: - accessModes: - {{- range $.Values.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ $.Values.persistence.size | quote }} - {{- include "common.storage.class" (dict "persistence" $.Values.persistence "global" $.Values.global) | nindent 8 }} - {{- end }} - {{- else }} - - metadata: - name: data - labels: {{- include "common.labels.matchLabels" . | nindent 10 }} - {{- if .Values.persistence.annotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.persistence.annotations "context" $) | nindent 10 }} - {{- end }} - spec: - accessModes: - {{- range .Values.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} - {{- include "common.storage.class" (dict "persistence" .Values.persistence "global" .Values.global) | nindent 8 }} - {{- end }} - {{- end }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/extra-list.yaml b/helm/thanos/charts/minio/templates/extra-list.yaml deleted file mode 100644 index 2d35a580..00000000 --- a/helm/thanos/charts/minio/templates/extra-list.yaml +++ /dev/null @@ -1,9 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- range .Values.extraDeploy }} ---- -{{ include "common.tplvalues.render" (dict "value" . "context" $) }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/ingress.yaml b/helm/thanos/charts/minio/templates/ingress.yaml deleted file mode 100644 index e1deeb02..00000000 --- a/helm/thanos/charts/minio/templates/ingress.yaml +++ /dev/null @@ -1,66 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.ingress.enabled (not .Values.disableWebUI ) -}} -apiVersion: {{ include "common.capabilities.ingress.apiVersion" . }} -kind: Ingress -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - annotations: - {{- $annotations := fromYaml (include "minio.ingress.annotations" .) -}} - {{- if $annotations }} - {{- include "common.tplvalues.render" (dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- if and .Values.ingress.ingressClassName (include "common.ingress.supportsIngressClassname" .) }} - ingressClassName: {{ .Values.ingress.ingressClassName | quote }} - {{- end }} - rules: - {{- if (include "minio.ingress.hostname" .) }} - - host: {{ include "minio.ingress.hostname" . }} - http: - paths: - {{- if .Values.ingress.extraPaths }} - {{- toYaml .Values.ingress.extraPaths | nindent 10 }} - {{- end }} - - path: {{ .Values.ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} - pathType: {{ .Values.ingress.pathType }} - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" (include "common.names.fullname" .) "servicePort" "minio-console" "context" $) | nindent 14 }} - {{- end }} - {{- range .Values.ingress.extraHosts }} - - host: {{ .name | quote }} - http: - paths: - - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} - pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" (include "common.names.fullname" $) "servicePort" "minio-console" "context" $) | nindent 14 }} - {{- end }} - {{- if .Values.ingress.extraRules }} - {{- include "common.tplvalues.render" (dict "value" .Values.ingress.extraRules "context" $) | nindent 4 }} - {{- end }} - {{- if or (and .Values.ingress.tls (or (include "common.ingress.certManagerRequest" ( dict "annotations" $annotations )) .Values.ingress.selfSigned)) .Values.ingress.extraTls }} - tls: - {{- if and .Values.ingress.tls (or (include "common.ingress.certManagerRequest" ( dict "annotations" $annotations )) .Values.ingress.selfSigned) }} - - hosts: - - {{ include "minio.ingress.hostname" . }} - secretName: {{ printf "%s-tls" (include "minio.ingress.hostname" .) }} - {{- end }} - {{- if .Values.ingress.extraTls }} - {{- include "common.tplvalues.render" ( dict "value" .Values.ingress.extraTls "context" $ ) | nindent 4 }} - {{- end }} - {{- end }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/networkpolicy.yaml b/helm/thanos/charts/minio/templates/networkpolicy.yaml deleted file mode 100644 index b2c1e0e8..00000000 --- a/helm/thanos/charts/minio/templates/networkpolicy.yaml +++ /dev/null @@ -1,39 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.networkPolicy.enabled }} -kind: NetworkPolicy -apiVersion: {{ include "common.capabilities.networkPolicy.apiVersion" . }} -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - podSelector: - matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }} - ingress: - # Allow inbound connections - - ports: - - port: {{ .Values.containerPorts.console }} - - port: {{ .Values.containerPorts.api }} - {{- if not .Values.networkPolicy.allowExternal }} - from: - - podSelector: - matchLabels: - {{ include "common.names.fullname" . }}-client: "true" - - podSelector: - matchLabels: {{- include "common.labels.matchLabels" . | nindent 14 }} - - {{- if .Values.networkPolicy.extraFromClauses }} - {{- toYaml .Values.networkPolicy.extraFromClauses | nindent 8 }} - {{- end }} - {{- end }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/prometheusrule.yaml b/helm/thanos/charts/minio/templates/prometheusrule.yaml deleted file mode 100644 index d77297fd..00000000 --- a/helm/thanos/charts/minio/templates/prometheusrule.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.metrics.enabled .Values.metrics.prometheusRule.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ default .Release.Namespace .Values.metrics.prometheusRule.namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - app.kubernetes.io/component: metrics - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.metrics.prometheusRule.additionalLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.prometheusRule.additionalLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - groups: - - name: {{ include "common.names.fullname" . }} - rules: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.prometheusRule.rules "context" $ ) | nindent 6 }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/provisioning-configmap.yaml b/helm/thanos/charts/minio/templates/provisioning-configmap.yaml deleted file mode 100644 index 0bce1553..00000000 --- a/helm/thanos/charts/minio/templates/provisioning-configmap.yaml +++ /dev/null @@ -1,78 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.provisioning.enabled }} -{{- $fullname := printf "%s-provisioning" (include "common.names.fullname" .) }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ $fullname }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - app.kubernetes.io/component: minio-provisioning - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -data: - {{- range $bucket := .Values.provisioning.buckets }} - {{- if $bucket.lifecycle }} - bucket-{{ $bucket.name }}.json: | - { - "Rules": [ - {{- range $idx, $lifecycle := $bucket.lifecycle }} - {{- if not (eq $idx 0) }} - , - {{- end }} - { - "ID": "{{ $lifecycle.id }}", - "Status": "{{ ternary "Disabled" "Enabled" (and (not (empty $lifecycle.disabled)) $lifecycle.disabled) }}", - {{- if $lifecycle.expiry }} - "Expiration": { - {{- with $lifecycle.expiry.date }} - "Date": "{{ . }}" - {{- end }} - {{- with $lifecycle.expiry.days }} - "Days": {{ . }} - {{- end }} - } - {{- with $lifecycle.expiry.nonconcurrentDays }} - , - "NoncurrentVersionExpiration": { - "NoncurrentDays": {{ . }} - } - {{- end }} - {{- with $lifecycle.prefix }} - , - "Filter": { - "Prefix": "{{ . }}" - } - {{- end }} - } - {{- end }} - {{- end }} - ] - } - {{- end }} - {{- end }} - {{- range $policy := .Values.provisioning.policies }} - policy-{{ $policy.name }}.json: | - {{- $statementsLength := sub (len $policy.statements) 1 }} - { - "Version": "2012-10-17", - "Statement": [ - {{- range $i, $statement := $policy.statements }} - { - "Effect": "{{ default "Deny" $statement.effect }}"{{ if $statement.actions }}, - "Action": {{ toJson $statement.actions }}{{end}}{{ if $statement.resources }}, - "Resource": {{ toJson $statement.resources }}{{end}} - }{{ if lt $i $statementsLength }},{{end }} - {{- end }} - ] - } - {{- end }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/provisioning-job.yaml b/helm/thanos/charts/minio/templates/provisioning-job.yaml deleted file mode 100644 index 501528aa..00000000 --- a/helm/thanos/charts/minio/templates/provisioning-job.yaml +++ /dev/null @@ -1,328 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.provisioning.enabled }} -{{- $fullname := printf "%s-provisioning" (include "common.names.fullname" .) }} -{{- $minioAlias := "provisioning" }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ $fullname }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - app.kubernetes.io/component: minio-provisioning - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - annotations: - helm.sh/hook: post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation - {{- if .Values.commonAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - parallelism: 1 - template: - metadata: - labels: {{- include "minio.labels.provisioning" . | nindent 8 }} - app.kubernetes.io/component: minio-provisioning - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.provisioning.podAnnotations }} - annotations: - {{- include "common.tplvalues.render" ( dict "value" .Values.provisioning.podAnnotations "context" $) | nindent 8 }} - {{- end }} - spec: - {{- include "minio.imagePullSecrets" . | nindent 6 }} - {{- if .Values.provisioning.schedulerName }} - schedulerName: {{ .Values.provisioning.schedulerName }} - {{- end }} - restartPolicy: OnFailure - terminationGracePeriodSeconds: 0 - {{- if .Values.provisioning.podSecurityContext.enabled }} - securityContext: {{- omit .Values.provisioning.podSecurityContext "enabled" | toYaml | nindent 8 }} - {{- end }} - serviceAccountName: {{ template "minio.serviceAccountName" . }} - initContainers: - - name: wait-for-available-minio - image: {{ include "minio.image" . }} - imagePullPolicy: {{ .Values.image.pullPolicy | quote }} - {{- if .Values.provisioning.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.provisioning.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - command: - - /bin/bash - - -c - - |- - set -e; - echo "Waiting for Minio"; - wait-for-port \ - --host={{ include "common.names.fullname" . }} \ - --state=inuse \ - --timeout=120 \ - {{ .Values.service.ports.api | int64 }}; - echo "Minio is available"; - {{- if .Values.provisioning.resources }} - resources: {{- toYaml .Values.provisioning.resources | nindent 12 }} - {{- end }} - containers: - - name: minio - image: {{ include "minio.image" . }} - imagePullPolicy: {{ .Values.image.pullPolicy | quote }} - {{- if .Values.provisioning.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.provisioning.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.provisioning.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.provisioning.command "context" $) | nindent 12 }} - {{- else }} - command: - - /bin/bash - - -c - - >- - set -e; - echo "Start Minio provisioning"; - - function attachPolicy() { - local tmp=$(mc admin $1 info {{ $minioAlias }} $2 | sed -n -e 's/^Policy.*: \(.*\)$/\1/p'); - IFS=',' read -r -a CURRENT_POLICIES <<< "$tmp"; - if [[ ! "${CURRENT_POLICIES[*]}" =~ "$3" ]]; then - mc admin policy attach {{ $minioAlias }} $3 --$1=$2; - fi; - }; - - function detachDanglingPolicies() { - local tmp=$(mc admin $1 info {{ $minioAlias }} $2 | sed -n -e 's/^Policy.*: \(.*\)$/\1/p'); - IFS=',' read -r -a CURRENT_POLICIES <<< "$tmp"; - IFS=',' read -r -a DESIRED_POLICIES <<< "$3"; - for current in "${CURRENT_POLICIES[@]}"; do - if [[ ! "${DESIRED_POLICIES[*]}" =~ "${current}" ]]; then - mc admin policy detach {{ $minioAlias }} $current --$1=$2; - fi; - done; - } - - function addUsersFromFile() { - local username=$(grep -oP '^username=\K.+' $1); - local password=$(grep -oP '^password=\K.+' $1); - local disabled=$(grep -oP '^disabled=\K.+' $1); - local policies_list=$(grep -oP '^policies=\K.+' $1); - local set_policies=$(grep -oP '^setPolicies=\K.+' $1); - - mc admin user add {{ $minioAlias }} "${username}" "${password}"; - - IFS=',' read -r -a POLICIES <<< "${policies_list}"; - for policy in "${POLICIES[@]}"; do - attachPolicy user "${username}" "${policy}"; - done; - if [ "${set_policies}" == "true" ]; then - detachDanglingPolicies user "${username}" "${policies_list}"; - fi; - - local user_status="enable"; - if [[ "${disabled}" != "" && "${disabled,,}" == "true" ]]; then - user_status="disable"; - fi; - - mc admin user "${user_status}" {{ $minioAlias }} "${username}"; - }; - - {{- $minioUrl := printf "$MINIO_SCHEME://%s:%d" (include "common.names.fullname" .) (.Values.service.ports.api | int) }} - {{- $minioRootUser := ternary ("$(<$MINIO_ROOT_USER_FILE)") ("$MINIO_ROOT_USER") (.Values.auth.useCredentialsFiles) }} - {{- $minioRootPassword := ternary ("$(<$MINIO_ROOT_PASSWORD_FILE)") ("$MINIO_ROOT_PASSWORD") (.Values.auth.useCredentialsFiles) }} - mc alias set {{ $minioAlias }} {{ $minioUrl }} {{ $minioRootUser }} {{ $minioRootPassword }}; - - {{- range $config := .Values.provisioning.config }} - {{- $options := list }} - {{- range $name, $value := $config.options }} - {{- $options = (printf "%s=%s" $name $value) | append $options }} - {{- end }} - {{- $options := join " " $options }} - mc admin config set {{ $minioAlias }} {{ $config.name }} {{ $options }}; - {{- end }} - - mc admin service restart {{ $minioAlias }}; - - {{- range $policy := .Values.provisioning.policies }} - mc admin policy create {{ $minioAlias }} {{ $policy.name }} /etc/ilm/policy-{{ $policy.name }}.json; - {{- end }} - - {{- range $user := .Values.provisioning.users }} - mc admin user add {{ $minioAlias }} {{ $user.username }} {{ $user.password }}; - {{- range $policy := $user.policies }} - attachPolicy user {{ $user.username }} {{ $policy }}; - {{- end }} - {{- if $user.setPolicies }} - detachDanglingPolicies user {{ $user.username }} "{{ join "," $user.policies }}"; - {{- end }} - {{- $userStatus := ternary ("disable") ("enable") (and (not (empty $user.disabled)) $user.disabled) }} - mc admin user {{ $userStatus }} {{ $minioAlias }} {{ $user.username }}; - {{- end }} - {{- if gt (len .Values.provisioning.usersExistingSecrets) 0 }} - while read -d '' configFile; do - addUsersFromFile "${configFile}"; - done < <(find "/opt/bitnami/minio/users/" -type l -not -name '..data' -print0); - {{- end }} - - {{- range $group := .Values.provisioning.groups }} - mc admin group add {{ $minioAlias }} {{ $group.name }} {{ join " " $group.members }}; - {{- range $policy := $group.policies }} - attachPolicy group {{ $group.name }} {{ $policy }}; - {{- end }} - {{- if $group.setPolicies }} - detachDanglingPolicies group {{ $group.name }} "{{ join "," $group.policies }}"; - {{- end }} - {{- $groupStatus := ternary ("disable") ("enable") (and (not (empty $group.disabled)) $group.disabled) }} - mc admin group {{ $groupStatus }} {{ $minioAlias }} {{ $group.name }}; - {{- end }} - - {{- $isDistributedMode := (eq .Values.mode "distributed") }} - {{- range $bucket := .Values.provisioning.buckets }} - {{- $target := printf "%s/%s" $minioAlias $bucket.name }} - {{- $region := ternary (printf "--region=%s" $bucket.region) ("") (not (empty $bucket.region)) }} - {{- $withLock := ternary ("--with-lock") ("") (and (not (empty $bucket.withLock)) $bucket.withLock) }} - mc mb {{ $target }} --ignore-existing {{ $region }} {{ $withLock }}; - - {{- if $bucket.lifecycle }} - mc ilm import {{ $minioAlias }}/{{ $bucket.name }} < /etc/ilm/bucket-{{ $bucket.name }}.json; - {{- end }} - - {{- with $bucket.quota }} - {{- if eq .type "hard" }} - mc quota set {{ $minioAlias }}/{{ $bucket.name }} {{ if .size }}--size {{ .size }}{{ end }}; - {{- else }} - mc quota {{ .type }} {{ $minioAlias }}/{{ $bucket.name }} {{ if .size }}--size {{ .size }}{{ end }}; - {{- end }} - {{- end }} - - {{- if $isDistributedMode }} - {{- if (or ((empty $bucket.withLock)) (not $bucket.withLock)) }} - {{- $versioning := ternary ("enable") ("suspend") (and (not (empty $bucket.versioning)) $bucket.versioning) }} - mc version {{ $versioning }} {{ $minioAlias }}/{{ $bucket.name }}; - {{- end }} - {{- end }} - - {{- if $bucket.tags }} - {{- $target := printf "%s/%s" $minioAlias $bucket.name }} - {{- $tags := list }} - {{- range $name, $value := $bucket.tags }} - {{- $tags = (printf "%s=%s" $name $value) | append $tags }} - {{- end }} - {{- $tags := join "&" $tags | quote }} - mc tag set {{ $target }} {{ $tags }}; - {{- end }} - {{- end }} - - {{- if .Values.provisioning.extraCommands }} - {{ join ";" .Values.provisioning.extraCommands | nindent 14 }}; - {{- end }} - - echo "End Minio provisioning"; - {{- end }} - {{- if .Values.provisioning.args }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.provisioning.args "context" $) | nindent 12 }} - {{- end }} - env: - - name: MINIO_SCHEME - value: {{ ternary "https" "http" .Values.tls.enabled | quote }} - {{- if .Values.auth.useCredentialsFiles }} - - name: MINIO_ROOT_USER_FILE - value: "/opt/bitnami/minio/secrets/root-user" - {{- else }} - - name: MINIO_ROOT_USER - valueFrom: - secretKeyRef: - name: {{ include "minio.secretName" . }} - key: root-user - {{- end }} - {{- if .Values.auth.useCredentialsFiles }} - - name: MINIO_ROOT_PASSWORD_FILE - value: "/opt/bitnami/minio/secrets/root-password" - {{- else }} - - name: MINIO_ROOT_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "minio.secretName" . }} - key: root-password - {{- end }} - {{- if .Values.tls.mountPath }} - - name: MINIO_CERTS_DIR - value: {{ .Values.tls.mountPath | quote }} - {{- end }} - envFrom: - {{- if .Values.extraEnvVarsCM }} - - configMapRef: - name: {{ include "common.tplvalues.render" (dict "value" .Values.extraEnvVarsCM "context" $) }} - {{- end }} - {{- if .Values.extraEnvVarsSecret }} - - secretRef: - name: {{ include "common.tplvalues.render" (dict "value" .Values.extraEnvVarsSecret "context" $) }} - {{- end }} - {{- if .Values.provisioning.resources }} - resources: {{- toYaml .Values.provisioning.resources | nindent 12 }} - {{- end }} - volumeMounts: - {{- if .Values.provisioning.enabled }} - - name: minio-provisioning - mountPath: /etc/ilm - {{- end }} - {{- if .Values.auth.useCredentialsFiles }} - - name: minio-credentials - mountPath: /opt/bitnami/minio/secrets/ - {{- end }} - {{- if .Values.tls.enabled }} - - name: minio-certs - mountPath: {{ default "/certs" .Values.tls.mountPath }} - - name: minio-client-certs - mountPath: /.mc/certs - {{- end }} - {{- range $idx, $_ := .Values.provisioning.usersExistingSecrets }} - - name: {{ printf "users-secret-%d" $idx }} - mountPath: /opt/bitnami/minio/users/{{ $idx }}/ - {{- end }} - {{- if .Values.provisioning.extraVolumeMounts }} - {{- include "common.tplvalues.render" (dict "value" .Values.provisioning.extraVolumeMounts "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - volumes: - {{- if .Values.provisioning.enabled }} - - name: minio-provisioning - configMap: - name: {{ $fullname }} - {{- end }} - {{- if .Values.auth.useCredentialsFiles }} - - name: minio-credentials - secret: - secretName: {{ include "minio.secretName" . }} - {{- end }} - {{- range $idx, $userSecret := .Values.provisioning.usersExistingSecrets }} - - name: {{ printf "users-secret-%d" $idx }} - secret: - secretName: {{ $userSecret }} - {{- end }} - {{- if .Values.tls.enabled }} - - name: minio-certs - secret: - secretName: {{ include "minio.tlsSecretName" . }} - items: - - key: tls.crt - path: public.crt - - key: tls.key - path: private.key - - key: ca.crt - path: CAs/public.crt - - name: minio-client-certs - secret: - secretName: {{ include "minio.tlsSecretName" . }} - items: - - key: ca.crt - path: CAs/public.crt - {{- end }} - {{- if .Values.provisioning.extraVolumes }} - {{- include "common.tplvalues.render" (dict "value" .Values.provisioning.extraVolumes "context" $) | nindent 8 }} - {{- end }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/pvc.yaml b/helm/thanos/charts/minio/templates/pvc.yaml deleted file mode 100644 index 52dd6e1c..00000000 --- a/helm/thanos/charts/minio/templates/pvc.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if (include "minio.createPVC" .) }} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if or .Values.persistence.annotations .Values.commonAnnotations }} - annotations: - {{- if .Values.persistence.annotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.persistence.annotations "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} - {{- end }} -spec: - accessModes: - {{- range .Values.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} - {{- include "common.storage.class" (dict "persistence" .Values.persistence "global" .Values.global) | nindent 2 }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/secrets.yaml b/helm/thanos/charts/minio/templates/secrets.yaml deleted file mode 100644 index 9b3fdfca..00000000 --- a/helm/thanos/charts/minio/templates/secrets.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if (include "minio.createSecret" .) }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -type: Opaque -data: - root-user: {{ include "minio.secret.userValue" . | b64enc | quote }} - root-password: {{ include "minio.secret.passwordValue" . | b64enc | quote }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/service.yaml b/helm/thanos/charts/minio/templates/service.yaml deleted file mode 100644 index f822e25b..00000000 --- a/helm/thanos/charts/minio/templates/service.yaml +++ /dev/null @@ -1,58 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -apiVersion: v1 -kind: Service -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if or .Values.service.annotations .Values.commonAnnotations }} - annotations: - {{- if .Values.service.annotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.service.annotations "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} - {{- end }} -spec: - type: {{ .Values.service.type }} - {{- if and (eq .Values.service.type "ClusterIP") .Values.service.clusterIP }} - clusterIP: {{ .Values.service.clusterIP }} - {{- end }} - {{- if or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort") }} - externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy | quote }} - {{- end }} - {{- if and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: {{ .Values.service.loadBalancerSourceRanges }} - {{ end }} - {{- if and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerIP)) }} - loadBalancerIP: {{ .Values.service.loadBalancerIP }} - {{- end }} - ports: - - name: minio-api - port: {{ .Values.service.ports.api }} - targetPort: minio-api - {{- if and (or (eq .Values.service.type "NodePort") (eq .Values.service.type "LoadBalancer")) (not (empty .Values.service.nodePorts.api)) }} - nodePort: {{ .Values.service.nodePorts.api }} - {{- else if eq .Values.service.type "ClusterIP" }} - nodePort: null - {{- end }} - - name: minio-console - port: {{ .Values.service.ports.console }} - targetPort: minio-console - {{- if and (or (eq .Values.service.type "NodePort") (eq .Values.service.type "LoadBalancer")) (not (empty .Values.service.nodePorts.console)) }} - nodePort: {{ .Values.service.nodePorts.console }} - {{- else if eq .Values.service.type "ClusterIP" }} - nodePort: null - {{- end }} - {{- if .Values.service.extraPorts }} - {{- include "common.tplvalues.render" (dict "value" .Values.service.extraPorts "context" $) | nindent 4 }} - {{- end }} - selector: {{- include "common.labels.matchLabels" . | nindent 4 }} diff --git a/helm/thanos/charts/minio/templates/serviceaccount.yaml b/helm/thanos/charts/minio/templates/serviceaccount.yaml deleted file mode 100644 index c27a645e..00000000 --- a/helm/thanos/charts/minio/templates/serviceaccount.yaml +++ /dev/null @@ -1,28 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "minio.serviceAccountName" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if or .Values.serviceAccount.annotations .Values.commonAnnotations }} - annotations: - {{- if .Values.serviceAccount.annotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.serviceAccount.annotations "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} - {{- end }} -automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -secrets: - - name: {{ include "common.names.fullname" . }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/servicemonitor.yaml b/helm/thanos/charts/minio/templates/servicemonitor.yaml deleted file mode 100644 index 22f7ef61..00000000 --- a/helm/thanos/charts/minio/templates/servicemonitor.yaml +++ /dev/null @@ -1,56 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.metrics.serviceMonitor.enabled }} -apiVersion: {{ default "monitoring.coreos.com/v1" .Values.metrics.serviceMonitor.apiVersion }} -kind: ServiceMonitor -metadata: - name: {{ include "common.names.fullname" . }} - {{- if .Values.metrics.serviceMonitor.namespace }} - namespace: {{ .Values.metrics.serviceMonitor.namespace | quote }} - {{- else }} - namespace: {{ .Release.Namespace | quote }} - {{- end }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.metrics.serviceMonitor.labels }} - {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.labels "context" $) | nindent 4 }} - {{- end }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - endpoints: - - port: minio-api - path: {{ .Values.metrics.serviceMonitor.path }} - {{- if .Values.metrics.serviceMonitor.interval }} - interval: {{ .Values.metrics.serviceMonitor.interval }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.honorLabels }} - honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.metricRelabelings }} - metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.metricRelabelings | nindent 6 }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.relabelings }} - relabelings: {{- toYaml .Values.metrics.serviceMonitor.relabelings | nindent 6 }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.jobLabel }} - jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }} - {{- end }} - namespaceSelector: - matchNames: - - {{ .Release.Namespace | quote }} - selector: - matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }} - {{- if .Values.metrics.serviceMonitor.selector }} - {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }} - {{- end }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/standalone/deployment.yaml b/helm/thanos/charts/minio/templates/standalone/deployment.yaml deleted file mode 100644 index 3510e7d4..00000000 --- a/helm/thanos/charts/minio/templates/standalone/deployment.yaml +++ /dev/null @@ -1,263 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if (eq .Values.mode "standalone") }} -apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }} -kind: Deployment -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - selector: - matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }} - {{- if .Values.deployment.updateStrategy }} - strategy: {{- toYaml .Values.deployment.updateStrategy | nindent 4 }} - {{- end }} - template: - metadata: - labels: {{- include "common.labels.standard" . | nindent 8 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 8 }} - {{- end }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if or .Values.podAnnotations (include "minio.createSecret" .) }} - annotations: - {{- if (include "minio.createSecret" .) }} - checksum/credentials-secret: {{ include (print $.Template.BasePath "/secrets.yaml") . | sha256sum }} - {{- end }} - {{- if .Values.podAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - {{- end }} - spec: - {{- include "minio.imagePullSecrets" . | nindent 6 }} - {{- if .Values.schedulerName }} - schedulerName: {{ .Values.schedulerName }} - {{- end }} - serviceAccountName: {{ template "minio.serviceAccountName" . }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- else }} - affinity: - podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAffinityPreset "context" $) | nindent 10 }} - podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAntiAffinityPreset "context" $) | nindent 10 }} - nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.nodeAffinityPreset.type "key" .Values.nodeAffinityPreset.key "values" .Values.nodeAffinityPreset.values) | nindent 10 }} - {{- end }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.topologySpreadConstraints }} - topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.topologySpreadConstraints "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.priorityClassName }} - priorityClassName: {{ .Values.priorityClassName | quote }} - {{- end }} - {{- if .Values.hostAliases }} - hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.hostAliases "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.podSecurityContext.enabled }} - securityContext: {{- omit .Values.podSecurityContext "enabled" | toYaml | nindent 8 }} - {{- end }} - {{- if .Values.terminationGracePeriodSeconds }} - terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }} - {{- end }} - {{- if or .Values.initContainers (and .Values.volumePermissions.enabled .Values.persistence.enabled) }} - initContainers: - {{- if .Values.initContainers }} - {{- include "common.tplvalues.render" (dict "value" .Values.initContainers "context" $) | nindent 8 }} - {{- end }} - {{- if and .Values.volumePermissions.enabled .Values.persistence.enabled }} - - name: volume-permissions - image: {{ template "minio.volumePermissions.image" . }} - imagePullPolicy: {{ default "" .Values.volumePermissions.image.pullPolicy | quote }} - command: - - /bin/bash - - -ec - - | - chown -R {{ .Values.containerSecurityContext.runAsUser }}:{{ .Values.podSecurityContext.fsGroup }} {{ .Values.persistence.mountPath }} - securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }} - {{- if .Values.volumePermissions.resources }} - resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }} - {{- end }} - volumeMounts: - - name: data - mountPath: {{ .Values.persistence.mountPath }} - {{- end }} - {{- end }} - containers: - - name: minio - image: {{ include "minio.image" . }} - imagePullPolicy: {{ .Values.image.pullPolicy | quote }} - {{- if .Values.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.command "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.args }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.args "context" $) | nindent 12 }} - {{- end }} - env: - - name: BITNAMI_DEBUG - value: {{ ternary "true" "false" .Values.image.debug | quote }} - - name: MINIO_SCHEME - value: {{ ternary "https" "http" .Values.tls.enabled | quote }} - - name: MINIO_FORCE_NEW_KEYS - value: {{ ternary "yes" "no" .Values.auth.forceNewKeys | quote }} - {{- if .Values.auth.useCredentialsFiles }} - - name: MINIO_ROOT_USER_FILE - value: "/opt/bitnami/minio/secrets/root-user" - {{- else }} - - name: MINIO_ROOT_USER - valueFrom: - secretKeyRef: - name: {{ include "minio.secretName" . }} - key: root-user - {{- end }} - {{- if .Values.auth.useCredentialsFiles }} - - name: MINIO_ROOT_PASSWORD_FILE - value: "/opt/bitnami/minio/secrets/root-password" - {{- else }} - - name: MINIO_ROOT_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "minio.secretName" . }} - key: root-password - {{- end }} - {{- if .Values.defaultBuckets }} - - name: MINIO_DEFAULT_BUCKETS - value: {{ .Values.defaultBuckets }} - {{- end }} - - name: MINIO_BROWSER - value: {{ ternary "off" "on" .Values.disableWebUI | quote }} - - name: MINIO_PROMETHEUS_AUTH_TYPE - value: {{ .Values.metrics.prometheusAuthType | quote }} - - name: MINIO_CONSOLE_PORT_NUMBER - value: {{ .Values.containerPorts.console | quote }} - {{- if .Values.tls.mountPath }} - - name: MINIO_CERTS_DIR - value: {{ .Values.tls.mountPath | quote }} - {{- end }} - {{- if .Values.extraEnvVars }} - {{- include "common.tplvalues.render" (dict "value" .Values.extraEnvVars "context" $) | nindent 12 }} - {{- end }} - envFrom: - {{- if .Values.extraEnvVarsCM }} - - configMapRef: - name: {{ include "common.tplvalues.render" (dict "value" .Values.extraEnvVarsCM "context" $) }} - {{- end }} - {{- if .Values.extraEnvVarsSecret }} - - secretRef: - name: {{ include "common.tplvalues.render" (dict "value" .Values.extraEnvVarsSecret "context" $) }} - {{- end }} - ports: - - name: minio-api - containerPort: {{ .Values.containerPorts.api }} - protocol: TCP - - name: minio-console - containerPort: {{ .Values.containerPorts.console }} - protocol: TCP - {{- if .Values.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.livenessProbe.enabled }} - livenessProbe: - httpGet: - path: /minio/health/live - port: minio-api - scheme: {{ ternary "HTTPS" "HTTP" .Values.tls.enabled | quote }} - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - {{- end }} - {{- if .Values.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.readinessProbe.enabled }} - readinessProbe: - tcpSocket: - port: minio-api - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - {{- end }} - {{- if .Values.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.startupProbe.enabled }} - startupProbe: - tcpSocket: - port: minio-console - initialDelaySeconds: {{ .Values.startupProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.startupProbe.periodSeconds }} - timeoutSeconds: {{ .Values.startupProbe.timeoutSeconds }} - successThreshold: {{ .Values.startupProbe.successThreshold }} - failureThreshold: {{ .Values.startupProbe.failureThreshold }} - {{- end }} - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 12 }} - {{- end }} - {{- if .Values.lifecycleHooks }} - lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.lifecycleHooks "context" $) | nindent 12 }} - {{- end }} - volumeMounts: - {{- if .Values.auth.useCredentialsFiles }} - - name: minio-credentials - mountPath: /opt/bitnami/minio/secrets/ - {{- end }} - - name: data - mountPath: {{ .Values.persistence.mountPath }} - {{- if .Values.tls.enabled }} - - name: minio-certs - mountPath: {{ default "/certs" .Values.tls.mountPath }} - {{- end }} - {{- if .Values.extraVolumeMounts }} - {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumeMounts "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.sidecars }} - {{- include "common.tplvalues.render" (dict "value" .Values.sidecars "context" $) | nindent 8 }} - {{- end }} - volumes: - {{- if .Values.auth.useCredentialsFiles }} - - name: minio-credentials - secret: - secretName: {{ include "minio.secretName" . }} - {{- end }} - - name: data - {{- if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ include "minio.claimName" . }} - {{- else }} - emptyDir: {} - {{- end }} - {{- if .Values.tls.enabled }} - - name: minio-certs - secret: - secretName: {{ include "minio.tlsSecretName" . }} - items: - - key: tls.crt - path: public.crt - - key: tls.key - path: private.key - - key: ca.crt - path: CAs/public.crt - {{- end }} - {{- if .Values.extraVolumes }} - {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumes "context" $) | nindent 8 }} - {{- end }} -{{- end }} diff --git a/helm/thanos/charts/minio/templates/tls-secrets.yaml b/helm/thanos/charts/minio/templates/tls-secrets.yaml deleted file mode 100644 index 20c9040d..00000000 --- a/helm/thanos/charts/minio/templates/tls-secrets.yaml +++ /dev/null @@ -1,78 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.ingress.enabled }} -{{- if .Values.ingress.secrets }} -{{- range .Values.ingress.secrets }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ .name }} - namespace: {{ $.Release.Namespace | quote }} - labels: {{- include "common.labels.standard" $ | nindent 4 }} - {{- if $.Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" $.Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if $.Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $.Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -type: kubernetes.io/tls -data: - tls.crt: {{ .certificate | b64enc }} - tls.key: {{ .key | b64enc }} ---- -{{- end }} -{{- end }} -{{- if and .Values.ingress.tls .Values.ingress.selfSigned }} -{{- $secretName := printf "%s-tls" .Values.ingress.hostname }} -{{- $ca := genCA "minio-ca" 365 }} -{{- $cert := genSignedCert .Values.ingress.hostname nil (list .Values.ingress.hostname) 365 $ca }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ $secretName }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -type: kubernetes.io/tls -data: - tls.crt: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "tls.crt" "defaultValue" $cert.Cert "context" $) }} - tls.key: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "tls.key" "defaultValue" $cert.Key "context" $) }} - ca.crt: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "ca.crt" "defaultValue" $ca.Cert "context" $) }} -{{- end }} -{{- end }} -{{- if (include "minio.createTlsSecret" .) }} -{{- $secretName := printf "%s-crt" (include "common.names.fullname" .) }} -{{- $ca := genCA "minio-ca" 365 }} -{{- $releaseNamespace := .Release.Namespace }} -{{- $clusterDomain := .Values.clusterDomain }} -{{- $fullname := include "common.names.fullname" . }} -{{- $serviceName := include "common.names.fullname" . }} -{{- $headlessServiceName := printf "%s-headless" (include "common.names.fullname" .) }} -{{- $altNames := list (printf "*.%s.%s.svc.%s" $serviceName $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $serviceName $releaseNamespace $clusterDomain) (printf "*.%s.%s.svc.%s" $headlessServiceName $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $headlessServiceName $releaseNamespace $clusterDomain) "127.0.0.1" "localhost" $fullname }} -{{- $cert := genSignedCert $fullname nil $altNames 365 $ca }} ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ $secretName }} - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -type: kubernetes.io/tls -data: - tls.crt: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "tls.crt" "defaultValue" $cert.Cert "context" $) }} - tls.key: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "tls.key" "defaultValue" $cert.Key "context" $) }} - ca.crt: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "ca.crt" "defaultValue" $ca.Cert "context" $) }} -{{- end }} diff --git a/helm/thanos/charts/minio/values.yaml b/helm/thanos/charts/minio/values.yaml deleted file mode 100644 index f83527e1..00000000 --- a/helm/thanos/charts/minio/values.yaml +++ /dev/null @@ -1,1078 +0,0 @@ -# Copyright VMware, Inc. -# SPDX-License-Identifier: APACHE-2.0 - -## @section Global parameters -## Global Docker image parameters -## Please, note that this will override the image parameters, including dependencies, configured to use the global value -## Current available global Docker image parameters: imageRegistry, imagePullSecrets and storageClass - -## @param global.imageRegistry Global Docker image registry -## @param global.imagePullSecrets Global Docker registry secret names as an array -## @param global.storageClass Global StorageClass for Persistent Volume(s) -## -global: - imageRegistry: "" - ## e.g. - ## imagePullSecrets: - ## - myRegistryKeySecretName - ## - imagePullSecrets: [] - storageClass: "" - -## @section Common parameters - -## @param nameOverride String to partially override common.names.fullname template (will maintain the release name) -## -nameOverride: "" -## @param fullnameOverride String to fully override common.names.fullname template -## -fullnameOverride: "" -## @param commonLabels Labels to add to all deployed objects -## -commonLabels: {} -## @param commonAnnotations Annotations to add to all deployed objects -## -commonAnnotations: {} -## @param kubeVersion Force target Kubernetes version (using Helm capabilities if not set) -## -kubeVersion: "" -## @param clusterDomain Default Kubernetes cluster domain -## -clusterDomain: cluster.local -## @param extraDeploy Array of extra objects to deploy with the release -## -extraDeploy: [] - -## @section MinIO® parameters - -## Bitnami MinIO® image version -## ref: https://hub.docker.com/r/bitnami/minio/tags/ -## @param image.registry MinIO® image registry -## @param image.repository MinIO® image repository -## @param image.tag MinIO® image tag (immutable tags are recommended) -## @param image.digest MinIO® image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag -## @param image.pullPolicy Image pull policy -## @param image.pullSecrets Specify docker-registry secret names as an array -## @param image.debug Specify if debug logs should be enabled -## -image: - registry: docker.io - repository: bitnami/minio - tag: 2023.7.18-debian-11-r0 - digest: "" - ## Specify a imagePullPolicy - ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images - ## - 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/ - ## e.g: - ## pullSecrets: - ## - myRegistryKeySecretName - ## - pullSecrets: [] - ## Set to true if you would like to see extra information on logs - ## - debug: false -## Bitnami MinIO® Client image version -## ref: https://hub.docker.com/r/bitnami/minio-client/tags/ -## @param clientImage.registry MinIO® Client image registry -## @param clientImage.repository MinIO® Client image repository -## @param clientImage.tag MinIO® Client image tag (immutable tags are recommended) -## @param clientImage.digest MinIO® Client image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag -## -clientImage: - registry: docker.io - repository: bitnami/minio-client - tag: 2023.7.18-debian-11-r0 - digest: "" -## @param mode MinIO® server mode (`standalone` or `distributed`) -## ref: https://docs.minio.io/docs/distributed-minio-quickstart-guide -## -mode: standalone -## MinIO® authentication parameters -## -auth: - ## @param auth.rootUser MinIO® root username - ## - rootUser: admin - ## @param auth.rootPassword Password for MinIO® root user - ## - rootPassword: "" - ## @param auth.existingSecret Use existing secret for credentials details (`auth.rootUser` and `auth.rootPassword` will be ignored and picked up from this secret). The secret has to contain the keys `root-user` and `root-password`) - ## - existingSecret: "" - ## @param auth.forcePassword Force users to specify required passwords - ## - forcePassword: false - ## @param auth.useCredentialsFiles Mount credentials as a files instead of using an environment variable - ## - useCredentialsFiles: false - ## @param auth.forceNewKeys Force root credentials (user and password) to be reconfigured every time they change in the secrets - ## - forceNewKeys: false -## @param defaultBuckets Comma, semi-colon or space separated list of buckets to create at initialization (only in standalone mode) -## e.g: -## defaultBuckets: "my-bucket, my-second-bucket" -## -defaultBuckets: "" -## @param disableWebUI Disable MinIO® Web UI -## ref: https://github.com/minio/minio/tree/master/docs/config/#browser -## -disableWebUI: false -## Enable tls in front of MinIO® containers. -## -tls: - ## @param tls.enabled Enable tls in front of the container - ## - enabled: false - ## @param tls.autoGenerated Generate automatically self-signed TLS certificates - ## - autoGenerated: false - ## @param tls.existingSecret Name of an existing secret holding the certificate information - ## - existingSecret: "" - ## @param tls.mountPath The mount path where the secret will be located - ## Custom mount path where the certificates will be located, if empty will default to /certs - mountPath: "" -## @param extraEnvVars Extra environment variables to be set on MinIO® container -## e.g: -## extraEnvVars: -## - name: FOO -## value: "bar" -## -extraEnvVars: [] -## @param extraEnvVarsCM ConfigMap with extra environment variables -## -extraEnvVarsCM: "" -## @param extraEnvVarsSecret Secret with extra environment variables -## -extraEnvVarsSecret: "" -## @param command Default container command (useful when using custom images). Use array form -## -command: [] -## @param args Default container args (useful when using custom images). Use array form -## -args: [] - -## @section MinIO® deployment/statefulset parameters - -## @param schedulerName Specifies the schedulerName, if it's nil uses kube-scheduler -## https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ -## -schedulerName: "" -## @param terminationGracePeriodSeconds In seconds, time the given to the MinIO pod needs to terminate gracefully -## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods -## -terminationGracePeriodSeconds: "" -## MinIO® deployment parameters -## Only when 'mode' is 'standalone' -## -deployment: - ## @param deployment.updateStrategy.type Deployment strategy type - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies - ## e.g: - ## updateStrategy: - ## type: RollingUpdate - ## rollingUpdate: - ## maxSurge: 25% - ## maxUnavailable: 25% - ## - updateStrategy: - type: Recreate -## MinIO® statefulset parameters -## Only when mode is 'distributed' -## -statefulset: - ## @param statefulset.updateStrategy.type StatefulSet strategy type - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies - ## e.g: - ## updateStrategy: - ## type: RollingUpdate - ## rollingUpdate: - ## maxSurge: 25% - ## maxUnavailable: 25% - ## - updateStrategy: - type: RollingUpdate - ## @param statefulset.podManagementPolicy StatefulSet controller supports relax its ordering guarantees while preserving its uniqueness and identity guarantees. There are two valid pod management policies: OrderedReady and Parallel - ## ref: https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#pod-management-policy - ## - podManagementPolicy: Parallel - ## @param statefulset.replicaCount Number of pods per zone (only for MinIO® distributed mode). Should be even and `>= 4` - ## - replicaCount: 4 - ## @param statefulset.zones Number of zones (only for MinIO® distributed mode) - ## - zones: 1 - ## @param statefulset.drivesPerNode Number of drives attached to every node (only for MinIO® distributed mode) - ## - drivesPerNode: 1 - -## MinIO® provisioning -## -provisioning: - ## @param provisioning.enabled Enable MinIO® provisioning Job - ## - enabled: false - ## @param provisioning.schedulerName Name of the k8s scheduler (other than default) for MinIO® provisioning - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - schedulerName: "" - ## @param provisioning.podAnnotations Provisioning Pod annotations. - ## - podAnnotations: {} - ## @param provisioning.command Default provisioning container command (useful when using custom images). Use array form - ## - command: [] - ## @param provisioning.args Default provisioning container args (useful when using custom images). Use array form - ## - args: [] - ## @param provisioning.extraCommands Optionally specify extra list of additional commands for MinIO® provisioning pod - ## - extraCommands: [] - ## @param provisioning.extraVolumes Optionally specify extra list of additional volumes for MinIO® provisioning pod - ## - extraVolumes: [] - ## @param provisioning.extraVolumeMounts Optionally specify extra list of additional volumeMounts for MinIO® provisioning container - ## - extraVolumeMounts: [] - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - ## @param provisioning.resources.limits The resources limits for the container - ## @param provisioning.resources.requests The requested resources for the container - ## - resources: - ## Example: - ## limits: - ## cpu: 100m - ## memory: 64Mi - limits: {} - ## Examples: - ## requests: - ## cpu: 200m - ## memory: 128Mi - requests: {} - ## @param provisioning.policies MinIO® policies provisioning - ## https://docs.min.io/docs/minio-admin-complete-guide.html#policy - ## e.g. - ## policies: - ## - name: custom-bucket-specific-policy - ## statements: - ## - resources: - ## - "arn:aws:s3:::my-bucket" - ## actions: - ## - "s3:GetBucketLocation" - ## - "s3:ListBucket" - ## - "s3:ListBucketMultipartUploads" - ## - resources: - ## - "arn:aws:s3:::my-bucket/*" - ## # Allowed values: "Allow" | "Deny" - ## # Defaults to "Deny" if not specified - ## effect: "Allow" - ## actions: - ## - "s3:AbortMultipartUpload" - ## - "s3:DeleteObject" - ## - "s3:GetObject" - ## - "s3:ListMultipartUploadParts" - ## - "s3:PutObject" - policies: [] - ## @param provisioning.users MinIO® users provisioning. Can be used in addition to provisioning.usersExistingSecrets. - ## https://docs.min.io/docs/minio-admin-complete-guide.html#user - ## e.g. - ## users: - ## - username: test-username - ## password: test-password - ## disabled: false - ## policies: - ## - readwrite - ## - consoleAdmin - ## - diagnostics - ## # When set to true, it will replace all policies with the specified. - ## # When false, the policies will be added to the existing. - ## setPolicies: false - users: [] - ## @param provisioning.usersExistingSecrets Array if existing secrets containing MinIO® users to be provisioned. Can be used in addition to provisioning.users. - ## https://docs.min.io/docs/minio-admin-complete-guide.html#user - ## - ## Instead of configuring users inside values.yaml, referring to existing Kubernetes secrets containing user - ## configurations is possible. - ## e.g. - ## usersExistingSecrets: - ## - centralized-minio-users - ## - ## All provided Kubernetes secrets require a specific data structure. The same data from the provisioning.users example above - ## can be defined via secrets with the following data structure. The secret keys have no meaning to the provisioning job except that - ## they are used as filenames. - ## ## apiVersion: v1 - ## ## kind: Secret - ## ## metadata: - ## ## name: centralized-minio-users - ## ## type: Opaque - ## ## stringData: - ## ## username1: | - ## ## username=test-username - ## ## password=test-password - ## ## disabled=false - ## ## policies=readwrite,consoleAdmin,diagnostics - ## ## setPolicies=false - usersExistingSecrets: [] - ## @param provisioning.groups MinIO® groups provisioning - ## https://docs.min.io/docs/minio-admin-complete-guide.html#group - ## e.g. - ## groups - ## - name: test-group - ## disabled: false - ## members: - ## - test-username - ## policies: - ## - readwrite - ## # When set to true, it will replace all policies with the specified. - ## # When false, the policies will be added to the existing. - ## setPolicies: false - groups: [] - ## @param provisioning.buckets MinIO® buckets, versioning, lifecycle, quota and tags provisioning - ## Buckets https://docs.min.io/docs/minio-client-complete-guide.html#mb - ## Lifecycle https://docs.min.io/docs/minio-client-complete-guide.html#ilm - ## Quotas https://docs.min.io/docs/minio-admin-complete-guide.html#bucket - ## Tags https://docs.min.io/docs/minio-client-complete-guide.html#tag - ## Versioning https://docs.min.io/docs/minio-client-complete-guide.html#version - ## e.g. - ## buckets: - ## - name: test-bucket - ## region: us-east-1 - ## # Only when mode is 'distributed' - ## # ref: https://docs.minio.io/docs/distributed-minio-quickstart-guide - ## versioning: false - ## # Versioning is automatically enabled if withLock is true - ## # ref: https://docs.min.io/docs/minio-bucket-versioning-guide.html - ## withLock: true - ## # Only when mode is 'distributed' - ## # ref: https://docs.minio.io/docs/distributed-minio-quickstart-guide - ## lifecycle: - ## - id: TestPrefix7dRetention - ## prefix: test-prefix - ## disabled: false - ## expiry: - ## days: 7 - ## # Days !OR! date - ## # date: "2021-11-11T00:00:00Z" - ## nonconcurrentDays: 3 - ## # Only when mode is 'distributed' - ## # ref: https://docs.minio.io/docs/distributed-minio-quickstart-guide - ## quota: - ## # set (hard still works as an alias but is deprecated) or clear(+ omit size) - ## type: set - ## size: 10GiB - ## tags: - ## key1: value1 - buckets: [] - ## @param provisioning.config MinIO® config provisioning - ## https://docs.min.io/docs/minio-server-configuration-guide.html - ## e.g. - ## config: - ## - name: region - ## options: - ## name: us-east-1 - config: [] - ## MinIO® pod Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod - ## @param provisioning.podSecurityContext.enabled Enable pod Security Context - ## @param provisioning.podSecurityContext.fsGroup Group ID for the container - ## - podSecurityContext: - enabled: true - fsGroup: 1001 - ## MinIO® container Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container - ## @param provisioning.containerSecurityContext.enabled Enable container Security Context - ## @param provisioning.containerSecurityContext.runAsUser User ID for the container - ## @param provisioning.containerSecurityContext.runAsNonRoot Avoid running as root User - ## - containerSecurityContext: - enabled: true - runAsUser: 1001 - runAsNonRoot: true - -## @param hostAliases MinIO® pod host aliases -## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ -## -hostAliases: [] -## @param containerPorts.api MinIO® container port to open for MinIO® API -## @param containerPorts.console MinIO® container port to open for MinIO® Console -## -containerPorts: - api: 9000 - console: 9001 -## MinIO® pod Security Context -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod -## @param podSecurityContext.enabled Enable pod Security Context -## @param podSecurityContext.fsGroup Group ID for the container -## -podSecurityContext: - enabled: true - fsGroup: 1001 -## MinIO® container Security Context -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container -## @param containerSecurityContext.enabled Enable container Security Context -## @param containerSecurityContext.runAsUser User ID for the container -## @param containerSecurityContext.runAsNonRoot Avoid running as root User -## -containerSecurityContext: - enabled: true - runAsUser: 1001 - runAsNonRoot: true -## @param podLabels Extra labels for MinIO® pods -## Ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ -## -podLabels: {} -## @param podAnnotations Annotations for MinIO® pods -## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ -## -podAnnotations: {} -## @param podAffinityPreset Pod affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard` -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity -## -podAffinityPreset: "" -## @param podAntiAffinityPreset Pod anti-affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard` -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity -## -podAntiAffinityPreset: soft -## Node affinity preset -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity -## -nodeAffinityPreset: - ## @param nodeAffinityPreset.type Node affinity preset type. Ignored if `affinity` is set. Allowed values: `soft` or `hard` - ## - type: "" - ## @param nodeAffinityPreset.key Node label key to match. Ignored if `affinity` is set. - ## E.g. - ## key: "kubernetes.io/e2e-az-name" - ## - key: "" - ## @param nodeAffinityPreset.values Node label values to match. Ignored if `affinity` is set. - ## E.g. - ## values: - ## - e2e-az1 - ## - e2e-az2 - ## - values: [] -## @param affinity Affinity for pod assignment. Evaluated as a template. -## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity -## Note: podAffinityPreset, podAntiAffinityPreset, and nodeAffinityPreset will be ignored when it's set -## -affinity: {} -## @param nodeSelector Node labels for pod assignment. Evaluated as a template. -## ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} -## @param tolerations Tolerations for pod assignment. Evaluated as a template. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] -## @param topologySpreadConstraints Topology Spread Constraints for MinIO® pods assignment spread across your cluster among failure-domains -## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods -## -topologySpreadConstraints: [] -## @param priorityClassName MinIO® pods' priorityClassName -## -priorityClassName: "" -## MinIO® containers' resource requests and limits -## ref: https://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## @param resources.limits The resources limits for the MinIO® container -## @param resources.requests The requested resources for the MinIO® container -## -resources: - ## Example: - ## limits: - ## cpu: 250m - ## memory: 256Mi - limits: {} - ## Examples: - ## requests: - ## cpu: 250m - ## memory: 256Mi - requests: {} -## Configure extra options for liveness probe -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## @param livenessProbe.enabled Enable livenessProbe -## @param livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe -## @param livenessProbe.periodSeconds Period seconds for livenessProbe -## @param livenessProbe.timeoutSeconds Timeout seconds for livenessProbe -## @param livenessProbe.failureThreshold Failure threshold for livenessProbe -## @param livenessProbe.successThreshold Success threshold for livenessProbe -## -livenessProbe: - enabled: true - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 5 -## Configure extra options for readiness probe -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## @param readinessProbe.enabled Enable readinessProbe -## @param readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe -## @param readinessProbe.periodSeconds Period seconds for readinessProbe -## @param readinessProbe.timeoutSeconds Timeout seconds for readinessProbe -## @param readinessProbe.failureThreshold Failure threshold for readinessProbe -## @param readinessProbe.successThreshold Success threshold for readinessProbe -## -readinessProbe: - enabled: true - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 5 -## Configure extra options for startupProbe probe -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## @param startupProbe.enabled Enable startupProbe -## @param startupProbe.initialDelaySeconds Initial delay seconds for startupProbe -## @param startupProbe.periodSeconds Period seconds for startupProbe -## @param startupProbe.timeoutSeconds Timeout seconds for startupProbe -## @param startupProbe.failureThreshold Failure threshold for startupProbe -## @param startupProbe.successThreshold Success threshold for startupProbe -## -startupProbe: - enabled: false - initialDelaySeconds: 0 - periodSeconds: 10 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 60 -## @param customLivenessProbe Override default liveness probe -## -customLivenessProbe: {} -## @param customReadinessProbe Override default readiness probe -## -customReadinessProbe: {} -## @param customStartupProbe Override default startup probe -## -customStartupProbe: {} -## @param lifecycleHooks for the MinIO® container(s) to automate configuration before or after startup -## -lifecycleHooks: {} -## @param extraVolumes Optionally specify extra list of additional volumes for MinIO® pods -## -extraVolumes: [] -## @param extraVolumeMounts Optionally specify extra list of additional volumeMounts for MinIO® container(s) -## -extraVolumeMounts: [] -## @param initContainers Add additional init containers to the MinIO® pods -## e.g: -## initContainers: -## - name: your-image-name -## image: your-image -## imagePullPolicy: Always -## ports: -## - name: portname -## containerPort: 1234 -## -initContainers: [] -## @param sidecars Add additional sidecar containers to the MinIO® pods -## e.g: -## sidecars: -## - name: your-image-name -## image: your-image -## imagePullPolicy: Always -## ports: -## - name: portname -## containerPort: 1234 -## -sidecars: [] - -## @section Traffic exposure parameters - -## MinIO® Service properties -## -service: - ## @param service.type MinIO® service type - ## - type: ClusterIP - ## @param service.ports.api MinIO® API service port - ## @param service.ports.console MinIO® Console service port - ## - ports: - api: 9000 - console: 9001 - ## @param service.nodePorts.api Specify the MinIO® API nodePort value for the LoadBalancer and NodePort service types - ## @param service.nodePorts.console Specify the MinIO® Console nodePort value for the LoadBalancer and NodePort service types - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport - ## - nodePorts: - api: "" - console: "" - ## @param service.clusterIP Service Cluster IP - ## e.g.: - ## clusterIP: None - ## - clusterIP: "" - ## @param service.loadBalancerIP loadBalancerIP if service type is `LoadBalancer` (optional, cloud specific) - ## ref: https://kubernetes.io/docs/user-guide/services/#type-loadbalancer - ## - loadBalancerIP: "" - ## @param service.loadBalancerSourceRanges Addresses that are allowed when service is LoadBalancer - ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service - ## e.g: - ## loadBalancerSourceRanges: - ## - 10.10.10.0/24 - ## - loadBalancerSourceRanges: [] - ## @param service.externalTrafficPolicy Enable client source IP preservation - ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - ## - externalTrafficPolicy: Cluster - ## @param service.extraPorts Extra ports to expose in the service (normally used with the `sidecar` value) - ## - extraPorts: [] - ## @param service.annotations Annotations for MinIO® service - ## This can be used to set the LoadBalancer service type to internal only. - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer - ## - annotations: {} - ## Headless service properties - ## - headless: - ## @param service.headless.annotations Annotations for the headless service. - ## - annotations: {} -## Configure the ingress resource that allows you to access the -## MinIO® Console. Set up the URL -## ref: https://kubernetes.io/docs/user-guide/ingress/ -## -ingress: - ## @param ingress.enabled Enable ingress controller resource for MinIO Console - ## - enabled: false - ## @param ingress.apiVersion Force Ingress API version (automatically detected if not set) - ## - apiVersion: "" - ## @param ingress.ingressClassName IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+) - ## This is supported in Kubernetes 1.18+ and required if you have more than one IngressClass marked as the default for your cluster. - ## ref: https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/ - ## - ingressClassName: "" - ## @param ingress.hostname Default host for the ingress resource - ## - hostname: minio.local - ## @param ingress.path The Path to MinIO®. You may need to set this to '/*' in order to use this with ALB ingress controllers. - ## - path: / - ## @param ingress.pathType Ingress path type - ## - pathType: ImplementationSpecific - ## @param ingress.servicePort Service port to be used - ## Default is http. Alternative is https. - ## - servicePort: minio-console - ## @param ingress.annotations Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations. - ## For a full list of possible ingress annotations, please see - ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md - ## Use this parameter to set the required annotations for cert-manager, see - ## ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations - ## - ## e.g: - ## annotations: - ## kubernetes.io/ingress.class: nginx - ## cert-manager.io/cluster-issuer: cluster-issuer-name - ## - annotations: {} - ## @param ingress.tls Enable TLS configuration for the hostname defined at `ingress.hostname` parameter - ## TLS certificates will be retrieved from a TLS secret with name: `{{- printf "%s-tls" .Values.ingress.hostname }}` - ## You can: - ## - Use the `ingress.secrets` parameter to create this TLS secret - ## - Rely on cert-manager to create it by setting the corresponding annotations - ## - Rely on Helm to create self-signed certificates by setting `ingress.selfSigned=true` - ## - tls: false - ## @param ingress.selfSigned Create a TLS secret for this ingress record using self-signed certificates generated by Helm - ## - selfSigned: false - ## @param ingress.extraHosts The list of additional hostnames to be covered with this ingress record. - ## Most likely the hostname above will be enough, but in the event more hosts are needed, this is an array - ## e.g: - ## extraHosts: - ## - name: minio.local - ## path: / - ## - extraHosts: [] - ## @param ingress.extraPaths Any additional paths that may need to be added to the ingress under the main host - ## For example: The ALB ingress controller requires a special rule for handling SSL redirection. - ## extraPaths: - ## - path: /* - ## backend: - ## serviceName: ssl-redirect - ## servicePort: use-annotation - ## - extraPaths: [] - ## @param ingress.extraTls The tls configuration for additional hostnames to be covered with this ingress record. - ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls - ## e.g: - ## extraTls: - ## - hosts: - ## - minio.local - ## secretName: minio.local-tls - ## - extraTls: [] - ## @param ingress.secrets If you're providing your own certificates, please use this to add the certificates as secrets - ## key and certificate are expected in PEM format - ## name should line up with a secretName set further up - ## - ## If it is not set and you're using cert-manager, this is unneeded, as it will create a secret for you with valid certificates - ## If it is not set and you're NOT using cert-manager either, self-signed certificates will be created valid for 365 days - ## It is also possible to create and manage the certificates outside of this helm chart - ## Please see README.md for more information - ## - ## Example - ## secrets: - ## - name: minio.local-tls - ## key: "" - ## certificate: "" - ## - secrets: [] - ## @param ingress.extraRules Additional rules to be covered with this ingress record - ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-rules - ## e.g: - ## extraRules: - ## - host: example.local - ## http: - ## path: / - ## backend: - ## service: - ## name: example-svc - ## port: - ## name: http - ## - extraRules: [] - -## Configure the ingress resource that allows you to access the -## MinIO® API. Set up the URL -## ref: https://kubernetes.io/docs/user-guide/ingress/ -## -apiIngress: - ## @param apiIngress.enabled Enable ingress controller resource for MinIO API - ## - enabled: false - ## @param apiIngress.apiVersion Force Ingress API version (automatically detected if not set) - ## - apiVersion: "" - ## @param apiIngress.ingressClassName IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+) - ## This is supported in Kubernetes 1.18+ and required if you have more than one IngressClass marked as the default for your cluster. - ## ref: https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/ - ## - ingressClassName: "" - ## @param apiIngress.hostname Default host for the ingress resource - ## - hostname: minio.local - ## @param apiIngress.path The Path to MinIO®. You may need to set this to '/*' in order to use this with ALB ingress controllers. - ## - path: / - ## @param apiIngress.pathType Ingress path type - ## - pathType: ImplementationSpecific - ## @param apiIngress.servicePort Service port to be used - ## Default is http. Alternative is https. - ## - servicePort: minio-api - ## @param apiIngress.annotations Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations. - ## For a full list of possible ingress annotations, please see - ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md - ## Use this parameter to set the required annotations for cert-manager, see - ## ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations - ## - ## e.g: - ## annotations: - ## kubernetes.io/ingress.class: nginx - ## cert-manager.io/cluster-issuer: cluster-issuer-name - ## - annotations: {} - ## @param apiIngress.tls Enable TLS configuration for the hostname defined at `apiIngress.hostname` parameter - ## TLS certificates will be retrieved from a TLS secret with name: `{{- printf "%s-tls" .Values.apiIngress.hostname }}` - ## You can: - ## - Use the `ingress.secrets` parameter to create this TLS secret - ## - Rely on cert-manager to create it by setting the corresponding annotations - ## - Rely on Helm to create self-signed certificates by setting `ingress.selfSigned=true` - ## - tls: false - ## @param apiIngress.selfSigned Create a TLS secret for this ingress record using self-signed certificates generated by Helm - ## - selfSigned: false - ## @param apiIngress.extraHosts The list of additional hostnames to be covered with this ingress record. - ## Most likely the hostname above will be enough, but in the event more hosts are needed, this is an array - ## e.g: - ## extraHosts: - ## - name: minio.local - ## path: / - ## - extraHosts: [] - ## @param apiIngress.extraPaths Any additional paths that may need to be added to the ingress under the main host - ## For example: The ALB ingress controller requires a special rule for handling SSL redirection. - ## extraPaths: - ## - path: /* - ## backend: - ## serviceName: ssl-redirect - ## servicePort: use-annotation - ## - extraPaths: [] - ## @param apiIngress.extraTls The tls configuration for additional hostnames to be covered with this ingress record. - ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls - ## e.g: - ## extraTls: - ## - hosts: - ## - minio.local - ## secretName: minio.local-tls - ## - extraTls: [] - ## @param apiIngress.secrets If you're providing your own certificates, please use this to add the certificates as secrets - ## key and certificate are expected in PEM format - ## name should line up with a secretName set further up - ## - ## If it is not set and you're using cert-manager, this is unneeded, as it will create a secret for you with valid certificates - ## If it is not set and you're NOT using cert-manager either, self-signed certificates will be created valid for 365 days - ## It is also possible to create and manage the certificates outside of this helm chart - ## Please see README.md for more information - ## - ## Example - ## secrets: - ## - name: minio.local-tls - ## key: "" - ## certificate: "" - ## - secrets: [] - ## @param apiIngress.extraRules Additional rules to be covered with this ingress record - ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-rules - ## e.g: - ## extraRules: - ## - host: example.local - ## http: - ## path: / - ## backend: - ## service: - ## name: example-svc - ## port: - ## name: http - ## - extraRules: [] -## NetworkPolicy parameters -## -networkPolicy: - ## @param networkPolicy.enabled Enable the default NetworkPolicy policy - ## - enabled: false - ## @param networkPolicy.allowExternal Don't require client label for connections - ## When set to false, only pods with the correct client label will have network access to the port MinIO® is - ## listening on. When true, MinIO® will accept connections from any source (with the correct destination port). - ## - allowExternal: true - ## @param networkPolicy.extraFromClauses Allows to add extra 'from' clauses to the NetworkPolicy - extraFromClauses: [] - ## Example - ## extraFromClauses: - ## - podSelector: - ## matchLabels: - ## a: b - -## @section Persistence parameters - -## Enable persistence using Persistent Volume Claims -## ref: https://kubernetes.io/docs/user-guide/persistent-volumes/ -## -persistence: - ## @param persistence.enabled Enable MinIO® data persistence using PVC. If false, use emptyDir - ## - enabled: true - ## @param persistence.storageClass PVC Storage Class for MinIO® data volume - ## 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: "gp2" - ## @param persistence.mountPath Data volume mount path - ## - mountPath: /data - ## @param persistence.accessModes PVC Access Modes for MinIO® data volume - ## - accessModes: - - ReadWriteOnce - ## @param persistence.size PVC Storage Request for MinIO® data volume - ## - size: 8Gi - ## @param persistence.annotations Annotations for the PVC - ## - annotations: {} - ## @param persistence.existingClaim Name of an existing PVC to use (only in `standalone` mode) - ## - existingClaim: "" - -## @section Volume Permissions parameters - -## Init containers parameters: -## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section. -## -volumePermissions: - ## @param volumePermissions.enabled Enable init container that changes the owner and group of the persistent volume(s) mountpoint to `runAsUser:fsGroup` - ## - enabled: false - ## @param volumePermissions.image.registry Init container volume-permissions image registry - ## @param volumePermissions.image.repository Init container volume-permissions image repository - ## @param volumePermissions.image.tag Init container volume-permissions image tag (immutable tags are recommended) - ## @param volumePermissions.image.digest Init container volume-permissions image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag - ## @param volumePermissions.image.pullPolicy Init container volume-permissions image pull policy - ## @param volumePermissions.image.pullSecrets Specify docker-registry secret names as an array - ## - image: - registry: docker.io - repository: bitnami/os-shell - tag: 11-debian-11-r11 - digest: "" - 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/ - ## e.g: - ## pullSecrets: - ## - myRegistryKeySecretName - ## - pullSecrets: [] - ## Init container' resource requests and limits - ## ref: https://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - ## @param volumePermissions.resources.limits Init container volume-permissions resource limits - ## @param volumePermissions.resources.requests Init container volume-permissions resource requests - ## - resources: - ## Example: - ## limits: - ## cpu: 500m - ## memory: 1Gi - limits: {} - requests: {} - ## Init container' Security Context - ## Note: the chown of the data folder is done to containerSecurityContext.runAsUser - ## and not the below volumePermissions.containerSecurityContext.runAsUser - ## @param volumePermissions.containerSecurityContext.runAsUser User ID for the init container - ## - containerSecurityContext: - runAsUser: 0 - -## @section RBAC parameters - -## Specifies whether a ServiceAccount should be created -## -serviceAccount: - ## @param serviceAccount.create Enable the creation of a ServiceAccount for MinIO® pods - ## - create: true - ## @param serviceAccount.name Name of the created ServiceAccount - ## If not set and create is true, a name is generated using the common.names.fullname template - ## - name: "minio-sa" - ## @param serviceAccount.automountServiceAccountToken Enable/disable auto mounting of the service account token - ## - automountServiceAccountToken: true - ## @param serviceAccount.annotations Custom annotations for MinIO® ServiceAccount - ## - annotations: {} - -## @section Other parameters - -## MinIO® Pod Disruption Budget configuration in distributed mode. -## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ -## -pdb: - ## @param pdb.create Enable/disable a Pod Disruption Budget creation - ## - create: false - ## @param pdb.minAvailable Minimum number/percentage of pods that must still be available after the eviction - ## - minAvailable: 1 - ## @param pdb.maxUnavailable Maximum number/percentage of pods that may be made unavailable after the eviction - ## - maxUnavailable: "" - -## @section Metrics parameters - -metrics: - ## @param metrics.prometheusAuthType Authentication mode for Prometheus (`jwt` or `public`) - ## To allow public access without authentication for prometheus metrics set environment as follows. - ## - prometheusAuthType: public - ## Prometheus Operator ServiceMonitor configuration - ## - serviceMonitor: - ## @param metrics.serviceMonitor.enabled If the operator is installed in your cluster, set to true to create a Service Monitor Entry - ## - enabled: true - ## @param metrics.serviceMonitor.namespace Namespace which Prometheus is running in - ## - namespace: "" - ## @param metrics.serviceMonitor.labels Extra labels for the ServiceMonitor - ## - labels: {} - ## @param metrics.serviceMonitor.jobLabel The name of the label on the target service to use as the job name in Prometheus - ## - jobLabel: "" - ## @param metrics.serviceMonitor.path HTTP path to scrape for metrics - ## - path: /minio/v2/metrics/cluster - ## @param metrics.serviceMonitor.interval Interval at which metrics should be scraped - ## - interval: 30s - ## @param metrics.serviceMonitor.scrapeTimeout Specify the timeout after which the scrape is ended - ## e.g: - ## scrapeTimeout: 30s - scrapeTimeout: "" - ## @param metrics.serviceMonitor.metricRelabelings MetricRelabelConfigs to apply to samples before ingestion - ## - metricRelabelings: [] - ## @param metrics.serviceMonitor.relabelings Metrics relabelings to add to the scrape endpoint, applied before scraping - ## - relabelings: [] - ## @param metrics.serviceMonitor.honorLabels Specify honorLabels parameter to add the scrape endpoint - ## - honorLabels: false - ## @param metrics.serviceMonitor.selector Prometheus instance selector labels - ## ref: https://github.com/bitnami/charts/tree/main/bitnami/prometheus-operator#prometheus-configuration - ## - selector: {} - ## @param metrics.serviceMonitor.apiVersion ApiVersion for the serviceMonitor Resource (defaults to "monitoring.coreos.com/v1") - apiVersion: "" - - ## Prometheus Operator PrometheusRule configuration - ## - prometheusRule: - ## @param metrics.prometheusRule.enabled Create a Prometheus Operator PrometheusRule (also requires `metrics.enabled` to be `true` and `metrics.prometheusRule.rules`) - ## - enabled: true - ## @param metrics.prometheusRule.namespace Namespace for the PrometheusRule Resource (defaults to the Release Namespace) - ## - namespace: "" - ## @param metrics.prometheusRule.additionalLabels Additional labels that can be used so PrometheusRule will be discovered by Prometheus - ## - additionalLabels: {} - ## @param metrics.prometheusRule.rules Prometheus Rule definitions - # - alert: minio cluster nodes offline - # annotations: - # summary: "minio cluster nodes offline" - # description: "minio cluster nodes offline, pod {{`{{`}} $labels.pod {{`}}`}} service {{`{{`}} $labels.job {{`}}`}} offline" - # for: 10m - # expr: minio_cluster_nodes_offline_total > 0 - # labels: - # severity: critical - # group: PaaS - ## - rules: []