forked from kubecost/cost-analyzer-helm-chart
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 5bd20c0
Showing
31 changed files
with
1,417 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# kubecost-quickstart | ||
Quickly install kube-state-metrics, prometheus, and grafana on your cluster with helm. Requires a helm installation. | ||
|
||
> kubectl apply -f helm.yaml | ||
Sets up a suggestion for roles for your helm service. | ||
|
||
Once the roles have been set up, navigate to the kubecost-quickstart home directory and run | ||
|
||
> helm install cost-analyzer --name cost-analyzer --namespace monitoring | ||
View the dashboard locally with | ||
|
||
> kubectl port-forward --namespace monitoring deployment/cost-analyzer-grafana 3000 | ||
Sample Cluster Dashboard Here: | ||
|
||
![Sample Dashboard](https://cdn-images-1.medium.com/max/800/1*rQI3-gKtgKwHSs7JgIdorw.png) | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
apiVersion: v1 | ||
appVersion: "1.0" | ||
description: A Helm chart that sets up Prometheus and Grafana to monitor cloud costs. | ||
name: cost-analyzer | ||
version: 0.1.0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
appVersion: 5.3.1 | ||
description: The leading tool for querying and visualizing time series and metrics. | ||
engine: gotpl | ||
home: https://grafana.net | ||
icon: https://raw.githubusercontent.com/grafana/grafana/master/public/img/logo_transparent_400x.png | ||
kubeVersion: ^1.8.0-0 | ||
maintainers: | ||
- email: [email protected] | ||
name: zanhsieh | ||
- email: [email protected] | ||
name: rtluckie | ||
name: grafana | ||
sources: | ||
- https://github.com/grafana/grafana | ||
version: 1.17.2 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,162 @@ | ||
# Grafana Helm Chart | ||
|
||
* Installs the web dashboarding system [Grafana](http://grafana.org/) | ||
|
||
## TL;DR; | ||
|
||
```console | ||
$ helm install stable/grafana | ||
``` | ||
|
||
## Installing the Chart | ||
|
||
To install the chart with the release name `my-release`: | ||
|
||
```console | ||
$ helm install --name my-release stable/grafana | ||
``` | ||
|
||
## Uninstalling the Chart | ||
|
||
To uninstall/delete the my-release deployment: | ||
|
||
```console | ||
$ helm delete my-release | ||
``` | ||
|
||
The command removes all the Kubernetes components associated with the chart and deletes the release. | ||
|
||
|
||
## Configuration | ||
|
||
| Parameter | Description | Default | | ||
|---------------------------------|-----------------------------------------------|---------------------------------------------------------| | ||
| `replicas` | Number of nodes | `1` | | ||
| `deploymentStrategy` | Deployment strategy | `RollingUpdate` | | ||
| `livenessProbe` | Liveness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } "initialDelaySeconds": 60, "timeoutSeconds": 30, "failureThreshold": 10 }` | | ||
| `readinessProbe` | Rediness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } }`| | ||
| `securityContext` | Deployment securityContext | `{"runAsUser": 472, "fsGroup": 472}` | | ||
| `image.repository` | Image repository | `grafana/grafana` | | ||
| `image.tag` | Image tag. (`Must be >= 5.0.0`) | `5.3.1` | | ||
| `image.pullPolicy` | Image pull policy | `IfNotPresent` | | ||
| `service.type` | Kubernetes service type | `ClusterIP` | | ||
| `service.port` | Kubernetes port where service is exposed | `80` | | ||
| `service.annotations` | Service annotations | `{}` | | ||
| `service.labels` | Custom labels | `{}` | | ||
| `ingress.enabled` | Enables Ingress | `false` | | ||
| `ingress.annotations` | Ingress annotations | `{}` | | ||
| `ingress.labels` | Custom labels | `{}` | | ||
| `ingress.hosts` | Ingress accepted hostnames | `[]` | | ||
| `ingress.tls` | Ingress TLS configuration | `[]` | | ||
| `resources` | CPU/Memory resource requests/limits | `{}` | | ||
| `nodeSelector` | Node labels for pod assignment | `{}` | | ||
| `tolerations` | Toleration labels for pod assignment | `[]` | | ||
| `affinity` | Affinity settings for pod assignment | `{}` | | ||
| `persistence.enabled` | Use persistent volume to store data | `false` | | ||
| `persistence.size` | Size of persistent volume claim | `10Gi` | | ||
| `persistence.existingClaim` | Use an existing PVC to persist data | `nil` | | ||
| `persistence.storageClassName` | Type of persistent volume claim | `nil` | | ||
| `persistence.accessModes` | Persistence access modes | `[]` | | ||
| `persistence.subPath` | Mount a sub dir of the persistent volume | `""` | | ||
| `schedulerName` | Alternate scheduler name | `nil` | | ||
| `env` | Extra environment variables passed to pods | `{}` | | ||
| `envFromSecret` | Name of a Kubenretes secret (must be manually created in the same namespace) containing values to be added to the environment | `""` | | ||
| `extraSecretMounts` | Additional grafana server secret mounts | `[]` | | ||
| `plugins` | Plugins to be loaded along with Grafana | `[]` | | ||
| `datasources` | Configure grafana datasources | `{}` | | ||
| `dashboardProviders` | Configure grafana dashboard providers | `{}` | | ||
| `dashboards` | Dashboards to import | `{}` | | ||
| `dashboardsConfigMaps` | ConfigMaps reference that contains dashboards | `{}` | | ||
| `grafana.ini` | Grafana's primary configuration | `{}` | | ||
| `ldap.existingSecret` | The name of an existing secret containing the `ldap.toml` file, this must have the key `ldap-toml`. | `""` | | ||
| `ldap.config ` | Grafana's LDAP configuration | `""` | | ||
| `annotations` | Deployment annotations | `{}` | | ||
| `podAnnotations` | Pod annotations | `{}` | | ||
| `sidecar.dashboards.enabled` | Enabled the cluster wide search for dashboards and adds/updates/deletes them in grafana | `false` | | ||
| `sidecar.dashboards.label` | Label that config maps with dashboards should have to be added | `false` | | ||
| `sidecar.datasources.enabled` | Enabled the cluster wide search for datasources and adds/updates/deletes them in grafana |`false` | | ||
| `sidecar.datasources.label` | Label that config maps with datasources should have to be added | `false` | | ||
| `smtp.existingSecret` | The name of an existing secret containing the SMTP credentials, this must have the keys `user` and `password`. | `""` | | ||
|
||
## Sidecar for dashboards | ||
|
||
If the parameter `sidecar.dashboards.enabled` is set, a sidecar container is deployed in the grafana pod. This container watches all config maps in the cluster and filters out the ones with a label as defined in `sidecar.dashboards.label`. The files defined in those configmaps are written to a folder and accessed by grafana. Changes to the configmaps are monitored and the imported dashboards are deleted/updated. A recommendation is to use one configmap per dashboard, as an reduction of multiple dashboards inside one configmap is currently not properly mirrored in grafana. | ||
Example dashboard config: | ||
``` | ||
apiVersion: v1 | ||
kind: ConfigMap | ||
metadata: | ||
name: sample-grafana-dashboard | ||
labels: | ||
grafana_dashboard: 1 | ||
data: | ||
k8s-dashboard.json: |- | ||
[...] | ||
``` | ||
|
||
## Sidecar for datasources | ||
|
||
If the parameter `sidecar.datasource.enabled` is set, a sidecar container is deployed in the grafana pod. This container watches all config maps in the cluster and filters out the ones with a label as defined in `sidecar.datasources.label`. The files defined in those configmaps are written to a folder and accessed by grafana on startup. Using these yaml files, the data sources in grafana can be modified. | ||
|
||
Example datasource config adapted from [Grafana](http://docs.grafana.org/administration/provisioning/#example-datasource-config-file): | ||
``` | ||
apiVersion: v1 | ||
kind: ConfigMap | ||
metadata: | ||
name: sample-grafana-datasource | ||
labels: | ||
grafana_datasource: 1 | ||
data: | ||
datasource.yaml: |- | ||
# config file version | ||
apiVersion: 1 | ||
# list of datasources that should be deleted from the database | ||
deleteDatasources: | ||
- name: Graphite | ||
orgId: 1 | ||
# list of datasources to insert/update depending | ||
# whats available in the database | ||
datasources: | ||
# <string, required> name of the datasource. Required | ||
- name: Graphite | ||
# <string, required> datasource type. Required | ||
type: graphite | ||
# <string, required> access mode. proxy or direct (Server or Browser in the UI). Required | ||
access: proxy | ||
# <int> org id. will default to orgId 1 if not specified | ||
orgId: 1 | ||
# <string> url | ||
url: http://localhost:8080 | ||
# <string> database password, if used | ||
password: | ||
# <string> database user, if used | ||
user: | ||
# <string> database name, if used | ||
database: | ||
# <bool> enable/disable basic auth | ||
basicAuth: | ||
# <string> basic auth username | ||
basicAuthUser: | ||
# <string> basic auth password | ||
basicAuthPassword: | ||
# <bool> enable/disable with credentials headers | ||
withCredentials: | ||
# <bool> mark as default datasource. Max one per org | ||
isDefault: | ||
# <map> fields that will be converted to json and stored in json_data | ||
jsonData: | ||
graphiteVersion: "1.1" | ||
tlsAuth: true | ||
tlsAuthWithCACert: true | ||
# <string> json object of data that will be encrypted. | ||
secureJsonData: | ||
tlsCACert: "..." | ||
tlsClientCert: "..." | ||
tlsClientKey: "..." | ||
version: 1 | ||
# <bool> allow users to edit datasources from the UI. | ||
editable: false | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
1. Get your '{{ .Values.adminUser }}' user password by running: | ||
|
||
kubectl get secret --namespace {{ .Release.Namespace }} {{ template "grafana.fullname" . }} -o jsonpath="{.data.admin-password}" | base64 --decode ; echo | ||
|
||
2. The Grafana server can be accessed via port {{ .Values.service.port }} on the following DNS name from within your cluster: | ||
|
||
{{ template "grafana.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local | ||
{{ if .Values.ingress.enabled }} | ||
From outside the cluster, the server URL(s) are: | ||
{{- range .Values.ingress.hosts }} | ||
http://{{ . }} | ||
{{- end }} | ||
{{ else }} | ||
Get the Grafana URL to visit by running these commands in the same shell: | ||
{{ if contains "NodePort" .Values.service.type -}} | ||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "grafana.fullname" . }}) | ||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") | ||
echo http://$NODE_IP:$NODE_PORT | ||
{{ else if contains "LoadBalancer" .Values.service.type -}} | ||
NOTE: It may take a few minutes for the LoadBalancer IP to be available. | ||
You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "grafana.fullname" . }}' | ||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "grafana.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') | ||
http://$SERVICE_IP:{{ .Values.service.port -}} | ||
{{ else if contains "ClusterIP" .Values.service.type }} | ||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "grafana.fullname" . }},component={{ .Values.name }}" -o jsonpath="{.items[0].metadata.name}") | ||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 3000 | ||
{{- end }} | ||
{{- end }} | ||
|
||
3. Login with the password from step 1 and the username: {{ .Values.adminUser }} | ||
|
||
{{- if not .Values.persistence.enabled }} | ||
################################################################################# | ||
###### WARNING: Persistence is disabled!!! You will lose your data when ##### | ||
###### the Grafana pod is terminated. ##### | ||
################################################################################# | ||
{{- end }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
{{/* vim: set filetype=mustache: */}} | ||
{{/* | ||
Expand the name of the chart. | ||
*/}} | ||
{{- define "grafana.name" -}} | ||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} | ||
{{- end -}} | ||
|
||
{{/* | ||
Create a default fully qualified app name. | ||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). | ||
If release name contains chart name it will be used as a full name. | ||
*/}} | ||
{{- define "grafana.fullname" -}} | ||
{{- if .Values.fullnameOverride -}} | ||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} | ||
{{- else -}} | ||
{{- $name := default .Chart.Name .Values.nameOverride -}} | ||
{{- if contains $name .Release.Name -}} | ||
{{- .Release.Name | trunc 63 | trimSuffix "-" -}} | ||
{{- else -}} | ||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} | ||
{{- end -}} | ||
{{- end -}} | ||
{{- end -}} | ||
|
||
{{/* | ||
Create chart name and version as used by the chart label. | ||
*/}} | ||
{{- define "grafana.chart" -}} | ||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} | ||
{{- end -}} | ||
|
||
{{/* | ||
Create the name of the service account | ||
*/}} | ||
{{- define "grafana.serviceAccountName" -}} | ||
{{- if .Values.serviceAccount.create -}} | ||
{{ default (include "grafana.fullname" .) .Values.serviceAccount.name }} | ||
{{- else -}} | ||
{{ default "default" .Values.serviceAccount.name }} | ||
{{- end -}} | ||
{{- end -}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
{{- if .Values.rbac.create }} | ||
kind: ClusterRole | ||
apiVersion: rbac.authorization.k8s.io/v1 | ||
metadata: | ||
labels: | ||
app: {{ template "grafana.name" . }} | ||
chart: {{ template "grafana.chart" . }} | ||
release: {{ .Release.Name }} | ||
heritage: {{ .Release.Service }} | ||
{{- with .Values.annotations }} | ||
annotations: | ||
{{ toYaml . | indent 4 }} | ||
{{- end }} | ||
name: {{ template "grafana.fullname" . }}-clusterrole | ||
{{- if or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled }} | ||
rules: | ||
- apiGroups: [""] # "" indicates the core API group | ||
resources: ["configmaps"] | ||
verbs: ["get", "watch", "list"] | ||
{{- else }} | ||
rules: [] | ||
{{- end}} | ||
{{- end}} |
23 changes: 23 additions & 0 deletions
23
cost-analyzer/charts/grafana/templates/clusterrolebinding.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
{{- if .Values.rbac.create }} | ||
kind: ClusterRoleBinding | ||
apiVersion: rbac.authorization.k8s.io/v1 | ||
metadata: | ||
name: {{ template "grafana.fullname" . }}-clusterrolebinding | ||
labels: | ||
app: {{ template "grafana.name" . }} | ||
chart: {{ template "grafana.chart" . }} | ||
release: {{ .Release.Name }} | ||
heritage: {{ .Release.Service }} | ||
{{- with .Values.annotations }} | ||
annotations: | ||
{{ toYaml . | indent 4 }} | ||
{{- end }} | ||
subjects: | ||
- kind: ServiceAccount | ||
name: {{ template "grafana.serviceAccountName" . }} | ||
namespace: {{ .Release.Namespace }} | ||
roleRef: | ||
kind: ClusterRole | ||
name: {{ template "grafana.fullname" . }}-clusterrole | ||
apiGroup: rbac.authorization.k8s.io | ||
{{- end}} |
26 changes: 26 additions & 0 deletions
26
cost-analyzer/charts/grafana/templates/configmap-dashboard-provider.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
{{- if .Values.sidecar.dashboards.enabled }} | ||
apiVersion: v1 | ||
kind: ConfigMap | ||
metadata: | ||
labels: | ||
app: {{ template "grafana.name" . }} | ||
chart: {{ template "grafana.chart" . }} | ||
release: {{ .Release.Name }} | ||
heritage: {{ .Release.Service }} | ||
{{- with .Values.annotations }} | ||
annotations: | ||
{{ toYaml . | indent 4 }} | ||
{{- end }} | ||
name: {{ template "grafana.fullname" . }}-config-dashboards | ||
data: | ||
provider.yaml: |- | ||
apiVersion: 1 | ||
providers: | ||
- name: 'default' | ||
orgId: 1 | ||
folder: '' | ||
type: file | ||
disableDeletion: false | ||
options: | ||
path: {{ .Values.sidecar.dashboards.folder }} | ||
{{- end}} |
Oops, something went wrong.